mq, mqprio: Use gnet_stats_add_queue().
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Sat, 16 Oct 2021 08:49:04 +0000 (10:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 18 Oct 2021 11:54:41 +0000 (12:54 +0100)
gnet_stats_add_basic() and gnet_stats_add_queue() add up the statistics
so they can be used directly for both the per-CPU and global case.

gnet_stats_add_queue() copies either Qdisc's per-CPU
gnet_stats_queue::qlen or the global member. The global
gnet_stats_queue::qlen isn't touched in the per-CPU case so there is no
need to consider it in the global-case.

In the per-CPU case, the sum of global gnet_stats_queue::qlen and
the per-CPU gnet_stats_queue::qlen was assigned to sch->q.qlen and
sch->qstats.qlen. Now both fields are copied individually.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_mq.c
net/sched/sch_mqprio.c

index 1edd98a..9d58ecb 100644 (file)
@@ -130,7 +130,6 @@ static int mq_dump(struct Qdisc *sch, struct sk_buff *skb)
        struct net_device *dev = qdisc_dev(sch);
        struct Qdisc *qdisc;
        unsigned int ntx;
-       __u32 qlen = 0;
 
        sch->q.qlen = 0;
        memset(&sch->bstats, 0, sizeof(sch->bstats));
@@ -145,24 +144,11 @@ static int mq_dump(struct Qdisc *sch, struct sk_buff *skb)
                qdisc = netdev_get_tx_queue(dev, ntx)->qdisc_sleeping;
                spin_lock_bh(qdisc_lock(qdisc));
 
-               if (qdisc_is_percpu_stats(qdisc)) {
-                       qlen = qdisc_qlen_sum(qdisc);
-                       gnet_stats_add_basic(NULL, &sch->bstats,
-                                            qdisc->cpu_bstats, &qdisc->bstats);
-                       __gnet_stats_copy_queue(&sch->qstats,
-                                               qdisc->cpu_qstats,
-                                               &qdisc->qstats, qlen);
-                       sch->q.qlen             += qlen;
-               } else {
-                       sch->q.qlen             += qdisc->q.qlen;
-                       sch->bstats.bytes       += qdisc->bstats.bytes;
-                       sch->bstats.packets     += qdisc->bstats.packets;
-                       sch->qstats.qlen        += qdisc->qstats.qlen;
-                       sch->qstats.backlog     += qdisc->qstats.backlog;
-                       sch->qstats.drops       += qdisc->qstats.drops;
-                       sch->qstats.requeues    += qdisc->qstats.requeues;
-                       sch->qstats.overlimits  += qdisc->qstats.overlimits;
-               }
+               gnet_stats_add_basic(NULL, &sch->bstats, qdisc->cpu_bstats,
+                                    &qdisc->bstats);
+               gnet_stats_add_queue(&sch->qstats, qdisc->cpu_qstats,
+                                    &qdisc->qstats);
+               sch->q.qlen += qdisc_qlen(qdisc);
 
                spin_unlock_bh(qdisc_lock(qdisc));
        }
index 4bae601..57427b4 100644 (file)
@@ -402,24 +402,11 @@ static int mqprio_dump(struct Qdisc *sch, struct sk_buff *skb)
                qdisc = netdev_get_tx_queue(dev, ntx)->qdisc_sleeping;
                spin_lock_bh(qdisc_lock(qdisc));
 
-               if (qdisc_is_percpu_stats(qdisc)) {
-                       __u32 qlen = qdisc_qlen_sum(qdisc);
-
-                       gnet_stats_add_basic(NULL, &sch->bstats,
-                                            qdisc->cpu_bstats, &qdisc->bstats);
-                       __gnet_stats_copy_queue(&sch->qstats,
-                                               qdisc->cpu_qstats,
-                                               &qdisc->qstats, qlen);
-                       sch->q.qlen             += qlen;
-               } else {
-                       sch->q.qlen             += qdisc->q.qlen;
-                       sch->bstats.bytes       += qdisc->bstats.bytes;
-                       sch->bstats.packets     += qdisc->bstats.packets;
-                       sch->qstats.backlog     += qdisc->qstats.backlog;
-                       sch->qstats.drops       += qdisc->qstats.drops;
-                       sch->qstats.requeues    += qdisc->qstats.requeues;
-                       sch->qstats.overlimits  += qdisc->qstats.overlimits;
-               }
+               gnet_stats_add_basic(NULL, &sch->bstats, qdisc->cpu_bstats,
+                                    &qdisc->bstats);
+               gnet_stats_add_queue(&sch->qstats, qdisc->cpu_qstats,
+                                    &qdisc->qstats);
+               sch->q.qlen += qdisc_qlen(qdisc);
 
                spin_unlock_bh(qdisc_lock(qdisc));
        }
@@ -511,7 +498,7 @@ static int mqprio_dump_class_stats(struct Qdisc *sch, unsigned long cl,
 {
        if (cl >= TC_H_MIN_PRIORITY) {
                int i;
-               __u32 qlen = 0;
+               __u32 qlen;
                struct gnet_stats_queue qstats = {0};
                struct gnet_stats_basic_packed bstats = {0};
                struct net_device *dev = qdisc_dev(sch);
@@ -531,27 +518,15 @@ static int mqprio_dump_class_stats(struct Qdisc *sch, unsigned long cl,
 
                        spin_lock_bh(qdisc_lock(qdisc));
 
-                       if (qdisc_is_percpu_stats(qdisc)) {
-                               qlen = qdisc_qlen_sum(qdisc);
-
-                               gnet_stats_add_basic(NULL, &bstats,
-                                                    qdisc->cpu_bstats,
-                                                    &qdisc->bstats);
-                               __gnet_stats_copy_queue(&qstats,
-                                                       qdisc->cpu_qstats,
-                                                       &qdisc->qstats,
-                                                       qlen);
-                       } else {
-                               qlen            += qdisc->q.qlen;
-                               bstats.bytes    += qdisc->bstats.bytes;
-                               bstats.packets  += qdisc->bstats.packets;
-                               qstats.backlog  += qdisc->qstats.backlog;
-                               qstats.drops    += qdisc->qstats.drops;
-                               qstats.requeues += qdisc->qstats.requeues;
-                               qstats.overlimits += qdisc->qstats.overlimits;
-                       }
+                       gnet_stats_add_basic(NULL, &bstats, qdisc->cpu_bstats,
+                                            &qdisc->bstats);
+                       gnet_stats_add_queue(&qstats, qdisc->cpu_qstats,
+                                            &qdisc->qstats);
+                       sch->q.qlen += qdisc_qlen(qdisc);
+
                        spin_unlock_bh(qdisc_lock(qdisc));
                }
+               qlen = qdisc_qlen(sch) + qstats.qlen;
 
                /* Reclaim root sleeping lock before completing stats */
                if (d->lock)