• Peter Wang's avatar
    scsi: ufs: core: Fix abnormal scale up after last cmd finish · 6fd53da4
    Peter Wang authored
    
    
    When ufshcd_clk_scaling_suspend_work (thread A) running and new command
    coming, ufshcd_clk_scaling_start_busy (thread B) may get host_lock after
    thread A first time release host_lock. Then thread A second time get
    host_lock will set clk_scaling.window_start_t = 0 which scale up clock
    abnormal next polling_ms time.  Also inlines another
    __ufshcd_suspend_clkscaling calls.
    
    Below is racing step:
    1	hba->clk_scaling.suspend_work (Thread A)
    	ufshcd_clk_scaling_suspend_work
    2		spin_lock_irqsave(hba->host->host_lock, irq_flags);
    3		hba->clk_scaling.is_suspended = true;
    4		spin_unlock_irqrestore(hba->host->host_lock, irq_flags);
    		__ufshcd_suspend_clkscaling
    7			spin_lock_irqsave(hba->host->host_lock, flags);
    8			hba->clk_scaling.window_start_t = 0;
    9			spin_unlock_irqrestore(hba->host->host_lock, flags);
    
    	ufshcd_send_command (Thread B)
    		ufshcd_clk_scaling_start_busy
    5			spin_lock_irqsave(hba->host->host_lock, flags);
    			....
    6			spin_unlock_irqrestore(hba->host->host_lock, flags);
    Signed-off-by: default avatarPeter Wang <peter.wang@mediatek.com>
    Link: https://lore.kernel.org/r/20230831130826.5592-3-peter.wang@mediatek.com
    
    Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    6fd53da4
ufshcd.c 286 KB