From ec22022467cb820d98842a2c9ac86bfa0676dbcb Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Thu, 21 Oct 2004 08:25:28 -0700 Subject: [PATCH] [PKT_SCHED]: Add dump_stats class op Adds a new class operation dump_stats which classes can use to dump statistics. Unlike in qdiscs, there are no common statistics therefore classes must dump all statistics on their own. The qdisc stats_lock is being used for locking. Signed-off-by: Thomas Graf Signed-off-by: David S. Miller --- include/net/pkt_sched.h | 1 + net/sched/sch_api.c | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 6bd1748ba3de3..357be232a46c9 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h @@ -42,6 +42,7 @@ struct Qdisc_class_ops /* rtnetlink specific */ int (*dump)(struct Qdisc *, unsigned long, struct sk_buff *skb, struct tcmsg*); + int (*dump_stats)(struct Qdisc *, unsigned long, struct gnet_dump *); }; struct module; diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index e60ed1234881a..4a1e9d237edc7 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -985,6 +985,8 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q, struct tcmsg *tcm; struct nlmsghdr *nlh; unsigned char *b = skb->tail; + struct gnet_dump d; + struct Qdisc_class_ops *cl_ops = q->ops->cl_ops; nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*tcm)); nlh->nlmsg_flags = flags; @@ -995,8 +997,19 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q, tcm->tcm_handle = q->handle; tcm->tcm_info = 0; RTA_PUT(skb, TCA_KIND, IFNAMSIZ, q->ops->id); - if (q->ops->cl_ops->dump && q->ops->cl_ops->dump(q, cl, skb, tcm) < 0) + if (cl_ops->dump && cl_ops->dump(q, cl, skb, tcm) < 0) + goto rtattr_failure; + + if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, + TCA_XSTATS, q->stats_lock, &d) < 0) goto rtattr_failure; + + if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0) + goto rtattr_failure; + + if (gnet_stats_finish_copy(&d) < 0) + goto rtattr_failure; + nlh->nlmsg_len = skb->tail - b; return skb->len; -- 2.53.0