netdev
[Top] [All Lists]

[RESEND 16/16] ATM: Use gnet_stats for class statistics and dump them

To: "David S. Miller" <davem@xxxxxxxxxxxxx>
Subject: [RESEND 16/16] ATM: Use gnet_stats for class statistics and dump them
From: Thomas Graf <tgraf@xxxxxxx>
Date: Thu, 21 Oct 2004 17:42:00 +0200
Cc: netdev@xxxxxxxxxxx, hadi@xxxxxxxxxx
In-reply-to: <20041021125201.GU21977@postel.suug.ch>
References: <20041021123209.GE21977@postel.suug.ch> <20041021125201.GU21977@postel.suug.ch>
Sender: netdev-bounce@xxxxxxxxxxx
Braindead as I am, I forgot to tell my text editor to write the file
before diffing it. This way an unused variable made it into the patch,
revised version:

Makes ATM qdisc use gnet_stats for class statistic counters and
adds dumping bits to actually dump those. Althought the counters
were updated they never got dumped to userspace.

Signed-off-by: Thomas Graf <tgraf@xxxxxxx>

--- linux-2.6.9-bk6.orig/net/sched/sch_atm.c    2004-10-21 17:30:11.000000000 
+0200
+++ linux-2.6.9-bk6/net/sched/sch_atm.c 2004-10-21 17:29:28.000000000 +0200
@@ -69,7 +69,8 @@
        struct socket           *sock;          /* for closing */
        u32                     classid;        /* x:y type ID */
        int                     ref;            /* reference count */
-       struct tc_stats         stats;
+       struct gnet_stats_basic bstats;
+       struct gnet_stats_queue qstats;
        spinlock_t              *stats_lock;
        struct atm_flow_data    *next;
        struct atm_flow_data    *excess;        /* flow for excess traffic;
@@ -450,13 +451,13 @@
 #endif
            (ret = flow->q->enqueue(skb,flow->q)) != 0) {
                sch->qstats.drops++;
-               if (flow) flow->stats.drops++;
+               if (flow) flow->qstats.drops++;
                return ret;
        }
        sch->bstats.bytes += skb->len;
        sch->bstats.packets++;
-       flow->stats.bytes += skb->len;
-       flow->stats.packets++;
+       flow->bstats.bytes += skb->len;
+       flow->bstats.packets++;
        /*
         * Okay, this may seem weird. We pretend we've dropped the packet if
         * it goes via ATM. The reason for this is that the outer qdisc
@@ -550,7 +551,7 @@
         sch->qstats.requeues++;
     } else {
                sch->qstats.drops++;
-               p->link.stats.drops++;
+               p->link.qstats.drops++;
        }
        return ret;
 }
@@ -666,6 +667,20 @@
        skb_trim(skb,b-skb->data);
        return -1;
 }
+static int
+atm_tc_dump_class_stats(struct Qdisc *sch, unsigned long arg,
+       struct gnet_dump *d)
+{
+       struct atm_flow_data *flow = (struct atm_flow_data *) arg;
+
+       flow->qstats.qlen = flow->q->q.qlen;
+
+       if (gnet_stats_copy_basic(d, &flow->bstats) < 0 ||
+           gnet_stats_copy_queue(d, &flow->qstats) < 0)
+               return -1;
+
+       return 0;
+}
 
 static int atm_tc_dump(struct Qdisc *sch, struct sk_buff *skb)
 {
@@ -684,6 +699,7 @@
        .bind_tcf       =       atm_tc_bind_filter,
        .unbind_tcf     =       atm_tc_put,
        .dump           =       atm_tc_dump_class,
+       .dump_stats     =       atm_tc_dump_class_stats,
 };
 
 static struct Qdisc_ops atm_qdisc_ops = {

<Prev in Thread] Current Thread [Next in Thread>