Commit aa942104 authored by Changli Gao's avatar Changli Gao Committed by David S. Miller

net: init ingress queue

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: default avatarChangli Gao <xiaosuo@gmail.com>
Acked-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a1044e36
...@@ -5112,11 +5112,21 @@ static int netif_alloc_rx_queues(struct net_device *dev) ...@@ -5112,11 +5112,21 @@ static int netif_alloc_rx_queues(struct net_device *dev)
} }
#endif #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) static int netif_alloc_netdev_queues(struct net_device *dev)
{ {
unsigned int count = dev->num_tx_queues; unsigned int count = dev->num_tx_queues;
struct netdev_queue *tx; struct netdev_queue *tx;
int i;
BUG_ON(count < 1); BUG_ON(count < 1);
...@@ -5128,27 +5138,10 @@ static int netif_alloc_netdev_queues(struct net_device *dev) ...@@ -5128,27 +5138,10 @@ static int netif_alloc_netdev_queues(struct net_device *dev)
} }
dev->_tx = tx; 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); netdev_for_each_tx_queue(dev, netdev_init_one_queue, NULL);
spin_lock_init(&dev->tx_global_lock); spin_lock_init(&dev->tx_global_lock);
return 0;
} }
/** /**
...@@ -5187,8 +5180,6 @@ int register_netdevice(struct net_device *dev) ...@@ -5187,8 +5180,6 @@ int register_netdevice(struct net_device *dev)
dev->iflink = -1; dev->iflink = -1;
netdev_init_queues(dev);
/* Init, if this function is available */ /* Init, if this function is available */
if (dev->netdev_ops->ndo_init) { if (dev->netdev_ops->ndo_init) {
ret = dev->netdev_ops->ndo_init(dev); ret = dev->netdev_ops->ndo_init(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment