diff options
author | David S. Miller <davem@davemloft.net> | 2008-07-18 23:54:17 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-18 23:54:17 -0400 |
commit | 72b25a913ed9b1ab49c7022adaf3f271a65ea219 (patch) | |
tree | 89931a19264c79090ea3043d92f04e7727e37f1c | |
parent | 8913336a7e8d56e984109a3137d6c0e3362596a4 (diff) |
pkt_sched: Get rid of u32_list.
The u32_list is just an indirect way of maintaining a reference
to a U32 node on a per-qdisc basis.
Just add an explicit node pointer for u32 to struct Qdisc an do
away with this global list.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/sch_generic.h | 2 | ||||
-rw-r--r-- | net/sched/cls_u32.c | 18 |
2 files changed, 5 insertions, 15 deletions
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 0a158ff4de12..8a44386b35cf 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -56,6 +56,8 @@ struct Qdisc | |||
56 | int (*reshape_fail)(struct sk_buff *skb, | 56 | int (*reshape_fail)(struct sk_buff *skb, |
57 | struct Qdisc *q); | 57 | struct Qdisc *q); |
58 | 58 | ||
59 | void *u32_node; | ||
60 | |||
59 | /* This field is deprecated, but it is still used by CBQ | 61 | /* This field is deprecated, but it is still used by CBQ |
60 | * and it will live until better solution will be invented. | 62 | * and it will live until better solution will be invented. |
61 | */ | 63 | */ |
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 4d755444c449..527db2559dd2 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c | |||
@@ -75,7 +75,6 @@ struct tc_u_hnode | |||
75 | 75 | ||
76 | struct tc_u_common | 76 | struct tc_u_common |
77 | { | 77 | { |
78 | struct tc_u_common *next; | ||
79 | struct tc_u_hnode *hlist; | 78 | struct tc_u_hnode *hlist; |
80 | struct Qdisc *q; | 79 | struct Qdisc *q; |
81 | int refcnt; | 80 | int refcnt; |
@@ -87,8 +86,6 @@ static const struct tcf_ext_map u32_ext_map = { | |||
87 | .police = TCA_U32_POLICE | 86 | .police = TCA_U32_POLICE |
88 | }; | 87 | }; |
89 | 88 | ||
90 | static struct tc_u_common *u32_list; | ||
91 | |||
92 | static __inline__ unsigned u32_hash_fold(__be32 key, struct tc_u32_sel *sel, u8 fshift) | 89 | static __inline__ unsigned u32_hash_fold(__be32 key, struct tc_u32_sel *sel, u8 fshift) |
93 | { | 90 | { |
94 | unsigned h = ntohl(key & sel->hmask)>>fshift; | 91 | unsigned h = ntohl(key & sel->hmask)>>fshift; |
@@ -287,9 +284,7 @@ static int u32_init(struct tcf_proto *tp) | |||
287 | struct tc_u_hnode *root_ht; | 284 | struct tc_u_hnode *root_ht; |
288 | struct tc_u_common *tp_c; | 285 | struct tc_u_common *tp_c; |
289 | 286 | ||
290 | for (tp_c = u32_list; tp_c; tp_c = tp_c->next) | 287 | tp_c = tp->q->u32_node; |
291 | if (tp_c->q == tp->q) | ||
292 | break; | ||
293 | 288 | ||
294 | root_ht = kzalloc(sizeof(*root_ht), GFP_KERNEL); | 289 | root_ht = kzalloc(sizeof(*root_ht), GFP_KERNEL); |
295 | if (root_ht == NULL) | 290 | if (root_ht == NULL) |
@@ -307,8 +302,7 @@ static int u32_init(struct tcf_proto *tp) | |||
307 | return -ENOBUFS; | 302 | return -ENOBUFS; |
308 | } | 303 | } |
309 | tp_c->q = tp->q; | 304 | tp_c->q = tp->q; |
310 | tp_c->next = u32_list; | 305 | tp->q->u32_node = tp_c; |
311 | u32_list = tp_c; | ||
312 | } | 306 | } |
313 | 307 | ||
314 | tp_c->refcnt++; | 308 | tp_c->refcnt++; |
@@ -402,14 +396,8 @@ static void u32_destroy(struct tcf_proto *tp) | |||
402 | 396 | ||
403 | if (--tp_c->refcnt == 0) { | 397 | if (--tp_c->refcnt == 0) { |
404 | struct tc_u_hnode *ht; | 398 | struct tc_u_hnode *ht; |
405 | struct tc_u_common **tp_cp; | ||
406 | 399 | ||
407 | for (tp_cp = &u32_list; *tp_cp; tp_cp = &(*tp_cp)->next) { | 400 | tp->q->u32_node = NULL; |
408 | if (*tp_cp == tp_c) { | ||
409 | *tp_cp = tp_c->next; | ||
410 | break; | ||
411 | } | ||
412 | } | ||
413 | 401 | ||
414 | for (ht = tp_c->hlist; ht; ht = ht->next) { | 402 | for (ht = tp_c->hlist; ht; ht = ht->next) { |
415 | ht->refcnt--; | 403 | ht->refcnt--; |