From: Vinod Koul <vkoul@kernel.org>
To: Jan Kuliga <jankul@alatek.krakow.pl>
Cc: lizhi.hou@amd.com, brian.xu@amd.com, raj.kumar.rampelli@amd.com,
michal.simek@amd.com, dmaengine@vger.kernel.org,
linux-kernel@vger.kernel.org, miquel.raynal@bootlin.com
Subject: Re: [PATCH v4 4/8] dmaengine: xilinx: xdma: Rework xdma_terminate_all()
Date: Mon, 11 Dec 2023 16:24:01 +0530 [thread overview]
Message-ID: <ZXbqSQ9W/VrAA0ZE@matsya> (raw)
In-Reply-To: <20231208134929.49523-5-jankul@alatek.krakow.pl>
On 08-12-23, 14:49, Jan Kuliga wrote:
> Simplify xdma_xfer_stop(). Stop the dma engine and clear its status
> register unconditionally - just do what its name states. This change
> also allows to call it without grabbing a lock, which minimizes
> the total time spent with a spinlock held.
>
> Delete the currently processed vd.node from the vc.desc_issued list
> prior to passing it to vchan_terminate_vdesc(). In case there's more
> than one descriptor pending on vc.desc_issued list, calling
> vchan_terminate_desc() results in losing the link between
> vc.desc_issued list head and the second descriptor on the list. Doing so
> results in resources leakege, as vchan_dma_desc_free_list() won't be
> able to properly free memory resources attached to descriptors,
> resulting in dma_pool_destroy() failure.
>
> Don't call vchan_dma_desc_free_list() from within xdma_terminate_all().
> Move all terminated descriptors to the vc.desc_terminated list instead.
> This allows to postpone freeing memory resources associated with
> descriptors until the call to vchan_synchronize(), which is called from
> xdma_synchronize() callback. This is the right way to do it -
> xdma_terminate_all() should return as soon as possible, while freeing
> resources (that may be time consuming in case of large number of
> descriptors) can be done safely later.
>
> Fixes: 290bb5d2d1e2
> ("dmaengine: xilinx: xdma: Add terminate_all/synchronize callbacks")
>
> Signed-off-by: Jan Kuliga <jankul@alatek.krakow.pl>
> ---
> drivers/dma/xilinx/xdma.c | 32 ++++++++++++++++----------------
> 1 file changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/dma/xilinx/xdma.c b/drivers/dma/xilinx/xdma.c
> index 1bce48e5d86c..521ba2a653b6 100644
> --- a/drivers/dma/xilinx/xdma.c
> +++ b/drivers/dma/xilinx/xdma.c
> @@ -379,20 +379,20 @@ static int xdma_xfer_start(struct xdma_chan *xchan)
> */
> static int xdma_xfer_stop(struct xdma_chan *xchan)
> {
> - struct virt_dma_desc *vd = vchan_next_desc(&xchan->vchan);
> - struct xdma_device *xdev = xchan->xdev_hdl;
> int ret;
> -
> - if (!vd || !xchan->busy)
> - return -EINVAL;
> + u32 val;
> + struct xdma_device *xdev = xchan->xdev_hdl;
>
> /* clear run stop bit to prevent any further auto-triggering */
> ret = regmap_write(xdev->rmap, xchan->base + XDMA_CHAN_CONTROL_W1C,
> - CHAN_CTRL_RUN_STOP);
> + CHAN_CTRL_RUN_STOP);
Why this change, checkpatch would tell you this is not expected
alignment (run with strict)
> if (ret)
> return ret;
>
> - xchan->busy = false;
> + /* Clear the channel status register */
> + ret = regmap_read(xdev->rmap, xchan->base + XDMA_CHAN_STATUS_RC, &val);
> + if (ret)
> + return ret;
>
> return 0;
> }
> @@ -505,25 +505,25 @@ static void xdma_issue_pending(struct dma_chan *chan)
> static int xdma_terminate_all(struct dma_chan *chan)
> {
> struct xdma_chan *xdma_chan = to_xdma_chan(chan);
> - struct xdma_desc *desc = NULL;
> struct virt_dma_desc *vd;
> unsigned long flags;
> LIST_HEAD(head);
>
> - spin_lock_irqsave(&xdma_chan->vchan.lock, flags);
> xdma_xfer_stop(xdma_chan);
>
> + spin_lock_irqsave(&xdma_chan->vchan.lock, flags);
> +
> + xdma_chan->busy = false;
> vd = vchan_next_desc(&xdma_chan->vchan);
> - if (vd)
> - desc = to_xdma_desc(vd);
> - if (desc) {
> - dma_cookie_complete(&desc->vdesc.tx);
> - vchan_terminate_vdesc(&desc->vdesc);
> + if (vd) {
> + list_del(&vd->node);
> + dma_cookie_complete(&vd->tx);
> + vchan_terminate_vdesc(vd);
> }
> -
> vchan_get_all_descriptors(&xdma_chan->vchan, &head);
> + list_splice_tail(&head, &xdma_chan->vchan.desc_terminated);
> +
> spin_unlock_irqrestore(&xdma_chan->vchan.lock, flags);
> - vchan_dma_desc_free_list(&xdma_chan->vchan, &head);
>
> return 0;
> }
> --
> 2.34.1
--
~Vinod
next prev parent reply other threads:[~2023-12-11 10:54 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-08 13:48 [PATCH v4 0/8] Miscellaneous xdma driver enhancements Jan Kuliga
2023-12-08 13:49 ` [PATCH v4 1/8] dmaengine: xilinx: xdma: Get rid of unused code Jan Kuliga
2023-12-08 13:49 ` [PATCH v4 2/8] dmaengine: xilinx: xdma: Add necessary macro definitions Jan Kuliga
2023-12-08 13:49 ` [PATCH v4 3/8] dmaengine: xilinx: xdma: Ease dma_pool alignment requirements Jan Kuliga
2023-12-08 13:49 ` [PATCH v4 4/8] dmaengine: xilinx: xdma: Rework xdma_terminate_all() Jan Kuliga
2023-12-11 10:54 ` Vinod Koul [this message]
2023-12-18 11:52 ` Jan Kuliga
2023-12-08 13:49 ` [PATCH v4 5/8] dmaengine: xilinx: xdma: Add error checking in xdma_channel_isr() Jan Kuliga
2023-12-08 13:49 ` [PATCH v4 6/8] dmaengine: xilinx: xdma: Add transfer error reporting Jan Kuliga
2023-12-08 21:06 ` Lizhi Hou
2023-12-08 22:08 ` [FIXED PATCH " Jan Kuliga
2023-12-11 10:54 ` Vinod Koul
2023-12-08 13:49 ` [PATCH v4 7/8] dmaengine: xilinx: xdma: Prepare the introduction of interleaved DMA transfers Jan Kuliga
2023-12-08 13:49 ` [PATCH v4 8/8] dmaengine: xilinx: xdma: Introduce " Jan Kuliga
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=ZXbqSQ9W/VrAA0ZE@matsya \
--to=vkoul@kernel.org \
--cc=brian.xu@amd.com \
--cc=dmaengine@vger.kernel.org \
--cc=jankul@alatek.krakow.pl \
--cc=linux-kernel@vger.kernel.org \
--cc=lizhi.hou@amd.com \
--cc=michal.simek@amd.com \
--cc=miquel.raynal@bootlin.com \
--cc=raj.kumar.rampelli@amd.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.