aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched
diff options
context:
space:
mode:
authorJohn Fastabend <john.fastabend@gmail.com>2014-09-28 14:54:24 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-30 01:02:26 -0400
commitb0ab6f92752b9f9d8da980506e9df3bd9dcd7ed3 (patch)
treee8dc1bb9dc3bdce6a62b785b1828efded9f87205 /net/sched
parent6401585366326fc0ecbc372ec60d1a15cd8be2f5 (diff)
net: sched: enable per cpu qstats
After previous patches to simplify qstats the qstats can be made per cpu with a packed union in Qdisc struct. Signed-off-by: John Fastabend <john.r.fastabend@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched')
-rw-r--r--net/sched/act_api.c2
-rw-r--r--net/sched/sch_api.c12
-rw-r--r--net/sched/sch_atm.c2
-rw-r--r--net/sched/sch_cbq.c2
-rw-r--r--net/sched/sch_drr.c2
-rw-r--r--net/sched/sch_fq_codel.c2
-rw-r--r--net/sched/sch_hfsc.c2
-rw-r--r--net/sched/sch_htb.c2
-rw-r--r--net/sched/sch_mq.c2
-rw-r--r--net/sched/sch_mqprio.c5
-rw-r--r--net/sched/sch_multiq.c2
-rw-r--r--net/sched/sch_prio.c2
-rw-r--r--net/sched/sch_qfq.c3
-rw-r--r--net/sched/sch_sfq.c2
14 files changed, 26 insertions, 16 deletions
diff --git a/net/sched/act_api.c b/net/sched/act_api.c
index 2e134093b8ec..3d43e4979f27 100644
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@ -623,7 +623,7 @@ int tcf_action_copy_stats(struct sk_buff *skb, struct tc_action *a,
623 if (gnet_stats_copy_basic(&d, NULL, &p->tcfc_bstats) < 0 || 623 if (gnet_stats_copy_basic(&d, NULL, &p->tcfc_bstats) < 0 ||
624 gnet_stats_copy_rate_est(&d, &p->tcfc_bstats, 624 gnet_stats_copy_rate_est(&d, &p->tcfc_bstats,
625 &p->tcfc_rate_est) < 0 || 625 &p->tcfc_rate_est) < 0 ||
626 gnet_stats_copy_queue(&d, 626 gnet_stats_copy_queue(&d, NULL,
627 &p->tcfc_qstats, 627 &p->tcfc_qstats,
628 p->tcfc_qstats.qlen) < 0) 628 p->tcfc_qstats.qlen) < 0)
629 goto errout; 629 goto errout;
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index ca00ea8e84dc..aa8329508dba 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -947,6 +947,10 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue,
947 alloc_percpu(struct gnet_stats_basic_cpu); 947 alloc_percpu(struct gnet_stats_basic_cpu);
948 if (!sch->cpu_bstats) 948 if (!sch->cpu_bstats)
949 goto err_out4; 949 goto err_out4;
950
951 sch->cpu_qstats = alloc_percpu(struct gnet_stats_queue);
952 if (!sch->cpu_qstats)
953 goto err_out4;
950 } 954 }
951 955
952 if (tca[TCA_STAB]) { 956 if (tca[TCA_STAB]) {
@@ -995,6 +999,7 @@ err_out:
995 999
996err_out4: 1000err_out4:
997 free_percpu(sch->cpu_bstats); 1001 free_percpu(sch->cpu_bstats);
1002 free_percpu(sch->cpu_qstats);
998 /* 1003 /*
999 * Any broken qdiscs that would require a ops->reset() here? 1004 * Any broken qdiscs that would require a ops->reset() here?
1000 * The qdisc was never in action so it shouldn't be necessary. 1005 * The qdisc was never in action so it shouldn't be necessary.
@@ -1313,6 +1318,7 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid,
1313 u32 portid, u32 seq, u16 flags, int event) 1318 u32 portid, u32 seq, u16 flags, int event)
1314{ 1319{
1315 struct gnet_stats_basic_cpu __percpu *cpu_bstats = NULL; 1320 struct gnet_stats_basic_cpu __percpu *cpu_bstats = NULL;
1321 struct gnet_stats_queue __percpu *cpu_qstats = NULL;
1316 struct tcmsg *tcm; 1322 struct tcmsg *tcm;
1317 struct nlmsghdr *nlh; 1323 struct nlmsghdr *nlh;
1318 unsigned char *b = skb_tail_pointer(skb); 1324 unsigned char *b = skb_tail_pointer(skb);
@@ -1349,12 +1355,14 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid,
1349 if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0) 1355 if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0)
1350 goto nla_put_failure; 1356 goto nla_put_failure;
1351 1357
1352 if (qdisc_is_percpu_stats(q)) 1358 if (qdisc_is_percpu_stats(q)) {
1353 cpu_bstats = q->cpu_bstats; 1359 cpu_bstats = q->cpu_bstats;
1360 cpu_qstats = q->cpu_qstats;
1361 }
1354 1362
1355 if (gnet_stats_copy_basic(&d, cpu_bstats, &q->bstats) < 0 || 1363 if (gnet_stats_copy_basic(&d, cpu_bstats, &q->bstats) < 0 ||
1356 gnet_stats_copy_rate_est(&d, &q->bstats, &q->rate_est) < 0 || 1364 gnet_stats_copy_rate_est(&d, &q->bstats, &q->rate_est) < 0 ||
1357 gnet_stats_copy_queue(&d, &q->qstats, qlen) < 0) 1365 gnet_stats_copy_queue(&d, cpu_qstats, &q->qstats, qlen) < 0)
1358 goto nla_put_failure; 1366 goto nla_put_failure;
1359 1367
1360 if (gnet_stats_finish_copy(&d) < 0) 1368 if (gnet_stats_finish_copy(&d) < 0)
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c
index c145eb6279cc..e3e2cc5fd068 100644
--- a/net/sched/sch_atm.c
+++ b/net/sched/sch_atm.c
@@ -638,7 +638,7 @@ atm_tc_dump_class_stats(struct Qdisc *sch, unsigned long arg,
638 struct atm_flow_data *flow = (struct atm_flow_data *)arg; 638 struct atm_flow_data *flow = (struct atm_flow_data *)arg;
639 639
640 if (gnet_stats_copy_basic(d, NULL, &flow->bstats) < 0 || 640 if (gnet_stats_copy_basic(d, NULL, &flow->bstats) < 0 ||
641 gnet_stats_copy_queue(d, &flow->qstats, flow->q->q.qlen) < 0) 641 gnet_stats_copy_queue(d, NULL, &flow->qstats, flow->q->q.qlen) < 0)
642 return -1; 642 return -1;
643 643
644 return 0; 644 return 0;
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c
index c610081ffba5..beeb75f80fdb 100644
--- a/net/sched/sch_cbq.c
+++ b/net/sched/sch_cbq.c
@@ -1602,7 +1602,7 @@ cbq_dump_class_stats(struct Qdisc *sch, unsigned long arg,
1602 1602
1603 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 || 1603 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 ||
1604 gnet_stats_copy_rate_est(d, &cl->bstats, &cl->rate_est) < 0 || 1604 gnet_stats_copy_rate_est(d, &cl->bstats, &cl->rate_est) < 0 ||
1605 gnet_stats_copy_queue(d, &cl->qstats, cl->q->q.qlen) < 0) 1605 gnet_stats_copy_queue(d, NULL, &cl->qstats, cl->q->q.qlen) < 0)
1606 return -1; 1606 return -1;
1607 1607
1608 return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats)); 1608 return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats));
diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c
index 5835a93905b1..338706092c27 100644
--- a/net/sched/sch_drr.c
+++ b/net/sched/sch_drr.c
@@ -284,7 +284,7 @@ static int drr_dump_class_stats(struct Qdisc *sch, unsigned long arg,
284 284
285 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 || 285 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 ||
286 gnet_stats_copy_rate_est(d, &cl->bstats, &cl->rate_est) < 0 || 286 gnet_stats_copy_rate_est(d, &cl->bstats, &cl->rate_est) < 0 ||
287 gnet_stats_copy_queue(d, &cl->qdisc->qstats, qlen) < 0) 287 gnet_stats_copy_queue(d, NULL, &cl->qdisc->qstats, qlen) < 0)
288 return -1; 288 return -1;
289 289
290 return gnet_stats_copy_app(d, &xstats, sizeof(xstats)); 290 return gnet_stats_copy_app(d, &xstats, sizeof(xstats));
diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c
index 226d73597539..b9ca32ebc1de 100644
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
@@ -550,7 +550,7 @@ static int fq_codel_dump_class_stats(struct Qdisc *sch, unsigned long cl,
550 qs.backlog = q->backlogs[idx]; 550 qs.backlog = q->backlogs[idx];
551 qs.drops = flow->dropped; 551 qs.drops = flow->dropped;
552 } 552 }
553 if (gnet_stats_copy_queue(d, &qs, 0) < 0) 553 if (gnet_stats_copy_queue(d, NULL, &qs, 0) < 0)
554 return -1; 554 return -1;
555 if (idx < q->flows_cnt) 555 if (idx < q->flows_cnt)
556 return gnet_stats_copy_app(d, &xstats, sizeof(xstats)); 556 return gnet_stats_copy_app(d, &xstats, sizeof(xstats));
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c
index d364acb2ad07..e6c7416d0332 100644
--- a/net/sched/sch_hfsc.c
+++ b/net/sched/sch_hfsc.c
@@ -1378,7 +1378,7 @@ hfsc_dump_class_stats(struct Qdisc *sch, unsigned long arg,
1378 1378
1379 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 || 1379 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 ||
1380 gnet_stats_copy_rate_est(d, &cl->bstats, &cl->rate_est) < 0 || 1380 gnet_stats_copy_rate_est(d, &cl->bstats, &cl->rate_est) < 0 ||
1381 gnet_stats_copy_queue(d, &cl->qstats, cl->qdisc->q.qlen) < 0) 1381 gnet_stats_copy_queue(d, NULL, &cl->qstats, cl->qdisc->q.qlen) < 0)
1382 return -1; 1382 return -1;
1383 1383
1384 return gnet_stats_copy_app(d, &xstats, sizeof(xstats)); 1384 return gnet_stats_copy_app(d, &xstats, sizeof(xstats));
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
index 3a691fd88f99..f1acb0f60dc3 100644
--- a/net/sched/sch_htb.c
+++ b/net/sched/sch_htb.c
@@ -1147,7 +1147,7 @@ htb_dump_class_stats(struct Qdisc *sch, unsigned long arg, struct gnet_dump *d)
1147 1147
1148 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 || 1148 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 ||
1149 gnet_stats_copy_rate_est(d, NULL, &cl->rate_est) < 0 || 1149 gnet_stats_copy_rate_est(d, NULL, &cl->rate_est) < 0 ||
1150 gnet_stats_copy_queue(d, &cl->qstats, qlen) < 0) 1150 gnet_stats_copy_queue(d, NULL, &cl->qstats, qlen) < 0)
1151 return -1; 1151 return -1;
1152 1152
1153 return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats)); 1153 return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats));
diff --git a/net/sched/sch_mq.c b/net/sched/sch_mq.c
index 6416a6942062..f3cbaecd283a 100644
--- a/net/sched/sch_mq.c
+++ b/net/sched/sch_mq.c
@@ -200,7 +200,7 @@ static int mq_dump_class_stats(struct Qdisc *sch, unsigned long cl,
200 200
201 sch = dev_queue->qdisc_sleeping; 201 sch = dev_queue->qdisc_sleeping;
202 if (gnet_stats_copy_basic(d, NULL, &sch->bstats) < 0 || 202 if (gnet_stats_copy_basic(d, NULL, &sch->bstats) < 0 ||
203 gnet_stats_copy_queue(d, &sch->qstats, sch->q.qlen) < 0) 203 gnet_stats_copy_queue(d, NULL, &sch->qstats, sch->q.qlen) < 0)
204 return -1; 204 return -1;
205 return 0; 205 return 0;
206} 206}
diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c
index 03dbeb5e8181..3811a745452c 100644
--- a/net/sched/sch_mqprio.c
+++ b/net/sched/sch_mqprio.c
@@ -356,14 +356,15 @@ static int mqprio_dump_class_stats(struct Qdisc *sch, unsigned long cl,
356 /* Reclaim root sleeping lock before completing stats */ 356 /* Reclaim root sleeping lock before completing stats */
357 spin_lock_bh(d->lock); 357 spin_lock_bh(d->lock);
358 if (gnet_stats_copy_basic(d, NULL, &bstats) < 0 || 358 if (gnet_stats_copy_basic(d, NULL, &bstats) < 0 ||
359 gnet_stats_copy_queue(d, &qstats, qlen) < 0) 359 gnet_stats_copy_queue(d, NULL, &qstats, qlen) < 0)
360 return -1; 360 return -1;
361 } else { 361 } else {
362 struct netdev_queue *dev_queue = mqprio_queue_get(sch, cl); 362 struct netdev_queue *dev_queue = mqprio_queue_get(sch, cl);
363 363
364 sch = dev_queue->qdisc_sleeping; 364 sch = dev_queue->qdisc_sleeping;
365 if (gnet_stats_copy_basic(d, NULL, &sch->bstats) < 0 || 365 if (gnet_stats_copy_basic(d, NULL, &sch->bstats) < 0 ||
366 gnet_stats_copy_queue(d, &sch->qstats, sch->q.qlen) < 0) 366 gnet_stats_copy_queue(d, NULL,
367 &sch->qstats, sch->q.qlen) < 0)
367 return -1; 368 return -1;
368 } 369 }
369 return 0; 370 return 0;
diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c
index 53357b368bff..42dd218871e0 100644
--- a/net/sched/sch_multiq.c
+++ b/net/sched/sch_multiq.c
@@ -361,7 +361,7 @@ static int multiq_dump_class_stats(struct Qdisc *sch, unsigned long cl,
361 361
362 cl_q = q->queues[cl - 1]; 362 cl_q = q->queues[cl - 1];
363 if (gnet_stats_copy_basic(d, NULL, &cl_q->bstats) < 0 || 363 if (gnet_stats_copy_basic(d, NULL, &cl_q->bstats) < 0 ||
364 gnet_stats_copy_queue(d, &cl_q->qstats, cl_q->q.qlen) < 0) 364 gnet_stats_copy_queue(d, NULL, &cl_q->qstats, cl_q->q.qlen) < 0)
365 return -1; 365 return -1;
366 366
367 return 0; 367 return 0;
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c
index 4644f55242d2..8e5cd34aaa74 100644
--- a/net/sched/sch_prio.c
+++ b/net/sched/sch_prio.c
@@ -325,7 +325,7 @@ static int prio_dump_class_stats(struct Qdisc *sch, unsigned long cl,
325 325
326 cl_q = q->queues[cl - 1]; 326 cl_q = q->queues[cl - 1];
327 if (gnet_stats_copy_basic(d, NULL, &cl_q->bstats) < 0 || 327 if (gnet_stats_copy_basic(d, NULL, &cl_q->bstats) < 0 ||
328 gnet_stats_copy_queue(d, &cl_q->qstats, cl_q->q.qlen) < 0) 328 gnet_stats_copy_queue(d, NULL, &cl_q->qstats, cl_q->q.qlen) < 0)
329 return -1; 329 return -1;
330 330
331 return 0; 331 return 0;
diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c
index 66df9d9e301a..3ec7e88a43ca 100644
--- a/net/sched/sch_qfq.c
+++ b/net/sched/sch_qfq.c
@@ -670,7 +670,8 @@ static int qfq_dump_class_stats(struct Qdisc *sch, unsigned long arg,
670 670
671 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 || 671 if (gnet_stats_copy_basic(d, NULL, &cl->bstats) < 0 ||
672 gnet_stats_copy_rate_est(d, &cl->bstats, &cl->rate_est) < 0 || 672 gnet_stats_copy_rate_est(d, &cl->bstats, &cl->rate_est) < 0 ||
673 gnet_stats_copy_queue(d, &cl->qdisc->qstats, cl->qdisc->q.qlen) < 0) 673 gnet_stats_copy_queue(d, NULL,
674 &cl->qdisc->qstats, cl->qdisc->q.qlen) < 0)
674 return -1; 675 return -1;
675 676
676 return gnet_stats_copy_app(d, &xstats, sizeof(xstats)); 677 return gnet_stats_copy_app(d, &xstats, sizeof(xstats));
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
index d4afcbc1c6f7..b877140beda5 100644
--- a/net/sched/sch_sfq.c
+++ b/net/sched/sch_sfq.c
@@ -871,7 +871,7 @@ static int sfq_dump_class_stats(struct Qdisc *sch, unsigned long cl,
871 qs.qlen = slot->qlen; 871 qs.qlen = slot->qlen;
872 qs.backlog = slot->backlog; 872 qs.backlog = slot->backlog;
873 } 873 }
874 if (gnet_stats_copy_queue(d, &qs, qs.qlen) < 0) 874 if (gnet_stats_copy_queue(d, NULL, &qs, qs.qlen) < 0)
875 return -1; 875 return -1;
876 return gnet_stats_copy_app(d, &xstats, sizeof(xstats)); 876 return gnet_stats_copy_app(d, &xstats, sizeof(xstats));
877} 877}