Commit 4d79002e authored by Tim Sell's avatar Tim Sell Committed by Greg Kroah-Hartman

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: default avatarTim Sell <Timothy.Sell@unisys.com>
Signed-off-by: default avatarBenjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7c03621a
...@@ -731,6 +731,12 @@ visornic_timeout_reset(struct work_struct *work) ...@@ -731,6 +731,12 @@ visornic_timeout_reset(struct work_struct *work)
devdata = container_of(work, struct visornic_devdata, timeout_reset); devdata = container_of(work, struct visornic_devdata, timeout_reset);
netdev = devdata->netdev; netdev = devdata->netdev;
rtnl_lock();
if (!netif_running(netdev)) {
rtnl_unlock();
return;
}
response = visornic_disable_with_timeout(netdev, response = visornic_disable_with_timeout(netdev,
VISORNIC_INFINITE_RSP_WAIT); VISORNIC_INFINITE_RSP_WAIT);
if (response) if (response)
...@@ -741,10 +747,13 @@ visornic_timeout_reset(struct work_struct *work) ...@@ -741,10 +747,13 @@ visornic_timeout_reset(struct work_struct *work)
if (response) if (response)
goto call_serverdown; goto call_serverdown;
rtnl_unlock();
return; return;
call_serverdown: call_serverdown:
visornic_serverdown(devdata, NULL); visornic_serverdown(devdata, NULL);
rtnl_unlock();
} }
/** /**
......
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