Hi:

If anyone is interested here is the incremental patch against the previous
series.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
diff --git a/net/core/dev.c b/net/core/dev.c
index 9c68ab8..d293e0f 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1415,7 +1415,7 @@ gso:
        /* Disable soft irqs for various locks below. Also 
         * stops preemption for RCU. 
         */
-       local_bh_disable(); 
+       rcu_read_lock_bh(); 
 
        /* Updates of qdisc are serialized by queue_lock. 
         * The struct Qdisc which is pointed to by qdisc is now a 
@@ -1486,13 +1486,13 @@ #endif
        }
 
        rc = -ENETDOWN;
-       local_bh_enable();
+       rcu_read_unlock_bh();
 
 out_kfree_skb:
        kfree_skb(skb);
        return rc;
 out:
-       local_bh_enable();
+       rcu_read_unlock_bh();
        return rc;
 }
 
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 472cb5a..4cdd6ca 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -185,9 +185,13 @@ requeue:
 
 void __qdisc_run(struct net_device *dev)
 {
+       if (unlikely(dev->qdisc == &noop_qdisc))
+               goto out;
+
        while (qdisc_restart(dev) < 0 && !netif_queue_stopped(dev))
                /* NOTHING */;
 
+out:
        clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state);
 }
 
@@ -581,20 +585,24 @@ void dev_deactivate(struct net_device *d
        spin_lock_bh(&dev->queue_lock);
        qdisc = dev->qdisc;
        dev->qdisc = &noop_qdisc;
-       skb = dev->gso_skb;
-       dev->gso_skb = NULL;
 
        qdisc_reset(qdisc);
 
        spin_unlock_bh(&dev->queue_lock);
 
-       kfree_skb(skb);
        dev_watchdog_down(dev);
 
-       while (test_bit(__LINK_STATE_SCHED, &dev->state))
+       /* Wait for outstanding dev_queue_xmit calls. */
+       synchronize_rcu();
+
+       /* Wait for outstanding qdisc_run calls. */
+       while (test_bit(__LINK_STATE_QDISC_RUNNING, &dev->state))
                yield();
 
-       spin_unlock_wait(&dev->_xmit_lock);
+       if (dev->gso_skb) {
+               kfree_skb(dev->gso_skb);
+               dev->gso_skb = NULL;
+       }
 }
 
 void dev_init_scheduler(struct net_device *dev)
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to