Re: Linux v5.0-rc7: bcm2835 MMC issues

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

 



Hi,

On Sat, Mar 30, 2019 at 02:15:33PM +0100, Stefan Wahren wrote:
> > > [ 1164.390902] 
> > > [ 1164.398302] ======================================================
> > > [ 1164.416501] WARNING: possible circular locking dependency detected
> > > [ 1164.434710] 5.1.0-rc2-rpi3-los_6ba38c+-00247-g9936328b41ce-dirty #1 Not tainted
> > > [ 1164.454495] ------------------------------------------------------
> > > [ 1164.472908] cc1plus/30873 is trying to acquire lock:
> > > [ 1164.489750] 0000000040a8ff57 (&mq->complete_lock){+.+.}, at: mmc_blk_mq_complete_prev_req.part.12+0x3c/0x220
> > > [ 1164.518548] 
> > > [ 1164.518548] but task is already holding lock:
> > > [ 1164.541662] 0000000059d7e9bb (fs_reclaim){+.+.}, at: fs_reclaim_acquire.part.19+0x0/0x40
> > > [ 1164.567105] 
> > > [ 1164.567105] which lock already depends on the new lock.
> > > [ 1164.567105] 
> > > [ 1164.595691] 
> > > [ 1164.595691] the existing dependency chain (in reverse order) is:
> > > [ 1164.616711] 
> > > [ 1164.616711] -> #2 (fs_reclaim){+.+.}:
> > > [ 1164.630507]        lock_acquire+0xe8/0x250
> > > [ 1164.638922]        fs_reclaim_acquire.part.19+0x34/0x40
> > > [ 1164.652170]        fs_reclaim_acquire+0x20/0x28
> > > [ 1164.665139]        __kmalloc+0x50/0x390
> > > [ 1164.673717]        bcm2835_dma_create_cb_chain+0x70/0x270
> >
> > I think the bug is that it's using GFP_KERNEL here.
> 
> Hm, i'm not sure about how to solve this properly. Can you try this,
> because i wasn't able to reproduce this:

Steps to reproduce:
- Enable LOCKDEP (Kernel hacking -> Lock debugging -> prove locking correctness)
- File system and swap on MMC
- Disable watchdog if it's running
- Create a process that eats all memory:

  perl -e ' $x = "foo"; while (1) { $x .= $x } '

The warning shows up almost instantly. Also beware, the system gets
totally stuck in a while, so it seems the deadlock actually happens
(if you enable CONFIG_DETECT_HUNG_TASK it shows MMC is stuck).

> diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c
> index ec8a291..54093ff 100644
> --- a/drivers/dma/bcm2835-dma.c
> +++ b/drivers/dma/bcm2835-dma.c
> @@ -671,7 +671,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep_slave_sg(
>         d = bcm2835_dma_create_cb_chain(chan, direction, false,
>                                         info, extra,
>                                         frames, src, dst, 0, 0,
> -                                       GFP_KERNEL);
> +                                       GFP_NOWAIT);
>         if (!d)
>                 return NULL;

Yeah, that helps. I think bcm2835_dma_prep_dma_memcpy needs it as well,
so bcm2835_dma_create_cb_chain could just always use GFP_NOWAIT. 

A.



[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