Skip to content

Commit

Permalink
net: init ingress queue
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Changli Gao authored and David S. Miller committed Dec 8, 2010
1 parent a1044e3 commit aa94210
Showing 1 changed file with 13 additions and 22 deletions.
35 changes: 13 additions & 22 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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;
}

/**
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit aa94210

Please sign in to comment.