pkt_sched: Remove qdisc_lock_tree usage in cls_api.c
authorDavid S. Miller <davem@davemloft.net>
Wed, 16 Jul 2008 09:40:45 +0000 (02:40 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Jul 2008 02:21:24 +0000 (19:21 -0700)
It just wants the qdisc tree for the filter to be synchronized.
So just BH lock qdisc_root_lock(q) instead.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/cls_api.c

index d0b0a9b..d2b6f54 100644 (file)
@@ -120,6 +120,7 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 {
        struct net *net = sock_net(skb->sk);
        struct nlattr *tca[TCA_MAX + 1];
+       spinlock_t *root_lock;
        struct tcmsg *t;
        u32 protocol;
        u32 prio;
@@ -204,6 +205,8 @@ replay:
                }
        }
 
+       root_lock = qdisc_root_lock(q);
+
        if (tp == NULL) {
                /* Proto-tcf does not exist, create new one */
 
@@ -263,10 +266,10 @@ replay:
                        goto errout;
                }
 
-               qdisc_lock_tree(dev);
+               spin_lock_bh(root_lock);
                tp->next = *back;
                *back = tp;
-               qdisc_unlock_tree(dev);
+               spin_unlock_bh(root_lock);
 
        } else if (tca[TCA_KIND] && nla_strcmp(tca[TCA_KIND], tp->ops->kind))
                goto errout;
@@ -275,9 +278,9 @@ replay:
 
        if (fh == 0) {
                if (n->nlmsg_type == RTM_DELTFILTER && t->tcm_handle == 0) {
-                       qdisc_lock_tree(dev);
+                       spin_lock_bh(root_lock);
                        *back = tp->next;
-                       qdisc_unlock_tree(dev);
+                       spin_lock_bh(root_lock);
 
                        tfilter_notify(skb, n, tp, fh, RTM_DELTFILTER);
                        tcf_destroy(tp);