Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+13 −22
Original line number Diff line number Diff line
@@ -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);