In the Linux kernel, the following vulnerability has been resolved:
e1000: Move cancelworksync to avoid deadlock
Previously, e1000down called cancelworksync for the e1000 reset task (via e1000downandstop), which takes RTNL.
As reported by users and syzbot, a deadlock is possible in the following scenario:
CPU 0: - RTNL is held - e1000close - e1000down - cancelworksync (cancel / wait for e1000resettask())
CPU 1: - processonework - e1000resettask - take RTNL
To remedy this, avoid calling cancelworksync from e1000down (e1000resettask does nothing if the device is down anyway). Instead, call cancelworksync for e1000reset_task when the device is being removed.