| From 572eaabac066d032fd59a16a980b2c86cc7c643c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 22 Aug 2020 11:45:28 +0530 |
| Subject: mmc: via-sdmmc: Fix data race bug |
| |
| From: Madhuparna Bhowmik <madhuparnabhowmik10@gmail.com> |
| |
| [ Upstream commit 87d7ad089b318b4f319bf57f1daa64eb6d1d10ad ] |
| |
| via_save_pcictrlreg() should be called with host->lock held |
| as it writes to pm_pcictrl_reg, otherwise there can be a race |
| condition between via_sd_suspend() and via_sdc_card_detect(). |
| The same pattern is used in the function via_reset_pcictrl() |
| as well, where via_save_pcictrlreg() is called with host->lock |
| held. |
| |
| Found by Linux Driver Verification project (linuxtesting.org). |
| |
| Signed-off-by: Madhuparna Bhowmik <madhuparnabhowmik10@gmail.com> |
| Link: https://lore.kernel.org/r/20200822061528.7035-1-madhuparnabhowmik10@gmail.com |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mmc/host/via-sdmmc.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/mmc/host/via-sdmmc.c b/drivers/mmc/host/via-sdmmc.c |
| index 49dab9f42b6d6..9b755ea0fa03c 100644 |
| --- a/drivers/mmc/host/via-sdmmc.c |
| +++ b/drivers/mmc/host/via-sdmmc.c |
| @@ -1257,11 +1257,14 @@ static void __maybe_unused via_init_sdc_pm(struct via_crdr_mmc_host *host) |
| static int __maybe_unused via_sd_suspend(struct device *dev) |
| { |
| struct via_crdr_mmc_host *host; |
| + unsigned long flags; |
| |
| host = dev_get_drvdata(dev); |
| |
| + spin_lock_irqsave(&host->lock, flags); |
| via_save_pcictrlreg(host); |
| via_save_sdcreg(host); |
| + spin_unlock_irqrestore(&host->lock, flags); |
| |
| device_wakeup_enable(dev); |
| |
| -- |
| 2.27.0 |
| |