qcacld-3.0: Synchronize hdd_driver_unload against other vdev trans
Unloading the driver is a driver transition. As a part of this driver unload, the PLD calls the pld_remove which is a psoc transition. This is the reason why the driver unload is currently not being protected as there is a call to psoc transition within it. This absence of locking can lead to potential deadlock scenario. Assume the example of add_virtual_interface and rmmod coming in parallel. T1: add_virtual_interface (starts a vdev_trans) T2: rmmod comes in parallel -> unregister_driver goes to PLD -> PLD calls pld_remove (psoc_trans waits due to T1) T1: add_virtual_interface continues -> Calls idle_restart that goes to PLD -> PLD waits from pld_remove (T2) to complete first T1 and T2 are waiting for each other to exit resulting in deadlock. To resolve this, add a driver_trans_start_wait to hdd_driver_unload. This will ensure that either the unload waits for all other trans to be completed before proceeding or set the driver_load_unload flag which will result in upcoming trans to get rejected. Change-Id: I64b03843065e5eef7c2be209c1f8cb936bdd0742 CRs-Fixed: 2683032
Loading
Please register or sign in to comment