net: init ingress queue
authorChangli Gao <xiaosuo@gmail.com>
Sat, 4 Dec 2010 02:31:41 +0000 (02:31 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 8 Dec 2010 17:43:27 +0000 (09:43 -0800)
The dev field of ingress queue is forgot to initialized, then NULL
pointer dereference happens in qdisc_alloc().

Move inits of tx queues to netif_alloc_netdev_queues().

Signed-off-by: Changli Gao <xiaosuo@gmail.com>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index 55ff66fabce46270a23dcfd56cc97403c650e831..ee605c0867e7809ab76e47bdc12a602bb2e36d4d 100644 (file)
@@ -5112,11 +5112,21 @@ static int netif_alloc_rx_queues(struct net_device *dev)
 }
 #endif
 
+static void netdev_init_one_queue(struct net_device *dev,
+                                 struct netdev_queue *queue, void *_unused)
+{
+       /* Initialize queue lock */
+       spin_lock_init(&queue->_xmit_lock);
+       netdev_set_xmit_lockdep_class(&queue->_xmit_lock, dev->type);
+       queue->xmit_lock_owner = -1;
+       netdev_queue_numa_node_write(queue, -1);
+       queue->dev = dev;
+}
+
 static int netif_alloc_netdev_queues(struct net_device *dev)
 {
        unsigned int count = dev->num_tx_queues;
        struct netdev_queue *tx;
-       int i;
 
        BUG_ON(count < 1);
 
@@ -5128,27 +5138,10 @@ static int netif_alloc_netdev_queues(struct net_device *dev)
        }
        dev->_tx = tx;
 
-       for (i = 0; i < count; i++) {
-               netdev_queue_numa_node_write(&tx[i], -1);
-               tx[i].dev = dev;
-       }
-       return 0;
-}
-
-static void netdev_init_one_queue(struct net_device *dev,
-                                 struct netdev_queue *queue,
-                                 void *_unused)
-{
-       /* Initialize queue lock */
-       spin_lock_init(&queue->_xmit_lock);
-       netdev_set_xmit_lockdep_class(&queue->_xmit_lock, dev->type);
-       queue->xmit_lock_owner = -1;
-}
-
-static void netdev_init_queues(struct net_device *dev)
-{
        netdev_for_each_tx_queue(dev, netdev_init_one_queue, NULL);
        spin_lock_init(&dev->tx_global_lock);
+
+       return 0;
 }
 
 /**
@@ -5187,8 +5180,6 @@ int register_netdevice(struct net_device *dev)
 
        dev->iflink = -1;
 
-       netdev_init_queues(dev);
-
        /* Init, if this function is available */
        if (dev->netdev_ops->ndo_init) {
                ret = dev->netdev_ops->ndo_init(dev);