diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/sched/sch_red.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'net/sched/sch_red.c')
-rw-r--r-- | net/sched/sch_red.c | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index 8d42bb3ba540..6649463da1b6 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c | |||
@@ -36,8 +36,7 @@ | |||
36 | if RED works correctly. | 36 | if RED works correctly. |
37 | */ | 37 | */ |
38 | 38 | ||
39 | struct red_sched_data | 39 | struct red_sched_data { |
40 | { | ||
41 | u32 limit; /* HARD maximal queue length */ | 40 | u32 limit; /* HARD maximal queue length */ |
42 | unsigned char flags; | 41 | unsigned char flags; |
43 | struct red_parms parms; | 42 | struct red_parms parms; |
@@ -55,7 +54,7 @@ static inline int red_use_harddrop(struct red_sched_data *q) | |||
55 | return q->flags & TC_RED_HARDDROP; | 54 | return q->flags & TC_RED_HARDDROP; |
56 | } | 55 | } |
57 | 56 | ||
58 | static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch) | 57 | static int red_enqueue(struct sk_buff *skb, struct Qdisc *sch) |
59 | { | 58 | { |
60 | struct red_sched_data *q = qdisc_priv(sch); | 59 | struct red_sched_data *q = qdisc_priv(sch); |
61 | struct Qdisc *child = q->qdisc; | 60 | struct Qdisc *child = q->qdisc; |
@@ -67,35 +66,33 @@ static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
67 | red_end_of_idle_period(&q->parms); | 66 | red_end_of_idle_period(&q->parms); |
68 | 67 | ||
69 | switch (red_action(&q->parms, q->parms.qavg)) { | 68 | switch (red_action(&q->parms, q->parms.qavg)) { |
70 | case RED_DONT_MARK: | 69 | case RED_DONT_MARK: |
71 | break; | 70 | break; |
72 | 71 | ||
73 | case RED_PROB_MARK: | 72 | case RED_PROB_MARK: |
74 | sch->qstats.overlimits++; | 73 | sch->qstats.overlimits++; |
75 | if (!red_use_ecn(q) || !INET_ECN_set_ce(skb)) { | 74 | if (!red_use_ecn(q) || !INET_ECN_set_ce(skb)) { |
76 | q->stats.prob_drop++; | 75 | q->stats.prob_drop++; |
77 | goto congestion_drop; | 76 | goto congestion_drop; |
78 | } | 77 | } |
79 | 78 | ||
80 | q->stats.prob_mark++; | 79 | q->stats.prob_mark++; |
81 | break; | 80 | break; |
82 | 81 | ||
83 | case RED_HARD_MARK: | 82 | case RED_HARD_MARK: |
84 | sch->qstats.overlimits++; | 83 | sch->qstats.overlimits++; |
85 | if (red_use_harddrop(q) || !red_use_ecn(q) || | 84 | if (red_use_harddrop(q) || !red_use_ecn(q) || |
86 | !INET_ECN_set_ce(skb)) { | 85 | !INET_ECN_set_ce(skb)) { |
87 | q->stats.forced_drop++; | 86 | q->stats.forced_drop++; |
88 | goto congestion_drop; | 87 | goto congestion_drop; |
89 | } | 88 | } |
90 | 89 | ||
91 | q->stats.forced_mark++; | 90 | q->stats.forced_mark++; |
92 | break; | 91 | break; |
93 | } | 92 | } |
94 | 93 | ||
95 | ret = qdisc_enqueue(skb, child); | 94 | ret = qdisc_enqueue(skb, child); |
96 | if (likely(ret == NET_XMIT_SUCCESS)) { | 95 | if (likely(ret == NET_XMIT_SUCCESS)) { |
97 | sch->bstats.bytes += qdisc_pkt_len(skb); | ||
98 | sch->bstats.packets++; | ||
99 | sch->q.qlen++; | 96 | sch->q.qlen++; |
100 | } else if (net_xmit_drop_count(ret)) { | 97 | } else if (net_xmit_drop_count(ret)) { |
101 | q->stats.pdrop++; | 98 | q->stats.pdrop++; |
@@ -108,22 +105,24 @@ congestion_drop: | |||
108 | return NET_XMIT_CN; | 105 | return NET_XMIT_CN; |
109 | } | 106 | } |
110 | 107 | ||
111 | static struct sk_buff * red_dequeue(struct Qdisc* sch) | 108 | static struct sk_buff *red_dequeue(struct Qdisc *sch) |
112 | { | 109 | { |
113 | struct sk_buff *skb; | 110 | struct sk_buff *skb; |
114 | struct red_sched_data *q = qdisc_priv(sch); | 111 | struct red_sched_data *q = qdisc_priv(sch); |
115 | struct Qdisc *child = q->qdisc; | 112 | struct Qdisc *child = q->qdisc; |
116 | 113 | ||
117 | skb = child->dequeue(child); | 114 | skb = child->dequeue(child); |
118 | if (skb) | 115 | if (skb) { |
116 | qdisc_bstats_update(sch, skb); | ||
119 | sch->q.qlen--; | 117 | sch->q.qlen--; |
120 | else if (!red_is_idling(&q->parms)) | 118 | } else { |
121 | red_start_of_idle_period(&q->parms); | 119 | if (!red_is_idling(&q->parms)) |
122 | 120 | red_start_of_idle_period(&q->parms); | |
121 | } | ||
123 | return skb; | 122 | return skb; |
124 | } | 123 | } |
125 | 124 | ||
126 | static struct sk_buff * red_peek(struct Qdisc* sch) | 125 | static struct sk_buff *red_peek(struct Qdisc *sch) |
127 | { | 126 | { |
128 | struct red_sched_data *q = qdisc_priv(sch); | 127 | struct red_sched_data *q = qdisc_priv(sch); |
129 | struct Qdisc *child = q->qdisc; | 128 | struct Qdisc *child = q->qdisc; |
@@ -131,7 +130,7 @@ static struct sk_buff * red_peek(struct Qdisc* sch) | |||
131 | return child->ops->peek(child); | 130 | return child->ops->peek(child); |
132 | } | 131 | } |
133 | 132 | ||
134 | static unsigned int red_drop(struct Qdisc* sch) | 133 | static unsigned int red_drop(struct Qdisc *sch) |
135 | { | 134 | { |
136 | struct red_sched_data *q = qdisc_priv(sch); | 135 | struct red_sched_data *q = qdisc_priv(sch); |
137 | struct Qdisc *child = q->qdisc; | 136 | struct Qdisc *child = q->qdisc; |
@@ -150,7 +149,7 @@ static unsigned int red_drop(struct Qdisc* sch) | |||
150 | return 0; | 149 | return 0; |
151 | } | 150 | } |
152 | 151 | ||
153 | static void red_reset(struct Qdisc* sch) | 152 | static void red_reset(struct Qdisc *sch) |
154 | { | 153 | { |
155 | struct red_sched_data *q = qdisc_priv(sch); | 154 | struct red_sched_data *q = qdisc_priv(sch); |
156 | 155 | ||
@@ -217,7 +216,7 @@ static int red_change(struct Qdisc *sch, struct nlattr *opt) | |||
217 | return 0; | 216 | return 0; |
218 | } | 217 | } |
219 | 218 | ||
220 | static int red_init(struct Qdisc* sch, struct nlattr *opt) | 219 | static int red_init(struct Qdisc *sch, struct nlattr *opt) |
221 | { | 220 | { |
222 | struct red_sched_data *q = qdisc_priv(sch); | 221 | struct red_sched_data *q = qdisc_priv(sch); |
223 | 222 | ||
@@ -239,6 +238,7 @@ static int red_dump(struct Qdisc *sch, struct sk_buff *skb) | |||
239 | .Scell_log = q->parms.Scell_log, | 238 | .Scell_log = q->parms.Scell_log, |
240 | }; | 239 | }; |
241 | 240 | ||
241 | sch->qstats.backlog = q->qdisc->qstats.backlog; | ||
242 | opts = nla_nest_start(skb, TCA_OPTIONS); | 242 | opts = nla_nest_start(skb, TCA_OPTIONS); |
243 | if (opts == NULL) | 243 | if (opts == NULL) |
244 | goto nla_put_failure; | 244 | goto nla_put_failure; |