summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2021-12-08 18:36:51 -0800
committerJakub Kicinski <kuba@kernel.org>2021-12-08 18:36:52 -0800
commit28a0a044fbe9e1efb8fde6b74ebc1dcd79b4fdfa (patch)
treee4421fe74b44f5c583dd69caf540a4436fd23304
parent16daf3d9ec44ef9a85833f8638ff432ac09a8d18 (diff)
parent5f1c802ca69b3c076eea5fabc8839ffa5ddd8c8f (diff)
downloadlinux-28a0a044fbe9e1efb8fde6b74ebc1dcd79b4fdfa.tar.bz2
Merge branch 'net-track-the-queue-count-at-unregistration'
Antoine Tenart says: ==================== net: track the queue count at unregistration Those two patches allow to track the Rx and Tx queue count at unregistration and help in detecting illegal addition of Tx queues after unregister (a warning is added). This follows discussions on the following thread, https://lore.kernel.org/all/20211122162007.303623-1-atenart@kernel.org/T/ A patch fixing one issue linked to this was merged ealier, https://lore.kernel.org/all/20211203101318.435618-1-atenart@kernel.org/T/ ==================== Link: https://lore.kernel.org/r/20211207145725.352657-1-atenart@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--net/core/net-sysfs.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 3b2cdbbdc858..53ea262ecafd 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -1694,6 +1694,13 @@ netdev_queue_update_kobjects(struct net_device *dev, int old_num, int new_num)
int i;
int error = 0;
+ /* Tx queue kobjects are allowed to be updated when a device is being
+ * unregistered, but solely to remove queues from qdiscs. Any path
+ * adding queues should be fixed.
+ */
+ WARN(dev->reg_state == NETREG_UNREGISTERING && new_num > old_num,
+ "New queues can't be registered after device unregistration.");
+
for (i = old_num; i < new_num; i++) {
error = netdev_queue_add_kobject(dev, i);
if (error) {
@@ -1808,6 +1815,9 @@ static void remove_queue_kobjects(struct net_device *dev)
net_rx_queue_update_kobjects(dev, real_rx, 0);
netdev_queue_update_kobjects(dev, real_tx, 0);
+
+ dev->real_num_rx_queues = 0;
+ dev->real_num_tx_queues = 0;
#ifdef CONFIG_SYSFS
kset_unregister(dev->queues_kset);
#endif