Re: [PATCH] mmc: renesas_sdhi: sys_dmac: abort DMA synced to avoid timeouts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Wolfram,

Thanks for your work.

On 2021-06-21 09:00:09 +0200, Wolfram Sang wrote:
> When aborting DMA, we terminate the transfer without waiting for it to
> succeed. This may lead to races which can e.g. lead to timeout problems
> when tuning. Remove the deprecated dmaengine_terminate_all() function
> and use the explicit dmaengine_terminate_sync().
> 
> Fixes: e3de2be7368d ("mmc: tmio_mmc: fix card eject during IO with DMA")
> Reported-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>
> Signed-off-by: Wolfram Sang <wsa+renesas@xxxxxxxxxxxxxxxxxxxx>
> ---
> 
> Geert, this fixes the issue you have seen on your Koelsch board on my
> Lager board. Can you test again with this patch please?

I'm not exactly sure what problem Geert is experience but I 
unfortunately have tuning problems on Koelsch. The problem is the same 
with and without this patch however.

I'm trying on-top of v5.13-rc7 with and without this patch and this is 
what I experience.

# Insert card in SD0
[   57.794238] mmc0: new ultra high speed SDR104 SDHC card at address aaaa
[   57.801363] mmcblk0: mmc0:aaaa SL32G 29.7 GiB (ro)
[   57.820427] GPT:partition_entry_array_crc32 values don't match: 0x9ad84b1 != 0xb110df4b
[   57.828456] GPT:Primary header thinks Alt. header is not at the end of the disk.
[   57.835901] GPT:11526300 != 62333951
[   57.839484] GPT:Alternate GPT header not at the end of the disk.
[   57.845514] GPT:11526300 != 62333951
[   57.849093] GPT: Use GNU Parted to correct GPT errors.
[   57.854306]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12

# Eject card and insert it in SD1
[   70.261657] mmc0: tuning execution failed: -5
[   70.266377] mmc0: card aaaa removed
[   77.769959] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD52)
[   82.889951] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD52)
[   88.009948] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD0)
[   93.129966] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD8)
[   98.249955] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  103.369944] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  108.489946] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  113.609921] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  118.729885] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
[  123.849848] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
[  128.969823] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
[  134.089817] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
[  139.209774] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD1)
[  144.409755] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD52)
[  149.529735] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware 
interrupt (CMD52)
[  154.649720] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD0)
[  159.769709] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD8)
[  164.889693] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  170.009685] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  175.129729] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  180.249673] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  185.369656] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
[  190.489650] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
[  195.609654] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
[  200.729631] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
[  205.849630] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD1)
[  211.049615] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD52)
[  216.169621] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD52)
[  221.289616] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD0)
[  226.409611] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD8)
[  231.529605] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  236.649600] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  241.769580] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  246.889543] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD5)
[  252.009503] sh_mobile_sdhi ee140000.mmc: timeout waiting for hardware interrupt (CMD55)
... timeout messages continue ...

The experience is the same if I directly insert the card in SD1 after a 
reset, I only included the SD0 cycle to verify the card itself is good.

I tested on v5.12 and there the card works but is identified as SDR50,

# Insert into SD1
[  102.667405] mmc0: new ultra high speed SDR50 SDHC card at address aaaa
[  102.676211] mmcblk0: mmc0:aaaa SL32G 29.7 GiB (ro)
[  102.695241] GPT:partition_entry_array_crc32 values don't match: 0x9ad84b1 != 0xb110df4b
[  102.703312] GPT:Primary header thinks Alt. header is not at the end of the disk.
[  102.710754] GPT:11526300 != 62333951
[  102.714335] GPT:Alternate GPT header not at the end of the disk.
[  102.720360] GPT:11526300 != 62333951
[  102.723937] GPT: Use GNU Parted to correct GPT errors.
[  102.729158]  mmcblk0: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12

Maybe there are more then one patch needed to fix this? Should I rerun 
my test on a different base?

> 
> I noticed that Renesas driver are quite an active user of this
> deprecated dmaengine function. I will audit and improve the other
> drivers meanwhile.
> 
>  drivers/mmc/host/renesas_sdhi_sys_dmac.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
> index ffa64211f4de..6956b83469c8 100644
> --- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c
> +++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
> @@ -108,9 +108,9 @@ static void renesas_sdhi_sys_dmac_abort_dma(struct tmio_mmc_host *host)
>  	renesas_sdhi_sys_dmac_enable_dma(host, false);
>  
>  	if (host->chan_rx)
> -		dmaengine_terminate_all(host->chan_rx);
> +		dmaengine_terminate_sync(host->chan_rx);
>  	if (host->chan_tx)
> -		dmaengine_terminate_all(host->chan_tx);
> +		dmaengine_terminate_sync(host->chan_tx);
>  
>  	renesas_sdhi_sys_dmac_enable_dma(host, true);
>  }
> -- 
> 2.30.2
> 

-- 
Regards,
Niklas Söderlund



[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux