diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-07-25 05:37:07 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-07-25 05:37:07 -0400 |
| commit | 0e2f65ee30eee2db054f7fd73f462c5da33ec963 (patch) | |
| tree | 26c61eb7745da0c0d9135e9d12088f570cb8530d /net/sched/cls_api.c | |
| parent | da7878d75b8520c9ae00d27dfbbce546a7bfdfbb (diff) | |
| parent | fb2e405fc1fc8b20d9c78eaa1c7fd5a297efde43 (diff) | |
Merge branch 'linus' into x86/pebs
Conflicts:
arch/x86/Kconfig.cpu
arch/x86/kernel/cpu/intel.c
arch/x86/kernel/setup_64.c
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'net/sched/cls_api.c')
| -rw-r--r-- | net/sched/cls_api.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 9360fc81e8c7..d2b6f54a6261 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
| @@ -120,6 +120,7 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg) | |||
| 120 | { | 120 | { |
| 121 | struct net *net = sock_net(skb->sk); | 121 | struct net *net = sock_net(skb->sk); |
| 122 | struct nlattr *tca[TCA_MAX + 1]; | 122 | struct nlattr *tca[TCA_MAX + 1]; |
| 123 | spinlock_t *root_lock; | ||
| 123 | struct tcmsg *t; | 124 | struct tcmsg *t; |
| 124 | u32 protocol; | 125 | u32 protocol; |
| 125 | u32 prio; | 126 | u32 prio; |
| @@ -166,7 +167,8 @@ replay: | |||
| 166 | 167 | ||
| 167 | /* Find qdisc */ | 168 | /* Find qdisc */ |
| 168 | if (!parent) { | 169 | if (!parent) { |
| 169 | q = dev->qdisc_sleeping; | 170 | struct netdev_queue *dev_queue = netdev_get_tx_queue(dev, 0); |
| 171 | q = dev_queue->qdisc_sleeping; | ||
| 170 | parent = q->handle; | 172 | parent = q->handle; |
| 171 | } else { | 173 | } else { |
| 172 | q = qdisc_lookup(dev, TC_H_MAJ(t->tcm_parent)); | 174 | q = qdisc_lookup(dev, TC_H_MAJ(t->tcm_parent)); |
| @@ -203,6 +205,8 @@ replay: | |||
| 203 | } | 205 | } |
| 204 | } | 206 | } |
| 205 | 207 | ||
| 208 | root_lock = qdisc_root_lock(q); | ||
| 209 | |||
| 206 | if (tp == NULL) { | 210 | if (tp == NULL) { |
| 207 | /* Proto-tcf does not exist, create new one */ | 211 | /* Proto-tcf does not exist, create new one */ |
| 208 | 212 | ||
| @@ -262,10 +266,10 @@ replay: | |||
| 262 | goto errout; | 266 | goto errout; |
| 263 | } | 267 | } |
| 264 | 268 | ||
| 265 | qdisc_lock_tree(dev); | 269 | spin_lock_bh(root_lock); |
| 266 | tp->next = *back; | 270 | tp->next = *back; |
| 267 | *back = tp; | 271 | *back = tp; |
| 268 | qdisc_unlock_tree(dev); | 272 | spin_unlock_bh(root_lock); |
| 269 | 273 | ||
| 270 | } else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind)) | 274 | } else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind)) |
| 271 | goto errout; | 275 | goto errout; |
| @@ -274,9 +278,9 @@ replay: | |||
| 274 | 278 | ||
| 275 | if (fh == 0) { | 279 | if (fh == 0) { |
| 276 | if (n->nlmsg_type == RTM_DELTFILTER && t->tcm_handle == 0) { | 280 | if (n->nlmsg_type == RTM_DELTFILTER && t->tcm_handle == 0) { |
| 277 | qdisc_lock_tree(dev); | 281 | spin_lock_bh(root_lock); |
| 278 | *back = tp->next; | 282 | *back = tp->next; |
| 279 | qdisc_unlock_tree(dev); | 283 | spin_lock_bh(root_lock); |
| 280 | 284 | ||
| 281 | tfilter_notify(skb, n, tp, fh, RTM_DELTFILTER); | 285 | tfilter_notify(skb, n, tp, fh, RTM_DELTFILTER); |
| 282 | tcf_destroy(tp); | 286 | tcf_destroy(tp); |
| @@ -334,7 +338,7 @@ static int tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp, | |||
| 334 | tcm->tcm_family = AF_UNSPEC; | 338 | tcm->tcm_family = AF_UNSPEC; |
| 335 | tcm->tcm__pad1 = 0; | 339 | tcm->tcm__pad1 = 0; |
| 336 | tcm->tcm__pad1 = 0; | 340 | tcm->tcm__pad1 = 0; |
| 337 | tcm->tcm_ifindex = tp->q->dev->ifindex; | 341 | tcm->tcm_ifindex = qdisc_dev(tp->q)->ifindex; |
| 338 | tcm->tcm_parent = tp->classid; | 342 | tcm->tcm_parent = tp->classid; |
| 339 | tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); | 343 | tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); |
| 340 | NLA_PUT_STRING(skb, TCA_KIND, tp->ops->kind); | 344 | NLA_PUT_STRING(skb, TCA_KIND, tp->ops->kind); |
| @@ -390,6 +394,7 @@ static int tcf_node_dump(struct tcf_proto *tp, unsigned long n, | |||
| 390 | static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb) | 394 | static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb) |
| 391 | { | 395 | { |
| 392 | struct net *net = sock_net(skb->sk); | 396 | struct net *net = sock_net(skb->sk); |
| 397 | struct netdev_queue *dev_queue; | ||
| 393 | int t; | 398 | int t; |
| 394 | int s_t; | 399 | int s_t; |
| 395 | struct net_device *dev; | 400 | struct net_device *dev; |
| @@ -408,8 +413,9 @@ static int tc_dump_tfilter(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 408 | if ((dev = dev_get_by_index(&init_net, tcm->tcm_ifindex)) == NULL) | 413 | if ((dev = dev_get_by_index(&init_net, tcm->tcm_ifindex)) == NULL) |
| 409 | return skb->len; | 414 | return skb->len; |
| 410 | 415 | ||
| 416 | dev_queue = netdev_get_tx_queue(dev, 0); | ||
| 411 | if (!tcm->tcm_parent) | 417 | if (!tcm->tcm_parent) |
| 412 | q = dev->qdisc_sleeping; | 418 | q = dev_queue->qdisc_sleeping; |
| 413 | else | 419 | else |
| 414 | q = qdisc_lookup(dev, TC_H_MAJ(tcm->tcm_parent)); | 420 | q = qdisc_lookup(dev, TC_H_MAJ(tcm->tcm_parent)); |
| 415 | if (!q) | 421 | if (!q) |
