qcacld-3.0: Fix deadlock between rtnl lock and vdev ops DSC
The below described scenario can lead to a deadlock
between wlan_hdd_del_virtual_intf and the work handler
to update netdev features.
- netdev features update work is scheduled and takes the
vdev ops DSC lock.
- before the work is able to take the rtnl lock, a delete
interface is called from kernel with rtnl lock held
- wlan_hdd_del_virtual_intf waits indefinitely for all the
ops to be completed on this vdev.
- Now netdev feature update work is waiting for rtnl lock
with vdev ops DSC held, and wlan_hdd_del_virtual_intf is
waiting for vdev ops DSC with rtnl lock held.
In order to fix the above deadlock scenario, set a delete in
progress flag in wlan_hdd_del_virtual_intf and use rtnl_trylock
in the netdev features update work, only if the delete in
progress flag is not set. Using rtnl_trylock with a few equally
time spaced attempts to acquire rtnl lock will make sure the
features update is done it the work is unable to acquire the
rtnl lock due to any other netdev operation (apart from interface
deletion).
Change-Id: Iad6448d4d9bf7f4cbfcfc4c6fb3afb248afaeeec
CRs-Fixed: 2854713
3 files changed