struct gnet_stats_rate_est contains u32 fields, so the bytes per second field can wrap at 34360Mbit. Add a new gnet_stats_rate_est64 structure to get 64bit bps/pps fields, and switch the kernel to use this structure natively. This structure is dumped to user space as a new attribute : TCA_STATS_RATE_EST64 Old tc command will now display the capped bps (to 34360Mbit), instead of wrapped values, and updated tc command will display correct information. Old tc command output, after patch : eric:~# tc -s -d qd sh dev lo qdisc pfifo 8001: root refcnt 2 limit 1000p Sent 80868245400 bytes 1978837 pkt (dropped 0, overlimits 0 requeues 0) rate 34360Mbit 189696pps backlog 0b 0p requeues 0 This patch carefully reorganizes "struct Qdisc" layout to get optimal performance on SMP. Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef __LINUX_GEN_STATS_H
 | 
						|
#define __LINUX_GEN_STATS_H
 | 
						|
 | 
						|
#include <linux/types.h>
 | 
						|
 | 
						|
enum {
 | 
						|
	TCA_STATS_UNSPEC,
 | 
						|
	TCA_STATS_BASIC,
 | 
						|
	TCA_STATS_RATE_EST,
 | 
						|
	TCA_STATS_QUEUE,
 | 
						|
	TCA_STATS_APP,
 | 
						|
	TCA_STATS_RATE_EST64,
 | 
						|
	__TCA_STATS_MAX,
 | 
						|
};
 | 
						|
#define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
 | 
						|
 | 
						|
/**
 | 
						|
 * struct gnet_stats_basic - byte/packet throughput statistics
 | 
						|
 * @bytes: number of seen bytes
 | 
						|
 * @packets: number of seen packets
 | 
						|
 */
 | 
						|
struct gnet_stats_basic {
 | 
						|
	__u64	bytes;
 | 
						|
	__u32	packets;
 | 
						|
};
 | 
						|
struct gnet_stats_basic_packed {
 | 
						|
	__u64	bytes;
 | 
						|
	__u32	packets;
 | 
						|
} __attribute__ ((packed));
 | 
						|
 | 
						|
/**
 | 
						|
 * struct gnet_stats_rate_est - rate estimator
 | 
						|
 * @bps: current byte rate
 | 
						|
 * @pps: current packet rate
 | 
						|
 */
 | 
						|
struct gnet_stats_rate_est {
 | 
						|
	__u32	bps;
 | 
						|
	__u32	pps;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * struct gnet_stats_rate_est64 - rate estimator
 | 
						|
 * @bps: current byte rate
 | 
						|
 * @pps: current packet rate
 | 
						|
 */
 | 
						|
struct gnet_stats_rate_est64 {
 | 
						|
	__u64	bps;
 | 
						|
	__u64	pps;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * struct gnet_stats_queue - queuing statistics
 | 
						|
 * @qlen: queue length
 | 
						|
 * @backlog: backlog size of queue
 | 
						|
 * @drops: number of dropped packets
 | 
						|
 * @requeues: number of requeues
 | 
						|
 * @overlimits: number of enqueues over the limit
 | 
						|
 */
 | 
						|
struct gnet_stats_queue {
 | 
						|
	__u32	qlen;
 | 
						|
	__u32	backlog;
 | 
						|
	__u32	drops;
 | 
						|
	__u32	requeues;
 | 
						|
	__u32	overlimits;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * struct gnet_estimator - rate estimator configuration
 | 
						|
 * @interval: sampling period
 | 
						|
 * @ewma_log: the log of measurement window weight
 | 
						|
 */
 | 
						|
struct gnet_estimator {
 | 
						|
	signed char	interval;
 | 
						|
	unsigned char	ewma_log;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
#endif /* __LINUX_GEN_STATS_H */
 |