diff options
Diffstat (limited to 'include/net/sch_generic.h')
-rw-r--r-- | include/net/sch_generic.h | 37 |
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 { | |||
52 | struct qdisc_skb_head { | 52 | struct 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 | ||
486 | static inline int qdisc_qlen_cpu(const struct Qdisc *q) | ||
487 | { | ||
488 | return this_cpu_ptr(q->cpu_qstats)->qlen; | ||
489 | } | ||
490 | |||
489 | static inline int qdisc_qlen(const struct Qdisc *q) | 491 | static inline int qdisc_qlen(const struct Qdisc *q) |
490 | { | 492 | { |
491 | return q->q.qlen; | 493 | return q->q.qlen; |
492 | } | 494 | } |
493 | 495 | ||
494 | static inline u32 qdisc_qlen_sum(const struct Qdisc *q) | 496 | static 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 | ||
892 | static inline void qdisc_qstats_atomic_qlen_inc(struct Qdisc *sch) | 897 | static 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 | ||
897 | static inline void qdisc_qstats_atomic_qlen_dec(struct Qdisc *sch) | 902 | static 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 | ||
902 | static inline void qdisc_qstats_cpu_requeues_inc(struct Qdisc *sch) | 907 | static 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--; |