mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-06 11:26:22 -04:00
staging: unisys: visornic - ensure proper net locking in tx reset logic
visornic tx reset handling is done asynchronously via a workqueue in visornic_timeout_reset(). As a result, it needs to use rtnl_lock() / rtnl_unlock() to lock against possible simultaneous close() of the network device. (I consulted the bnx2 driver as a model here, as that driver also does its tx reset handling asynchronously, just like visornic does. See bnx2_tx_timeout() and bnx2_reset_task().) Signed-off-by: Tim Sell <Timothy.Sell@unisys.com> Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
7c03621a79
commit
4d79002e96
@@ -731,6 +731,12 @@ visornic_timeout_reset(struct work_struct *work)
|
||||
devdata = container_of(work, struct visornic_devdata, timeout_reset);
|
||||
netdev = devdata->netdev;
|
||||
|
||||
rtnl_lock();
|
||||
if (!netif_running(netdev)) {
|
||||
rtnl_unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
response = visornic_disable_with_timeout(netdev,
|
||||
VISORNIC_INFINITE_RSP_WAIT);
|
||||
if (response)
|
||||
@@ -741,10 +747,13 @@ visornic_timeout_reset(struct work_struct *work)
|
||||
if (response)
|
||||
goto call_serverdown;
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
return;
|
||||
|
||||
call_serverdown:
|
||||
visornic_serverdown(devdata, NULL);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user