aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/sch_generic.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net/sch_generic.h')
-rw-r--r--include/net/sch_generic.h37
1 files changed, 21 insertions, 16 deletions
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
index f069011524ba..e8f85cd2afce 100644
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@ -52,10 +52,7 @@ struct qdisc_size_table {
52struct qdisc_skb_head { 52struct qdisc_skb_head {
53 struct sk_buff *head; 53 struct sk_buff *head;
54 struct sk_buff *tail; 54 struct sk_buff *tail;
55 union { 55 __u32 qlen;
56 u32 qlen;
57 atomic_t atomic_qlen;
58 };
59 spinlock_t lock; 56 spinlock_t lock;
60}; 57};
61 58
@@ -486,19 +483,27 @@ static inline void qdisc_cb_private_validate(const struct sk_buff *skb, int sz)
486 BUILD_BUG_ON(sizeof(qcb->data) < sz); 483 BUILD_BUG_ON(sizeof(qcb->data) < sz);
487} 484}
488 485
486static inline int qdisc_qlen_cpu(const struct Qdisc *q)
487{
488 return this_cpu_ptr(q->cpu_qstats)->qlen;
489}
490
489static inline int qdisc_qlen(const struct Qdisc *q) 491static inline int qdisc_qlen(const struct Qdisc *q)
490{ 492{
491 return q->q.qlen; 493 return q->q.qlen;
492} 494}
493 495
494static inline u32 qdisc_qlen_sum(const struct Qdisc *q) 496static inline int qdisc_qlen_sum(const struct Qdisc *q)
495{ 497{
496 u32 qlen = q->qstats.qlen; 498 __u32 qlen = q->qstats.qlen;
499 int i;
497 500
498 if (qdisc_is_percpu_stats(q)) 501 if (qdisc_is_percpu_stats(q)) {
499 qlen += atomic_read(&q->q.atomic_qlen); 502 for_each_possible_cpu(i)
500 else 503 qlen += per_cpu_ptr(q->cpu_qstats, i)->qlen;
504 } else {
501 qlen += q->q.qlen; 505 qlen += q->q.qlen;
506 }
502 507
503 return qlen; 508 return qlen;
504} 509}
@@ -889,14 +894,14 @@ static inline void qdisc_qstats_cpu_backlog_inc(struct Qdisc *sch,
889 this_cpu_add(sch->cpu_qstats->backlog, qdisc_pkt_len(skb)); 894 this_cpu_add(sch->cpu_qstats->backlog, qdisc_pkt_len(skb));
890} 895}
891 896
892static inline void qdisc_qstats_atomic_qlen_inc(struct Qdisc *sch) 897static inline void qdisc_qstats_cpu_qlen_inc(struct Qdisc *sch)
893{ 898{
894 atomic_inc(&sch->q.atomic_qlen); 899 this_cpu_inc(sch->cpu_qstats->qlen);
895} 900}
896 901
897static inline void qdisc_qstats_atomic_qlen_dec(struct Qdisc *sch) 902static inline void qdisc_qstats_cpu_qlen_dec(struct Qdisc *sch)
898{ 903{
899 atomic_dec(&sch->q.atomic_qlen); 904 this_cpu_dec(sch->cpu_qstats->qlen);
900} 905}
901 906
902static inline void qdisc_qstats_cpu_requeues_inc(struct Qdisc *sch) 907static inline void qdisc_qstats_cpu_requeues_inc(struct Qdisc *sch)
@@ -1112,7 +1117,7 @@ static inline void qdisc_update_stats_at_dequeue(struct Qdisc *sch,
1112 if (qdisc_is_percpu_stats(sch)) { 1117 if (qdisc_is_percpu_stats(sch)) {
1113 qdisc_qstats_cpu_backlog_dec(sch, skb); 1118 qdisc_qstats_cpu_backlog_dec(sch, skb);
1114 qdisc_bstats_cpu_update(sch, skb); 1119 qdisc_bstats_cpu_update(sch, skb);
1115 qdisc_qstats_atomic_qlen_dec(sch); 1120 qdisc_qstats_cpu_qlen_dec(sch);
1116 } else { 1121 } else {
1117 qdisc_qstats_backlog_dec(sch, skb); 1122 qdisc_qstats_backlog_dec(sch, skb);
1118 qdisc_bstats_update(sch, skb); 1123 qdisc_bstats_update(sch, skb);
@@ -1124,7 +1129,7 @@ static inline void qdisc_update_stats_at_enqueue(struct Qdisc *sch,
1124 unsigned int pkt_len) 1129 unsigned int pkt_len)
1125{ 1130{
1126 if (qdisc_is_percpu_stats(sch)) { 1131 if (qdisc_is_percpu_stats(sch)) {
1127 qdisc_qstats_atomic_qlen_inc(sch); 1132 qdisc_qstats_cpu_qlen_inc(sch);
1128 this_cpu_add(sch->cpu_qstats->backlog, pkt_len); 1133 this_cpu_add(sch->cpu_qstats->backlog, pkt_len);
1129 } else { 1134 } else {
1130 sch->qstats.backlog += pkt_len; 1135 sch->qstats.backlog += pkt_len;
@@ -1141,7 +1146,7 @@ static inline struct sk_buff *qdisc_dequeue_peeked(struct Qdisc *sch)
1141 skb = __skb_dequeue(&sch->gso_skb); 1146 skb = __skb_dequeue(&sch->gso_skb);
1142 if (qdisc_is_percpu_stats(sch)) { 1147 if (qdisc_is_percpu_stats(sch)) {
1143 qdisc_qstats_cpu_backlog_dec(sch, skb); 1148 qdisc_qstats_cpu_backlog_dec(sch, skb);
1144 qdisc_qstats_atomic_qlen_dec(sch); 1149 qdisc_qstats_cpu_qlen_dec(sch);
1145 } else { 1150 } else {
1146 qdisc_qstats_backlog_dec(sch, skb); 1151 qdisc_qstats_backlog_dec(sch, skb);
1147 sch->q.qlen--; 1152 sch->q.qlen--;