All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vinod Koul <vinod.koul@intel.com>
To: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Cc: dmaengine@vger.kernel.org, linux-renesas-soc@vger.kernel.org
Subject: dmaengine: rcar-dmac: Check the done lists in rcar_dmac_chan_get_residue()
Date: Mon, 5 Mar 2018 16:59:45 +0530	[thread overview]
Message-ID: <20180305112945.GO15443@localhost> (raw)

On Fri, Feb 02, 2018 at 07:05:15PM +0900, Yoshihiro Shimoda wrote:
> This patch fixes an issue that a race condition happens between a client
> driver and the rcar-dmac driver:
> 
> - The rcar_dmac_isr_transfer_end() is called.
>  - The done list appears, and desc.running is the next active list.
> - rcar_dmac_chan_get_residue() is called by a client driver before
>   rcar_dmac_isr_channel_thread() is called.
>  - The rcar_dmac_chan_get_residue() will not find any descriptors.
>  - And, the following WARNING happens:
> 	WARN(1, "No descriptor for cookie!");
> 
> The sh-sci driver with HSCIF (921,600bps) on R-Car H3 can cause this
> situation.
> So, this patch checks the done lists in rcar_dmac_chan_get_residue()
> and returns zero if the done lists has the argument cookie.

Applied, thanks

> 
> Tested-by: Nguyen Viet Dung <dung.nguyen.aj@renesas.com>
> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
> ---
>  drivers/dma/sh/rcar-dmac.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
> index 2b2c7db..f748be6 100644
> --- a/drivers/dma/sh/rcar-dmac.c
> +++ b/drivers/dma/sh/rcar-dmac.c
> @@ -1264,8 +1264,17 @@ static unsigned int rcar_dmac_chan_get_residue(struct rcar_dmac_chan *chan,
>  	 * If the cookie doesn't correspond to the currently running transfer
>  	 * then the descriptor hasn't been processed yet, and the residue is
>  	 * equal to the full descriptor size.
> +	 * Also, a client driver is possible to call this function before
> +	 * rcar_dmac_isr_channel_thread() runs. In this case, the "desc.running"
> +	 * will be the next descriptor, and the done list will appear. So, if
> +	 * the argument cookie matches the done list's cookie, we can assume
> +	 * the residue is zero.
>  	 */
>  	if (cookie != desc->async_tx.cookie) {
> +		list_for_each_entry(desc, &chan->desc.done, node) {
> +			if (cookie == desc->async_tx.cookie)
> +				return 0;
> +		}
>  		list_for_each_entry(desc, &chan->desc.pending, node) {
>  			if (cookie == desc->async_tx.cookie)
>  				return desc->size;
> -- 
> 1.9.1
>

WARNING: multiple messages have this Message-ID (diff)
From: Vinod Koul <vinod.koul@intel.com>
To: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Cc: dmaengine@vger.kernel.org, linux-renesas-soc@vger.kernel.org
Subject: Re: [PATCH] dmaengine: rcar-dmac: Check the done lists in rcar_dmac_chan_get_residue()
Date: Mon, 5 Mar 2018 16:59:45 +0530	[thread overview]
Message-ID: <20180305112945.GO15443@localhost> (raw)
In-Reply-To: <1517565915-14234-1-git-send-email-yoshihiro.shimoda.uh@renesas.com>

On Fri, Feb 02, 2018 at 07:05:15PM +0900, Yoshihiro Shimoda wrote:
> This patch fixes an issue that a race condition happens between a client
> driver and the rcar-dmac driver:
> 
> - The rcar_dmac_isr_transfer_end() is called.
>  - The done list appears, and desc.running is the next active list.
> - rcar_dmac_chan_get_residue() is called by a client driver before
>   rcar_dmac_isr_channel_thread() is called.
>  - The rcar_dmac_chan_get_residue() will not find any descriptors.
>  - And, the following WARNING happens:
> 	WARN(1, "No descriptor for cookie!");
> 
> The sh-sci driver with HSCIF (921,600bps) on R-Car H3 can cause this
> situation.
> So, this patch checks the done lists in rcar_dmac_chan_get_residue()
> and returns zero if the done lists has the argument cookie.

Applied, thanks

> 
> Tested-by: Nguyen Viet Dung <dung.nguyen.aj@renesas.com>
> Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
> ---
>  drivers/dma/sh/rcar-dmac.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c
> index 2b2c7db..f748be6 100644
> --- a/drivers/dma/sh/rcar-dmac.c
> +++ b/drivers/dma/sh/rcar-dmac.c
> @@ -1264,8 +1264,17 @@ static unsigned int rcar_dmac_chan_get_residue(struct rcar_dmac_chan *chan,
>  	 * If the cookie doesn't correspond to the currently running transfer
>  	 * then the descriptor hasn't been processed yet, and the residue is
>  	 * equal to the full descriptor size.
> +	 * Also, a client driver is possible to call this function before
> +	 * rcar_dmac_isr_channel_thread() runs. In this case, the "desc.running"
> +	 * will be the next descriptor, and the done list will appear. So, if
> +	 * the argument cookie matches the done list's cookie, we can assume
> +	 * the residue is zero.
>  	 */
>  	if (cookie != desc->async_tx.cookie) {
> +		list_for_each_entry(desc, &chan->desc.done, node) {
> +			if (cookie == desc->async_tx.cookie)
> +				return 0;
> +		}
>  		list_for_each_entry(desc, &chan->desc.pending, node) {
>  			if (cookie == desc->async_tx.cookie)
>  				return desc->size;
> -- 
> 1.9.1
> 

-- 
~Vinod

             reply	other threads:[~2018-03-05 11:29 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-05 11:29 Vinod Koul [this message]
2018-03-05 11:29 ` [PATCH] dmaengine: rcar-dmac: Check the done lists in rcar_dmac_chan_get_residue() Vinod Koul
  -- strict thread matches above, loose matches on Subject: below --
2018-03-01  5:39 Yoshihiro Shimoda
2018-03-01  5:39 ` [PATCH] " Yoshihiro Shimoda
2018-02-02 10:05 Yoshihiro Shimoda
2018-02-02 10:05 ` [PATCH] " Yoshihiro Shimoda

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=20180305112945.GO15443@localhost \
    --to=vinod.koul@intel.com \
    --cc=dmaengine@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=yoshihiro.shimoda.uh@renesas.com \
    /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.