From: Tudor Ambarus <tudor.ambarus@microchip.com> To: <vkoul@kernel.org>, <peda@axentia.se>, <du@axentia.se> Cc: <maciej.sosnowski@intel.com>, <nicolas.ferre@microchip.com>, <mripard@kernel.org>, <torfl6749@gmail.com>, <linux-kernel@vger.kernel.org>, <dmaengine@vger.kernel.org>, <linux-arm-kernel@lists.infradead.org>, "Tudor Ambarus" <tudor.ambarus@microchip.com>, <stable@vger.kernel.org> Subject: [PATCH v2 04/32] dmaengine: at_hdmac: Fix premature completion of desc in issue_pending Date: Tue, 25 Oct 2022 12:02:38 +0300 [thread overview] Message-ID: <20221025090306.297886-5-tudor.ambarus@microchip.com> (raw) In-Reply-To: <20221025090306.297886-1-tudor.ambarus@microchip.com> Multiple calls to atc_issue_pending() could result in a premature completion of a descriptor from the atchan->active list, as the method always completed the first active descriptor from the list. Instead, issue_pending() should just take the first transaction descriptor from the pending queue, move it to active_list and start the transfer. Fixes: dc78baa2b90b ("dmaengine: at_hdmac: new driver for the Atmel AHB DMA Controller") Reported-by: Peter Rosin <peda@axentia.se> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/lkml/13c6c9a2-6db5-c3bf-349b-4c127ad3496a@axentia.se/ --- drivers/dma/at_hdmac.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c index e9d0c3632868..cb5522417db6 100644 --- a/drivers/dma/at_hdmac.c +++ b/drivers/dma/at_hdmac.c @@ -1527,16 +1527,26 @@ atc_tx_status(struct dma_chan *chan, } /** - * atc_issue_pending - try to finish work + * atc_issue_pending - takes the first transaction descriptor in the pending + * queue and starts the transfer. * @chan: target DMA channel */ static void atc_issue_pending(struct dma_chan *chan) { - struct at_dma_chan *atchan = to_at_dma_chan(chan); + struct at_dma_chan *atchan = to_at_dma_chan(chan); + struct at_desc *desc; + unsigned long flags; dev_vdbg(chan2dev(chan), "issue_pending\n"); - atc_advance_work(atchan); + spin_lock_irqsave(&atchan->lock, flags); + if (atc_chan_is_enabled(atchan) || list_empty(&atchan->queue)) + return spin_unlock_irqrestore(&atchan->lock, flags); + + desc = atc_first_queued(atchan); + list_move_tail(&desc->desc_node, &atchan->active_list); + atc_dostart(atchan, desc); + spin_unlock_irqrestore(&atchan->lock, flags); } /** -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Tudor Ambarus <tudor.ambarus@microchip.com> To: <vkoul@kernel.org>, <peda@axentia.se>, <du@axentia.se> Cc: Tudor Ambarus <tudor.ambarus@microchip.com>, maciej.sosnowski@intel.com, linux-kernel@vger.kernel.org, mripard@kernel.org, linux-arm-kernel@lists.infradead.org, dmaengine@vger.kernel.org, stable@vger.kernel.org, torfl6749@gmail.com Subject: [PATCH v2 04/32] dmaengine: at_hdmac: Fix premature completion of desc in issue_pending Date: Tue, 25 Oct 2022 12:02:38 +0300 [thread overview] Message-ID: <20221025090306.297886-5-tudor.ambarus@microchip.com> (raw) In-Reply-To: <20221025090306.297886-1-tudor.ambarus@microchip.com> Multiple calls to atc_issue_pending() could result in a premature completion of a descriptor from the atchan->active list, as the method always completed the first active descriptor from the list. Instead, issue_pending() should just take the first transaction descriptor from the pending queue, move it to active_list and start the transfer. Fixes: dc78baa2b90b ("dmaengine: at_hdmac: new driver for the Atmel AHB DMA Controller") Reported-by: Peter Rosin <peda@axentia.se> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/lkml/13c6c9a2-6db5-c3bf-349b-4c127ad3496a@axentia.se/ --- drivers/dma/at_hdmac.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c index e9d0c3632868..cb5522417db6 100644 --- a/drivers/dma/at_hdmac.c +++ b/drivers/dma/at_hdmac.c @@ -1527,16 +1527,26 @@ atc_tx_status(struct dma_chan *chan, } /** - * atc_issue_pending - try to finish work + * atc_issue_pending - takes the first transaction descriptor in the pending + * queue and starts the transfer. * @chan: target DMA channel */ static void atc_issue_pending(struct dma_chan *chan) { - struct at_dma_chan *atchan = to_at_dma_chan(chan); + struct at_dma_chan *atchan = to_at_dma_chan(chan); + struct at_desc *desc; + unsigned long flags; dev_vdbg(chan2dev(chan), "issue_pending\n"); - atc_advance_work(atchan); + spin_lock_irqsave(&atchan->lock, flags); + if (atc_chan_is_enabled(atchan) || list_empty(&atchan->queue)) + return spin_unlock_irqrestore(&atchan->lock, flags); + + desc = atc_first_queued(atchan); + list_move_tail(&desc->desc_node, &atchan->active_list); + atc_dostart(atchan, desc); + spin_unlock_irqrestore(&atchan->lock, flags); } /** -- 2.25.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-10-25 9:03 UTC|newest] Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-10-25 9:02 [PATCH v2 00/32] dmaengine: at_hdmac: Fix concurrency bugs and then convert to virt-dma Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 01/32] dmaengine: at_hdmac: Fix at_lli struct definition Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 02/32] dmaengine: at_hdmac: Don't start transactions at tx_submit level Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 03/32] dmaengine: at_hdmac: Start transfer for cyclic channels in issue_pending Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus [this message] 2022-10-25 9:02 ` [PATCH v2 04/32] dmaengine: at_hdmac: Fix premature completion of desc " Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 05/32] dmaengine: at_hdmac: Do not call the complete callback on device_terminate_all Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 06/32] dmaengine: at_hdmac: Protect atchan->status with the channel lock Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 07/32] dmaengine: at_hdmac: Fix concurrency problems by removing atc_complete_all() Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 08/32] dmaengine: at_hdmac: Fix concurrency over descriptor Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 09/32] dmaengine: at_hdmac: Free the memset buf without holding the chan lock Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 10/32] dmaengine: at_hdmac: Fix concurrency over the active list Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 11/32] dmaengine: at_hdmac: Fix descriptor handling when issuing it to hardware Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 12/32] dmaengine: at_hdmac: Fix completion of unissued descriptor in case of errors Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 13/32] dmaengine: at_hdmac: Don't allow CPU to reorder channel enable Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 14/32] dmaengine: at_hdmac: Fix impossible condition Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 15/32] dmaengine: at_hdmac: Check return code of dma_async_device_register Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 16/32] dmaengine: at_hdmac: Do not print messages on console while holding the lock Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 17/32] dmaengine: at_hdmac: Return dma_cookie_status()'s ret code when txstate is NULL Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 18/32] dmaengine: at_hdmac: Remove superfluous cast Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 19/32] dmaengine: at_hdmac: Pass residue by address to avoid unnecessary implicit casts Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 20/32] dmaengine: at_hdmac: s/atc_get_bytes_left/atc_get_residue Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 21/32] dmaengine: at_hdmac: Introduce atc_get_llis_residue() Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 22/32] dmaengine: at_hdmac: Use devm_kzalloc() and struct_size() Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 23/32] dmaengine: at_hdmac: Use devm_platform_ioremap_resource Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 24/32] dmaengine: at_hdmac: Use devm_clk_get() Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:02 ` [PATCH v2 25/32] dmaengine: at_hdmac: Use pm_ptr() Tudor Ambarus 2022-10-25 9:02 ` Tudor Ambarus 2022-10-25 9:03 ` [PATCH v2 26/32] dmaengine: at_hdmac: Set include entries in alphabetic order Tudor Ambarus 2022-10-25 9:03 ` Tudor Ambarus 2022-10-25 9:03 ` [PATCH v2 27/32] dmaengine: at_hdmac: Keep register definitions and structures private to at_hdmac.c Tudor Ambarus 2022-10-25 9:03 ` Tudor Ambarus 2022-10-25 9:03 ` [PATCH v2 28/32] dmaengine: at_hdmac: Use bitfield access macros Tudor Ambarus 2022-10-25 9:03 ` Tudor Ambarus 2022-10-25 9:03 ` [PATCH v2 29/32] dmaengine: at_hdmac: Rename "dma_common" to "dma_device" Tudor Ambarus 2022-10-25 9:03 ` Tudor Ambarus 2022-10-25 9:03 ` [PATCH v2 30/32] dmaengine: at_hdmac: Rename "chan_common" to "dma_chan" Tudor Ambarus 2022-10-25 9:03 ` Tudor Ambarus 2022-10-25 9:03 ` [PATCH v2 31/32] dmaengine: at_hdmac: Remove unused member of at_dma_chan Tudor Ambarus 2022-10-25 9:03 ` Tudor Ambarus 2022-10-25 9:03 ` [PATCH v2 32/32] dmaengine: at_hdmac: Convert driver to use virt-dma Tudor Ambarus 2022-10-25 9:03 ` Tudor Ambarus 2022-10-28 12:55 ` Nicolas Ferre 2022-10-28 12:55 ` Nicolas Ferre 2022-10-25 9:06 ` [PATCH v2 00/32] dmaengine: at_hdmac: Fix concurrency bugs and then convert to virt-dma Tudor.Ambarus 2022-10-25 9:06 ` Tudor.Ambarus 2022-10-28 13:00 ` Nicolas Ferre 2022-10-28 13:00 ` Nicolas Ferre 2022-11-04 13:22 ` Vinod Koul 2022-11-04 13:22 ` Vinod Koul 2022-11-04 15:14 ` Tudor.Ambarus 2022-11-04 15:14 ` Tudor.Ambarus 2022-11-04 15:21 ` Tudor.Ambarus 2022-11-04 15:21 ` Tudor.Ambarus 2022-11-04 17:59 ` Vinod Koul 2022-11-04 17:59 ` Vinod Koul 2022-11-07 4:33 ` Vinod Koul 2022-11-07 4:33 ` Vinod Koul 2022-11-07 9:00 ` Tudor.Ambarus 2022-11-07 9:00 ` Tudor.Ambarus
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=20221025090306.297886-5-tudor.ambarus@microchip.com \ --to=tudor.ambarus@microchip.com \ --cc=dmaengine@vger.kernel.org \ --cc=du@axentia.se \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=maciej.sosnowski@intel.com \ --cc=mripard@kernel.org \ --cc=nicolas.ferre@microchip.com \ --cc=peda@axentia.se \ --cc=stable@vger.kernel.org \ --cc=torfl6749@gmail.com \ --cc=vkoul@kernel.org \ /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: linkBe 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.