net: fix race on decreasing number of TX queues
[pandora-kernel.git] / net / core / dev.c
index bb7a0cc..56a6ad8 100644 (file)
@@ -1750,8 +1750,11 @@ static void netif_setup_tc(struct net_device *dev, unsigned int txq)
  */
 int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
 {
  */
 int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
 {
+       bool disabling;
        int rc;
 
        int rc;
 
+       disabling = txq < dev->real_num_tx_queues;
+
        if (txq < 1 || txq > dev->num_tx_queues)
                return -EINVAL;
 
        if (txq < 1 || txq > dev->num_tx_queues)
                return -EINVAL;
 
@@ -1767,11 +1770,16 @@ int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
                if (dev->num_tc)
                        netif_setup_tc(dev, txq);
 
                if (dev->num_tc)
                        netif_setup_tc(dev, txq);
 
-               if (txq < dev->real_num_tx_queues)
+               dev->real_num_tx_queues = txq;
+
+               if (disabling) {
+                       synchronize_net();
                        qdisc_reset_all_tx_gt(dev, txq);
                        qdisc_reset_all_tx_gt(dev, txq);
+               }
+       } else {
+               dev->real_num_tx_queues = txq;
        }
 
        }
 
-       dev->real_num_tx_queues = txq;
        return 0;
 }
 EXPORT_SYMBOL(netif_set_real_num_tx_queues);
        return 0;
 }
 EXPORT_SYMBOL(netif_set_real_num_tx_queues);