mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
net-sysfs: prevent uncleared queues from being re-added
With the (upcoming) removal of the rtnl_trylock/restart_syscall logic and because of how Tx/Rx queues are implemented (and their requirements), it might happen that a queue is re-added before having the chance to be cleared. In such rare case, do not complete the queue addition operation. Signed-off-by: Antoine Tenart <atenart@kernel.org> Link: https://patch.msgid.link/20250204170314.146022-4-atenart@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b7ecc1de51
commit
7e54f85c60
|
|
@ -1210,6 +1210,22 @@ static int rx_queue_add_kobject(struct net_device *dev, int index)
|
|||
struct kobject *kobj = &queue->kobj;
|
||||
int error = 0;
|
||||
|
||||
/* Rx queues are cleared in rx_queue_release to allow later
|
||||
* re-registration. This is triggered when their kobj refcount is
|
||||
* dropped.
|
||||
*
|
||||
* If a queue is removed while both a read (or write) operation and a
|
||||
* the re-addition of the same queue are pending (waiting on rntl_lock)
|
||||
* it might happen that the re-addition will execute before the read,
|
||||
* making the initial removal to never happen (queue's kobj refcount
|
||||
* won't drop enough because of the pending read). In such rare case,
|
||||
* return to allow the removal operation to complete.
|
||||
*/
|
||||
if (unlikely(kobj->state_initialized)) {
|
||||
netdev_warn_once(dev, "Cannot re-add rx queues before their removal completed");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
/* Kobject_put later will trigger rx_queue_release call which
|
||||
* decreases dev refcount: Take that reference here
|
||||
*/
|
||||
|
|
@ -1898,6 +1914,22 @@ static int netdev_queue_add_kobject(struct net_device *dev, int index)
|
|||
struct kobject *kobj = &queue->kobj;
|
||||
int error = 0;
|
||||
|
||||
/* Tx queues are cleared in netdev_queue_release to allow later
|
||||
* re-registration. This is triggered when their kobj refcount is
|
||||
* dropped.
|
||||
*
|
||||
* If a queue is removed while both a read (or write) operation and a
|
||||
* the re-addition of the same queue are pending (waiting on rntl_lock)
|
||||
* it might happen that the re-addition will execute before the read,
|
||||
* making the initial removal to never happen (queue's kobj refcount
|
||||
* won't drop enough because of the pending read). In such rare case,
|
||||
* return to allow the removal operation to complete.
|
||||
*/
|
||||
if (unlikely(kobj->state_initialized)) {
|
||||
netdev_warn_once(dev, "Cannot re-add tx queues before their removal completed");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
/* Kobject_put later will trigger netdev_queue_release call
|
||||
* which decreases dev refcount: Take that reference here
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user