Commit b33e699f authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

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: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d0083d98
...@@ -13,6 +13,7 @@ enum { ...@@ -13,6 +13,7 @@ enum {
TCA_STATS_RATE_EST64, TCA_STATS_RATE_EST64,
TCA_STATS_PAD, TCA_STATS_PAD,
TCA_STATS_BASIC_HW, TCA_STATS_BASIC_HW,
TCA_STATS_PKT64,
__TCA_STATS_MAX, __TCA_STATS_MAX,
}; };
#define TCA_STATS_MAX (__TCA_STATS_MAX - 1) #define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
......
...@@ -175,12 +175,17 @@ ___gnet_stats_copy_basic(const seqcount_t *running, ...@@ -175,12 +175,17 @@ ___gnet_stats_copy_basic(const seqcount_t *running,
if (d->tail) { if (d->tail) {
struct gnet_stats_basic sb; struct gnet_stats_basic sb;
int res;
memset(&sb, 0, sizeof(sb)); memset(&sb, 0, sizeof(sb));
sb.bytes = bstats.bytes; sb.bytes = bstats.bytes;
sb.packets = bstats.packets; sb.packets = bstats.packets;
return gnet_stats_copy(d, type, &sb, sizeof(sb), res = gnet_stats_copy(d, type, &sb, sizeof(sb), TCA_STATS_PAD);
TCA_STATS_PAD); if (res < 0 || sb.packets == bstats.packets)
return res;
/* emit 64bit stats only if needed */
return gnet_stats_copy(d, TCA_STATS_PKT64, &bstats.packets,
sizeof(bstats.packets), TCA_STATS_PAD);
} }
return 0; return 0;
} }
......
...@@ -188,6 +188,8 @@ static size_t tcf_action_shared_attrs_size(const struct tc_action *act) ...@@ -188,6 +188,8 @@ static size_t tcf_action_shared_attrs_size(const struct tc_action *act)
+ nla_total_size(0) /* TCA_ACT_STATS nested */ + nla_total_size(0) /* TCA_ACT_STATS nested */
/* TCA_STATS_BASIC */ /* TCA_STATS_BASIC */
+ nla_total_size_64bit(sizeof(struct gnet_stats_basic)) + nla_total_size_64bit(sizeof(struct gnet_stats_basic))
/* TCA_STATS_PKT64 */
+ nla_total_size_64bit(sizeof(u64))
/* TCA_STATS_QUEUE */ /* TCA_STATS_QUEUE */
+ nla_total_size_64bit(sizeof(struct gnet_stats_queue)) + nla_total_size_64bit(sizeof(struct gnet_stats_queue))
+ nla_total_size(0) /* TCA_OPTIONS nested */ + nla_total_size(0) /* TCA_OPTIONS nested */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment