diff options
author | Sujit Reddy Thumma <sthumma@codeaurora.org> | 2013-08-06 11:21:33 +0530 |
---|---|---|
committer | Subhash Jadavani <subhashj@codeaurora.org> | 2016-05-27 10:28:48 -0700 |
commit | 6f092797e7859446617ecfe7668d0b40be932717 (patch) | |
tree | cde79d734f731276dafceee00c65c63371359cec /drivers/mmc | |
parent | 0931642c2067ccadea5af291634c1d9acc764de1 (diff) |
mmc: sdhci-msm: Fix incorrect flags passed during spin_unlock_irqrestore
Fix following bug -
foo_bar1(int arg1, unsigned long flags) {
spin_unlock_irqrestore(lock, flags); // step 1
<do something>;
spin_lock_irqsave(lock, flags); // step 2
}
foo_bar() {
unsinged long flags;
spin_lock_irqsave(lock, flags); // step 3
foo_bar1(arg1, flags);
spin_unlock_irqrestore(lock, flags); // step 4
}
The "flags" might be changed in step 4 due to irqrestore and irqsave
in foo_bar1().
Change-Id: I42366f7acdde022705f4b3dd06122d54ad817078
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/sdhci-msm.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 020677d7ab48..ef7fd50bb56e 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1262,16 +1262,18 @@ static int sdhci_msm_bus_get_vote_for_bw(struct sdhci_msm_host *host, */ static inline int sdhci_msm_bus_set_vote(struct sdhci_msm_host *msm_host, int vote, - unsigned long flags) + unsigned long *flags) { struct sdhci_host *host = platform_get_drvdata(msm_host->pdev); int rc = 0; + BUG_ON(!flags); + if (vote != msm_host->msm_bus_vote.curr_vote) { - spin_unlock_irqrestore(&host->lock, flags); + spin_unlock_irqrestore(&host->lock, *flags); rc = msm_bus_scale_client_update_request( msm_host->msm_bus_vote.client_handle, vote); - spin_lock_irqsave(&host->lock, flags); + spin_lock_irqsave(&host->lock, *flags); if (rc) { pr_err("%s: msm_bus_scale_client_update_request() failed: bus_client_handle=0x%x, vote=%d, err=%d\n", mmc_hostname(host->mmc), @@ -1304,7 +1306,7 @@ static void sdhci_msm_bus_work(struct work_struct *work) /* don't vote for 0 bandwidth if any request is in progress */ if (!host->mrq) { sdhci_msm_bus_set_vote(msm_host, - msm_host->msm_bus_vote.min_bw_vote, flags); + msm_host->msm_bus_vote.min_bw_vote, &flags); } else pr_warning("%s: %s: Transfer in progress. skipping bus voting to 0 bandwidth\n", mmc_hostname(host->mmc), __func__); @@ -1326,7 +1328,7 @@ static void sdhci_msm_bus_cancel_work_and_set_vote(struct sdhci_host *host, cancel_delayed_work_sync(&msm_host->msm_bus_vote.vote_work); spin_lock_irqsave(&host->lock, flags); vote = sdhci_msm_bus_get_vote_for_bw(msm_host, bw); - sdhci_msm_bus_set_vote(msm_host, vote, flags); + sdhci_msm_bus_set_vote(msm_host, vote, &flags); spin_unlock_irqrestore(&host->lock, flags); } |