Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net_sched: add TCA_STATS_PKT64 attribute

Now the kernel uses 64bit packet counters in scheduler layer,
we want to export these counters to user space.

Instead risking breaking user space by adding fields
to struct gnet_stats_basic, add a new TCA_STATS_PKT64.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Eric Dumazet and committed by
David S. Miller
b33e699f d0083d98

+10 -2
+1
include/uapi/linux/gen_stats.h
··· 13 13 TCA_STATS_RATE_EST64, 14 14 TCA_STATS_PAD, 15 15 TCA_STATS_BASIC_HW, 16 + TCA_STATS_PKT64, 16 17 __TCA_STATS_MAX, 17 18 }; 18 19 #define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
+7 -2
net/core/gen_stats.c
··· 175 175 176 176 if (d->tail) { 177 177 struct gnet_stats_basic sb; 178 + int res; 178 179 179 180 memset(&sb, 0, sizeof(sb)); 180 181 sb.bytes = bstats.bytes; 181 182 sb.packets = bstats.packets; 182 - return gnet_stats_copy(d, type, &sb, sizeof(sb), 183 - TCA_STATS_PAD); 183 + res = gnet_stats_copy(d, type, &sb, sizeof(sb), TCA_STATS_PAD); 184 + if (res < 0 || sb.packets == bstats.packets) 185 + return res; 186 + /* emit 64bit stats only if needed */ 187 + return gnet_stats_copy(d, TCA_STATS_PKT64, &bstats.packets, 188 + sizeof(bstats.packets), TCA_STATS_PAD); 184 189 } 185 190 return 0; 186 191 }
+2
net/sched/act_api.c
··· 188 188 + nla_total_size(0) /* TCA_ACT_STATS nested */ 189 189 /* TCA_STATS_BASIC */ 190 190 + nla_total_size_64bit(sizeof(struct gnet_stats_basic)) 191 + /* TCA_STATS_PKT64 */ 192 + + nla_total_size_64bit(sizeof(u64)) 191 193 /* TCA_STATS_QUEUE */ 192 194 + nla_total_size_64bit(sizeof(struct gnet_stats_queue)) 193 195 + nla_total_size(0) /* TCA_OPTIONS nested */