From: Vinod Koul <vkoul@kernel.org>
To: Leonid Iziumtsev <leonid.iziumtsev@gmail.com>,
Fabio Estevam <festevam@gmail.com>
Cc: dmaengine@vger.kernel.org,
Dan Williams <dan.j.williams@intel.com>,
linux-kernel@vger.kernel.org, m.grzeschik@pengutronix.de
Subject: dmaengine: imx-dma: fix wrong callback invoke
Date: Sun, 20 Jan 2019 16:22:57 +0530 [thread overview]
Message-ID: <20190120105257.GP4635@vkoul-mobl> (raw)
On 15-01-19, 17:15, Leonid Iziumtsev wrote:
> Once the "ld_queue" list is not empty, next descriptor will migrate
> into "ld_active" list. The "desc" variable will be overwritten
> during that transition. And later the dmaengine_desc_get_callback_invoke()
> will use it as an argument. As result we invoke wrong callback.
>
> That behaviour was in place since:
> commit fcaaba6c7136 ("dmaengine: imx-dma: fix callback path in tasklet").
> But after commit 4cd13c21b207 ("softirq: Let ksoftirqd do its job")
> things got worse, since possible delay between tasklet_schedule()
> from DMA irq handler and actual tasklet function execution got bigger.
> And that gave more time for new DMA request to be submitted and
> to be put into "ld_queue" list.
>
> It has been noticed that DMA issue is causing problems for "mxc-mmc"
> driver. While stressing the system with heavy network traffic and
> writing/reading to/from sd card simultaneously the timeout may happen:
>
> 10013000.sdhci: mxcmci_watchdog: read time out (status = 0x30004900)
>
> That often lead to file system corruption.
This looks reasonable to me and I think should go to stable as well.
Fabio can we get some testing done on this patch
>
> Signed-off-by: Leonid Iziumtsev <leonid.iziumtsev@gmail.com>
> ---
> drivers/dma/imx-dma.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
> index c2fff3f6c9ca..4a09af3cd546 100644
> --- a/drivers/dma/imx-dma.c
> +++ b/drivers/dma/imx-dma.c
> @@ -618,7 +618,7 @@ static void imxdma_tasklet(unsigned long data)
> {
> struct imxdma_channel *imxdmac = (void *)data;
> struct imxdma_engine *imxdma = imxdmac->imxdma;
> - struct imxdma_desc *desc;
> + struct imxdma_desc *desc, *next_desc;
> unsigned long flags;
>
> spin_lock_irqsave(&imxdma->lock, flags);
> @@ -648,10 +648,10 @@ static void imxdma_tasklet(unsigned long data)
> list_move_tail(imxdmac->ld_active.next, &imxdmac->ld_free);
>
> if (!list_empty(&imxdmac->ld_queue)) {
> - desc = list_first_entry(&imxdmac->ld_queue, struct imxdma_desc,
> - node);
> + next_desc = list_first_entry(&imxdmac->ld_queue,
> + struct imxdma_desc, node);
> list_move_tail(imxdmac->ld_queue.next, &imxdmac->ld_active);
> - if (imxdma_xfer_desc(desc) < 0)
> + if (imxdma_xfer_desc(next_desc) < 0)
> dev_warn(imxdma->dev, "%s: channel: %d couldn't xfer desc\n",
> __func__, imxdmac->channel);
> }
> --
> 2.11.0
WARNING: multiple messages have this Message-ID (diff)
From: Vinod Koul <vkoul@kernel.org>
To: Leonid Iziumtsev <leonid.iziumtsev@gmail.com>,
Fabio Estevam <festevam@gmail.com>
Cc: dmaengine@vger.kernel.org,
Dan Williams <dan.j.williams@intel.com>,
linux-kernel@vger.kernel.org, m.grzeschik@pengutronix.de
Subject: Re: [PATCH] dmaengine: imx-dma: fix wrong callback invoke
Date: Sun, 20 Jan 2019 16:22:57 +0530 [thread overview]
Message-ID: <20190120105257.GP4635@vkoul-mobl> (raw)
In-Reply-To: <20190115171523.702-1-leonid.iziumtsev@gmail.com>
On 15-01-19, 17:15, Leonid Iziumtsev wrote:
> Once the "ld_queue" list is not empty, next descriptor will migrate
> into "ld_active" list. The "desc" variable will be overwritten
> during that transition. And later the dmaengine_desc_get_callback_invoke()
> will use it as an argument. As result we invoke wrong callback.
>
> That behaviour was in place since:
> commit fcaaba6c7136 ("dmaengine: imx-dma: fix callback path in tasklet").
> But after commit 4cd13c21b207 ("softirq: Let ksoftirqd do its job")
> things got worse, since possible delay between tasklet_schedule()
> from DMA irq handler and actual tasklet function execution got bigger.
> And that gave more time for new DMA request to be submitted and
> to be put into "ld_queue" list.
>
> It has been noticed that DMA issue is causing problems for "mxc-mmc"
> driver. While stressing the system with heavy network traffic and
> writing/reading to/from sd card simultaneously the timeout may happen:
>
> 10013000.sdhci: mxcmci_watchdog: read time out (status = 0x30004900)
>
> That often lead to file system corruption.
This looks reasonable to me and I think should go to stable as well.
Fabio can we get some testing done on this patch
>
> Signed-off-by: Leonid Iziumtsev <leonid.iziumtsev@gmail.com>
> ---
> drivers/dma/imx-dma.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/dma/imx-dma.c b/drivers/dma/imx-dma.c
> index c2fff3f6c9ca..4a09af3cd546 100644
> --- a/drivers/dma/imx-dma.c
> +++ b/drivers/dma/imx-dma.c
> @@ -618,7 +618,7 @@ static void imxdma_tasklet(unsigned long data)
> {
> struct imxdma_channel *imxdmac = (void *)data;
> struct imxdma_engine *imxdma = imxdmac->imxdma;
> - struct imxdma_desc *desc;
> + struct imxdma_desc *desc, *next_desc;
> unsigned long flags;
>
> spin_lock_irqsave(&imxdma->lock, flags);
> @@ -648,10 +648,10 @@ static void imxdma_tasklet(unsigned long data)
> list_move_tail(imxdmac->ld_active.next, &imxdmac->ld_free);
>
> if (!list_empty(&imxdmac->ld_queue)) {
> - desc = list_first_entry(&imxdmac->ld_queue, struct imxdma_desc,
> - node);
> + next_desc = list_first_entry(&imxdmac->ld_queue,
> + struct imxdma_desc, node);
> list_move_tail(imxdmac->ld_queue.next, &imxdmac->ld_active);
> - if (imxdma_xfer_desc(desc) < 0)
> + if (imxdma_xfer_desc(next_desc) < 0)
> dev_warn(imxdma->dev, "%s: channel: %d couldn't xfer desc\n",
> __func__, imxdmac->channel);
> }
> --
> 2.11.0
--
~Vinod
next reply other threads:[~2019-01-20 10:52 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-20 10:52 Vinod Koul [this message]
2019-01-20 10:52 ` [PATCH] dmaengine: imx-dma: fix wrong callback invoke Vinod Koul
-- strict thread matches above, loose matches on Subject: below --
2019-02-04 7:06 Vinod Koul
2019-02-04 7:06 ` [PATCH] " Vinod Koul
2019-01-23 11:43 Fabio Estevam
2019-01-23 11:43 ` [PATCH] " Fabio Estevam
2019-01-15 17:15 Leonid Iziumtsev
2019-01-15 17:15 ` [PATCH] " Leonid Iziumtsev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190120105257.GP4635@vkoul-mobl \
--to=vkoul@kernel.org \
--cc=dan.j.williams@intel.com \
--cc=dmaengine@vger.kernel.org \
--cc=festevam@gmail.com \
--cc=leonid.iziumtsev@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=m.grzeschik@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.