scsi: ufs: fix locking in __ufshcd_pm_qos_hold
The function is called with locked spinlock and disabled interrupts which is done in a wrapper function ufshcd_pm_qos_hold(). Before flushing the PM QoS voting work spinlock must be released and interrupts must be restored. As the interrupts flags state is saved in the wrapper function, we cannot restore the state. Moving the locking to the internal function fixes this, which makes the wrapper function redundant so it is deleted. Change-Id: I167292305a25d2b8c3524dcddb51f5a7109444aa Signed-off-by: Gilad Broner <gbroner@codeaurora.org> Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
This commit is contained in:
parent
ebfaba8c84
commit
86f3ac8635
1 changed files with 3 additions and 13 deletions
|
@ -1603,14 +1603,15 @@ static void ufshcd_exit_hibern8_on_idle(struct ufs_hba *hba)
|
|||
#ifdef CONFIG_SMP
|
||||
|
||||
/* Host lock is assumed to be held by caller */
|
||||
static int __ufshcd_pm_qos_hold(struct ufs_hba *hba, bool async)
|
||||
static int ufshcd_pm_qos_hold(struct ufs_hba *hba, bool async)
|
||||
{
|
||||
int ret = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (!hba->pm_qos.cpu_dma_latency_us)
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
hba->pm_qos.active_reqs++;
|
||||
if (hba->pm_qos.is_suspended)
|
||||
goto out;
|
||||
|
@ -1646,18 +1647,7 @@ start:
|
|||
break;
|
||||
}
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ufshcd_pm_qos_hold(struct ufs_hba *hba, bool async)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
ret = __ufshcd_pm_qos_hold(hba, async);
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue