diff mbox series

[1/1] mmc: imx: fix kernel panic when remove module.

Message ID 20210210181933.29263-1-Frank.Li@nxp.com
State New
Headers show
Series [1/1] mmc: imx: fix kernel panic when remove module. | expand

Commit Message

Frank Li Feb. 10, 2021, 6:19 p.m. UTC
sdhci_esdhc_imx_remove access a register before pm_runtime_get_sync
the clock may be closed by runtime pm when remove module.

Access register should be after pm_runtime_get_sync.

reduce pm_runtime_set_autosuspend_delay time can increase problem
reproduce rate.

[ 1811.323148] mmc1: card aaaa removed
[ 1811.347483] Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP
[ 1811.354988] Modules linked in: sdhci_esdhc_imx(-) sdhci_pltfm sdhci cqhci mmc_block mmc_core [last unloaded: mmc_core]
[ 1811.365726] CPU: 0 PID: 3464 Comm: rmmod Not tainted 5.10.1-sd-99871-g53835a2e8186 #5
[ 1811.373559] Hardware name: Freescale i.MX8DXL EVK (DT)
[ 1811.378705] pstate: 60000005 (nZCv daif -PAN -UAO -TCO BTYPE=--)
[ 1811.384723] pc : sdhci_esdhc_imx_remove+0x28/0x15c [sdhci_esdhc_imx]
[ 1811.391090] lr : platform_drv_remove+0x2c/0x50
[ 1811.395536] sp : ffff800012c7bcb0
[ 1811.398855] x29: ffff800012c7bcb0 x28: ffff00002c72b900
[ 1811.404181] x27: 0000000000000000 x26: 0000000000000000
[ 1811.409497] x25: 0000000000000000 x24: 0000000000000000
[ 1811.414814] x23: ffff0000042b3890 x22: ffff800009127120
[ 1811.420131] x21: ffff00002c4c9580 x20: ffff0000042d0810
[ 1811.425456] x19: ffff0000042d0800 x18: 0000000000000020
[ 1811.430773] x17: 0000000000000000 x16: 0000000000000000
[ 1811.436089] x15: 0000000000000004 x14: ffff000004019c10
[ 1811.441406] x13: 0000000000000000 x12: 0000000000000020
[ 1811.446723] x11: 0101010101010101 x10: 7f7f7f7f7f7f7f7f
[ 1811.452040] x9 : fefefeff6364626d x8 : 7f7f7f7f7f7f7f7f
[ 1811.457356] x7 : 78725e6473607372 x6 : 0000000080808080
[ 1811.462673] x5 : 0000000000000000 x4 : 0000000000000000
[ 1811.467990] x3 : ffff800011ac1cb0 x2 : 0000000000000000
[ 1811.473307] x1 : ffff8000091214d4 x0 : ffff8000133a0030
[ 1811.478624] Call trace:
[ 1811.481081]  sdhci_esdhc_imx_remove+0x28/0x15c [sdhci_esdhc_imx]
[ 1811.487098]  platform_drv_remove+0x2c/0x50
[ 1811.491198]  __device_release_driver+0x188/0x230
[ 1811.495818]  driver_detach+0xc0/0x14c
[ 1811.499487]  bus_remove_driver+0x5c/0xb0
[ 1811.503413]  driver_unregister+0x30/0x60
[ 1811.507341]  platform_driver_unregister+0x14/0x20
[ 1811.512048]  sdhci_esdhc_imx_driver_exit+0x1c/0x3a8 [sdhci_esdhc_imx]
[ 1811.518495]  __arm64_sys_delete_module+0x19c/0x230
[ 1811.523291]  el0_svc_common.constprop.0+0x78/0x1a0
[ 1811.528086]  do_el0_svc+0x24/0x90
[ 1811.531405]  el0_svc+0x14/0x20
[ 1811.534461]  el0_sync_handler+0x1a4/0x1b0
[ 1811.538474]  el0_sync+0x174/0x180
[ 1811.541801] Code: a9025bf5 f9403e95 f9400ea0 9100c000 (b9400000)
[ 1811.547902] ---[ end trace 3fb1a3bd48ff7be5 ]---

Signed-off-by: Frank Li <Frank.Li@nxp.com>
---
 drivers/mmc/host/sdhci-esdhc-imx.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Ulf Hansson Feb. 12, 2021, 12:20 p.m. UTC | #1
On Wed, 10 Feb 2021 at 19:19, Frank Li <Frank.Li@nxp.com> wrote:
>

> sdhci_esdhc_imx_remove access a register before pm_runtime_get_sync

> the clock may be closed by runtime pm when remove module.

>

> Access register should be after pm_runtime_get_sync.

>

> reduce pm_runtime_set_autosuspend_delay time can increase problem

> reproduce rate.

>

> [ 1811.323148] mmc1: card aaaa removed

> [ 1811.347483] Internal error: synchronous external abort: 96000210 [#1] PREEMPT SMP

> [ 1811.354988] Modules linked in: sdhci_esdhc_imx(-) sdhci_pltfm sdhci cqhci mmc_block mmc_core [last unloaded: mmc_core]

> [ 1811.365726] CPU: 0 PID: 3464 Comm: rmmod Not tainted 5.10.1-sd-99871-g53835a2e8186 #5

> [ 1811.373559] Hardware name: Freescale i.MX8DXL EVK (DT)

> [ 1811.378705] pstate: 60000005 (nZCv daif -PAN -UAO -TCO BTYPE=--)

> [ 1811.384723] pc : sdhci_esdhc_imx_remove+0x28/0x15c [sdhci_esdhc_imx]

> [ 1811.391090] lr : platform_drv_remove+0x2c/0x50

> [ 1811.395536] sp : ffff800012c7bcb0

> [ 1811.398855] x29: ffff800012c7bcb0 x28: ffff00002c72b900

> [ 1811.404181] x27: 0000000000000000 x26: 0000000000000000

> [ 1811.409497] x25: 0000000000000000 x24: 0000000000000000

> [ 1811.414814] x23: ffff0000042b3890 x22: ffff800009127120

> [ 1811.420131] x21: ffff00002c4c9580 x20: ffff0000042d0810

> [ 1811.425456] x19: ffff0000042d0800 x18: 0000000000000020

> [ 1811.430773] x17: 0000000000000000 x16: 0000000000000000

> [ 1811.436089] x15: 0000000000000004 x14: ffff000004019c10

> [ 1811.441406] x13: 0000000000000000 x12: 0000000000000020

> [ 1811.446723] x11: 0101010101010101 x10: 7f7f7f7f7f7f7f7f

> [ 1811.452040] x9 : fefefeff6364626d x8 : 7f7f7f7f7f7f7f7f

> [ 1811.457356] x7 : 78725e6473607372 x6 : 0000000080808080

> [ 1811.462673] x5 : 0000000000000000 x4 : 0000000000000000

> [ 1811.467990] x3 : ffff800011ac1cb0 x2 : 0000000000000000

> [ 1811.473307] x1 : ffff8000091214d4 x0 : ffff8000133a0030

> [ 1811.478624] Call trace:

> [ 1811.481081]  sdhci_esdhc_imx_remove+0x28/0x15c [sdhci_esdhc_imx]

> [ 1811.487098]  platform_drv_remove+0x2c/0x50

> [ 1811.491198]  __device_release_driver+0x188/0x230

> [ 1811.495818]  driver_detach+0xc0/0x14c

> [ 1811.499487]  bus_remove_driver+0x5c/0xb0

> [ 1811.503413]  driver_unregister+0x30/0x60

> [ 1811.507341]  platform_driver_unregister+0x14/0x20

> [ 1811.512048]  sdhci_esdhc_imx_driver_exit+0x1c/0x3a8 [sdhci_esdhc_imx]

> [ 1811.518495]  __arm64_sys_delete_module+0x19c/0x230

> [ 1811.523291]  el0_svc_common.constprop.0+0x78/0x1a0

> [ 1811.528086]  do_el0_svc+0x24/0x90

> [ 1811.531405]  el0_svc+0x14/0x20

> [ 1811.534461]  el0_sync_handler+0x1a4/0x1b0

> [ 1811.538474]  el0_sync+0x174/0x180

> [ 1811.541801] Code: a9025bf5 f9403e95 f9400ea0 9100c000 (b9400000)

> [ 1811.547902] ---[ end trace 3fb1a3bd48ff7be5 ]---

>

> Signed-off-by: Frank Li <Frank.Li@nxp.com>


Applied for next and by adding a stable tag, thanks!

Kind regards
Uffe


> ---

>  drivers/mmc/host/sdhci-esdhc-imx.c | 3 ++-

>  1 file changed, 2 insertions(+), 1 deletion(-)

>

> diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c

> index 16732759bfb0..4da4f4734641 100644

> --- a/drivers/mmc/host/sdhci-esdhc-imx.c

> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c

> @@ -1791,9 +1791,10 @@ static int sdhci_esdhc_imx_remove(struct platform_device *pdev)

>         struct sdhci_host *host = platform_get_drvdata(pdev);

>         struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);

>         struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);

> -       int dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);

> +       int dead;

>

>         pm_runtime_get_sync(&pdev->dev);

> +       dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);

>         pm_runtime_disable(&pdev->dev);

>         pm_runtime_put_noidle(&pdev->dev);

>

> --

> 2.24.0.rc1

>
diff mbox series

Patch

diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
index 16732759bfb0..4da4f4734641 100644
--- a/drivers/mmc/host/sdhci-esdhc-imx.c
+++ b/drivers/mmc/host/sdhci-esdhc-imx.c
@@ -1791,9 +1791,10 @@  static int sdhci_esdhc_imx_remove(struct platform_device *pdev)
 	struct sdhci_host *host = platform_get_drvdata(pdev);
 	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
 	struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
-	int dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);
+	int dead;
 
 	pm_runtime_get_sync(&pdev->dev);
+	dead = (readl(host->ioaddr + SDHCI_INT_STATUS) == 0xffffffff);
 	pm_runtime_disable(&pdev->dev);
 	pm_runtime_put_noidle(&pdev->dev);