From cf914f6d5627309bac83fd841f3390ce5b77c916 Mon Sep 17 00:00:00 2001 From: Sebastian Andrzej Siewior Date: Sat, 16 Oct 2021 10:49:02 +0200 Subject: [PATCH 038/166] gen_stats: Add instead Set the value in __gnet_stats_copy_basic(). __gnet_stats_copy_basic() always assigns the value to the bstats argument overwriting the previous value. The later added per-CPU version always accumulated the values in the returning gnet_stats_basic_packed argument. Based on review there are five users of that function as of today: - est_fetch_counters(), ___gnet_stats_copy_basic() memsets() bstats to zero, single invocation. - mq_dump(), mqprio_dump(), mqprio_dump_class_stats() memsets() bstats to zero, multiple invocation but does not use the function due to !qdisc_is_percpu_stats(). Add the values in __gnet_stats_copy_basic() instead overwriting. Rename the function to gnet_stats_add_basic() to make it more obvious. Signed-off-by: Sebastian Andrzej Siewior Signed-off-by: David S. Miller --- include/net/gen_stats.h | 8 ++++---- net/core/gen_estimator.c | 2 +- net/core/gen_stats.c | 29 ++++++++++++++++------------- net/sched/sch_mq.c | 5 ++--- net/sched/sch_mqprio.c | 11 +++++------ 5 files changed, 28 insertions(+), 27 deletions(-) Index: linux-5.15.32-rt39/include/net/gen_stats.h =================================================================== --- linux-5.15.32-rt39.orig/include/net/gen_stats.h +++ linux-5.15.32-rt39/include/net/gen_stats.h @@ -46,10 +46,10 @@ int gnet_stats_copy_basic(const seqcount struct gnet_dump *d, struct gnet_stats_basic_cpu __percpu *cpu, struct gnet_stats_basic_packed *b); -void __gnet_stats_copy_basic(const seqcount_t *running, - struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b); +void gnet_stats_add_basic(const seqcount_t *running, + struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b); int gnet_stats_copy_basic_hw(const seqcount_t *running, struct gnet_dump *d, struct gnet_stats_basic_cpu __percpu *cpu, Index: linux-5.15.32-rt39/net/core/gen_estimator.c =================================================================== --- linux-5.15.32-rt39.orig/net/core/gen_estimator.c +++ linux-5.15.32-rt39/net/core/gen_estimator.c @@ -66,7 +66,7 @@ static void est_fetch_counters(struct ne if (e->stats_lock) spin_lock(e->stats_lock); - __gnet_stats_copy_basic(e->running, b, e->cpu_bstats, e->bstats); + gnet_stats_add_basic(e->running, b, e->cpu_bstats, e->bstats); if (e->stats_lock) spin_unlock(e->stats_lock); Index: linux-5.15.32-rt39/net/core/gen_stats.c =================================================================== --- linux-5.15.32-rt39.orig/net/core/gen_stats.c +++ linux-5.15.32-rt39/net/core/gen_stats.c @@ -114,9 +114,8 @@ gnet_stats_start_copy(struct sk_buff *sk } EXPORT_SYMBOL(gnet_stats_start_copy); -static void -__gnet_stats_copy_basic_cpu(struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu) +static void gnet_stats_add_basic_cpu(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu) { int i; @@ -136,26 +135,30 @@ __gnet_stats_copy_basic_cpu(struct gnet_ } } -void -__gnet_stats_copy_basic(const seqcount_t *running, - struct gnet_stats_basic_packed *bstats, - struct gnet_stats_basic_cpu __percpu *cpu, - struct gnet_stats_basic_packed *b) +void gnet_stats_add_basic(const seqcount_t *running, + struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b) { unsigned int seq; + u64 bytes = 0; + u64 packets = 0; if (cpu) { - __gnet_stats_copy_basic_cpu(bstats, cpu); + gnet_stats_add_basic_cpu(bstats, cpu); return; } do { if (running) seq = read_seqcount_begin(running); - bstats->bytes = b->bytes; - bstats->packets = b->packets; + bytes = b->bytes; + packets = b->packets; } while (running && read_seqcount_retry(running, seq)); + + bstats->bytes += bytes; + bstats->packets += packets; } -EXPORT_SYMBOL(__gnet_stats_copy_basic); +EXPORT_SYMBOL(gnet_stats_add_basic); static int ___gnet_stats_copy_basic(const seqcount_t *running, @@ -166,7 +169,7 @@ ___gnet_stats_copy_basic(const seqcount_ { struct gnet_stats_basic_packed bstats = {0}; - __gnet_stats_copy_basic(running, &bstats, cpu, b); + gnet_stats_add_basic(running, &bstats, cpu, b); if (d->compat_tc_stats && type == TCA_STATS_BASIC) { d->tc_stats.bytes = bstats.bytes; Index: linux-5.15.32-rt39/net/sched/sch_mq.c =================================================================== --- linux-5.15.32-rt39.orig/net/sched/sch_mq.c +++ linux-5.15.32-rt39/net/sched/sch_mq.c @@ -170,9 +170,8 @@ static int mq_dump(struct Qdisc *sch, st if (qdisc_is_percpu_stats(qdisc)) { qlen = qdisc_qlen_sum(qdisc); - __gnet_stats_copy_basic(NULL, &sch->bstats, - qdisc->cpu_bstats, - &qdisc->bstats); + gnet_stats_add_basic(NULL, &sch->bstats, + qdisc->cpu_bstats, &qdisc->bstats); __gnet_stats_copy_queue(&sch->qstats, qdisc->cpu_qstats, &qdisc->qstats, qlen); Index: linux-5.15.32-rt39/net/sched/sch_mqprio.c =================================================================== --- linux-5.15.32-rt39.orig/net/sched/sch_mqprio.c +++ linux-5.15.32-rt39/net/sched/sch_mqprio.c @@ -427,9 +427,8 @@ static int mqprio_dump(struct Qdisc *sch if (qdisc_is_percpu_stats(qdisc)) { __u32 qlen = qdisc_qlen_sum(qdisc); - __gnet_stats_copy_basic(NULL, &sch->bstats, - qdisc->cpu_bstats, - &qdisc->bstats); + gnet_stats_add_basic(NULL, &sch->bstats, + qdisc->cpu_bstats, &qdisc->bstats); __gnet_stats_copy_queue(&sch->qstats, qdisc->cpu_qstats, &qdisc->qstats, qlen); @@ -557,9 +556,9 @@ static int mqprio_dump_class_stats(struc if (qdisc_is_percpu_stats(qdisc)) { qlen = qdisc_qlen_sum(qdisc); - __gnet_stats_copy_basic(NULL, &bstats, - qdisc->cpu_bstats, - &qdisc->bstats); + gnet_stats_add_basic(NULL, &bstats, + qdisc->cpu_bstats, + &qdisc->bstats); __gnet_stats_copy_queue(&qstats, qdisc->cpu_qstats, &qdisc->qstats,