diff options
author | John Fastabend <john.fastabend@gmail.com> | 2014-09-28 14:54:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-09-30 01:02:26 -0400 |
commit | b0ab6f92752b9f9d8da980506e9df3bd9dcd7ed3 (patch) | |
tree | e8dc1bb9dc3bdce6a62b785b1828efded9f87205 /net/sched | |
parent | 6401585366326fc0ecbc372ec60d1a15cd8be2f5 (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.c | 2 | ||||
-rw-r--r-- | net/sched/sch_api.c | 12 | ||||
-rw-r--r-- | net/sched/sch_atm.c | 2 | ||||
-rw-r--r-- | net/sched/sch_cbq.c | 2 | ||||
-rw-r--r-- | net/sched/sch_drr.c | 2 | ||||
-rw-r--r-- | net/sched/sch_fq_codel.c | 2 | ||||
-rw-r--r-- | net/sched/sch_hfsc.c | 2 | ||||
-rw-r--r-- | net/sched/sch_htb.c | 2 | ||||
-rw-r--r-- | net/sched/sch_mq.c | 2 | ||||
-rw-r--r-- | net/sched/sch_mqprio.c | 5 | ||||
-rw-r--r-- | net/sched/sch_multiq.c | 2 | ||||
-rw-r--r-- | net/sched/sch_prio.c | 2 | ||||
-rw-r--r-- | net/sched/sch_qfq.c | 3 | ||||
-rw-r--r-- | net/sched/sch_sfq.c | 2 |
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 | ||
996 | err_out4: | 1000 | err_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 | } |