Merge branch 'net_sched-convert-packet-counters-to-64bit'
Eric Dumazet says: ==================== net_sched: convert packet counters to 64bit This small patch series add 64bit support for packet counts. Fact that the counters were still 32bit has been quite painful. tc -s -d qd sh dev eth0 | head -3 qdisc mq 1: root Sent 665706335338 bytes 6526520373 pkt (dropped 2441, overlimits 0 requeues 91) backlog 0b 0p requeues 91 ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
5ea4b122e7
|
@ -7,6 +7,12 @@
|
|||
#include <linux/rtnetlink.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
|
||||
/* Note: this used to be in include/uapi/linux/gen_stats.h */
|
||||
struct gnet_stats_basic_packed {
|
||||
__u64 bytes;
|
||||
__u64 packets;
|
||||
};
|
||||
|
||||
struct gnet_stats_basic_cpu {
|
||||
struct gnet_stats_basic_packed bstats;
|
||||
struct u64_stats_sync syncp;
|
||||
|
|
|
@ -13,6 +13,7 @@ enum {
|
|||
TCA_STATS_RATE_EST64,
|
||||
TCA_STATS_PAD,
|
||||
TCA_STATS_BASIC_HW,
|
||||
TCA_STATS_PKT64,
|
||||
__TCA_STATS_MAX,
|
||||
};
|
||||
#define TCA_STATS_MAX (__TCA_STATS_MAX - 1)
|
||||
|
@ -26,10 +27,6 @@ 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
|
||||
|
|
|
@ -123,8 +123,7 @@ __gnet_stats_copy_basic_cpu(struct gnet_stats_basic_packed *bstats,
|
|||
for_each_possible_cpu(i) {
|
||||
struct gnet_stats_basic_cpu *bcpu = per_cpu_ptr(cpu, i);
|
||||
unsigned int start;
|
||||
u64 bytes;
|
||||
u32 packets;
|
||||
u64 bytes, packets;
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin_irq(&bcpu->syncp);
|
||||
|
@ -176,12 +175,17 @@ ___gnet_stats_copy_basic(const seqcount_t *running,
|
|||
|
||||
if (d->tail) {
|
||||
struct gnet_stats_basic sb;
|
||||
int res;
|
||||
|
||||
memset(&sb, 0, sizeof(sb));
|
||||
sb.bytes = bstats.bytes;
|
||||
sb.packets = bstats.packets;
|
||||
return gnet_stats_copy(d, type, &sb, sizeof(sb),
|
||||
TCA_STATS_PAD);
|
||||
res = gnet_stats_copy(d, type, &sb, sizeof(sb), 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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
/* TCA_STATS_BASIC */
|
||||
+ nla_total_size_64bit(sizeof(struct gnet_stats_basic))
|
||||
/* TCA_STATS_PKT64 */
|
||||
+ nla_total_size_64bit(sizeof(u64))
|
||||
/* TCA_STATS_QUEUE */
|
||||
+ nla_total_size_64bit(sizeof(struct gnet_stats_queue))
|
||||
+ nla_total_size(0) /* TCA_OPTIONS nested */
|
||||
|
|
|
@ -35,7 +35,7 @@ static int tcf_simp_act(struct sk_buff *skb, const struct tc_action *a,
|
|||
* Example if this was the 3rd packet and the string was "hello"
|
||||
* then it would look like "hello_3" (without quotes)
|
||||
*/
|
||||
pr_info("simple: %s_%d\n",
|
||||
pr_info("simple: %s_%llu\n",
|
||||
(char *)d->tcfd_defdata, d->tcf_bstats.packets);
|
||||
spin_unlock(&d->tcf_lock);
|
||||
return d->tcf_action;
|
||||
|
|
Loading…
Reference in New Issue
Block a user