• Venkat Gopalakrishnan's avatar
    scsi: ufshcd: Fix race between clk scaling and ungate work · f2a785ac
    Venkat Gopalakrishnan authored
    The ungate work turns on the clock before it exits hibern8, if the link
    was put in hibern8 during clock gating work.  There occurs a race
    condition when clock scaling work calls ufshcd_hold() to make sure low
    power states cannot be entered, but that returns by checking only
    whether the clocks are on.  This causes the clock scaling work to issue
    UIC commands when the link is in hibern8 causing failures. Make sure we
    exit hibern8 state before returning from ufshcd_hold().
    
    Callstacks for race condition:
    
     ufshcd_scale_gear
     ufshcd_devfreq_scale
     ufshcd_devfreq_target
     update_devfreq
     devfreq_monitor
     process_one_work
     worker_thread
     kthread
     ret_from_fork
    
     ufshcd_uic_hibern8_exit
     ufshcd_ungate_work
     process_one_work
     worker_thread
     kthread
     ret_from_fork
    Signed-off-by: default avatarVenkat Gopalakrishnan <venkatg@codeaurora.org>
    Signed-off-by: default avatarSubhash Jadavani <subhashj@codeaurora.org>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    f2a785ac
ufshcd.c 172 KB