scsi: ufs: fix a race condition between err handler and clock gate work
During clock gating, if hibern8 enter fails, driver shall schedule error
handler work and wait on its completion. In error handler, if the state of
clock is not CLKS_ON, which is the case here, it shall ungate the clock and
wait on completion. Thus it would run into below race condition. It is not
necessary to ungate clock for this situation, because the clocks are still
ON before hibern8 completes. This change fixes this race condition by
skipping ungate clock action in error handler if the error handler is
scheduled because of hibern8 enter failure during clock gating.
Process: kworker/u16:11, cpu: 0 pid: 542 start: 0xffffffdce1f05580
Task name: kworker/u16:11 pid: 542 cpu: 0
state: 0x2 exit_state: 0x0 stack base: 0xffffff801ac18000
Stack:
[<ffffff8ac5a85d2c>] __switch_to+0xb8
[<ffffff8ac6a7e654>] __schedule+0x690
[<ffffff8ac6a7e8cc>] schedule+0x70
[<ffffff8ac6a82218>] schedule_timeout+0x44
[<ffffff8ac6a7fc5c>] do_wait_for_common+0xf0
[<ffffff8ac6a7f970>] wait_for_common+0x58
[<ffffff8ac6a7f90c>] wait_for_completion+0x24
[<ffffff8ac5acd0fc>] flush_work+0x180
[<ffffff8ac6241af4>] ufshcd_link_recovery+0xfc
[<ffffff8ac6241384>] ufshcd_uic_hibern8_enter+0x254
[<ffffff8ac624cf74>] ufshcd_gate_work+0xc8
[<ffffff8ac5ad0f28>] process_one_work+0x1c0
[<ffffff8ac5ad13d4>] worker_thread+0x224
[<ffffff8ac5ad627c>] kthread+0x120
[<ffffff8ac5a84bd8>] ret_from_fork+0x10
Process: kworker/0:1, cpu: 0 pid: 81 start: 0xffffffdcf4f32280
Task name: kworker/0:1 pid: 81 cpu: 0
state: 0x2 exit_state: 0x0 stack base: 0xffffff8008418000
Stack:
[<ffffff8ac5a85d2c>] __switch_to+0xb8
[<ffffff8ac6a7e654>] __schedule+0x690
[<ffffff8ac6a7e8cc>] schedule+0x70
[<ffffff8ac6a82218>] schedule_timeout+0x44
[<ffffff8ac6a7fc5c>] do_wait_for_common+0xf0
[<ffffff8ac6a7f970>] wait_for_common+0x58
[<ffffff8ac6a7f90c>] wait_for_completion+0x24
[<ffffff8ac5acd0fc>] flush_work+0x180
[<ffffff8ac623f6b0>] ufshcd_hold+0x1cc
[<ffffff8ac62447e8>] ufshcd_err_handler+0x71c
[<ffffff8ac5ad0f28>] process_one_work+0x1c0
[<ffffff8ac5ad13d4>] worker_thread+0x224
[<ffffff8ac5ad627c>] kthread+0x120
[<ffffff8ac5a84bd8>] ret_from_fork+0x10
Change-Id: I480ec14a24b4d4f7b10877b478facf744141d7e6
Signed-off-by:
Can Guo <cang@codeaurora.org>
Loading
Please register or sign in to comment