diff mbox series

[v2,1/2] dmaengine: qcom_hidma: initialize tx flags in hidma_prep_dma_*

Message ID 8109d1ab70fe6dbacdbe89fda38d8dcb450c884c.1546823811.git.shunyong.yang@hxt-semitech.com (mailing list archive)
State Accepted
Headers show
Series [v2,1/2] dmaengine: qcom_hidma: initialize tx flags in hidma_prep_dma_* | expand

Commit Message

Shunyong Yang Jan. 7, 2019, 1:32 a.m. UTC
In async_tx_test_ack(), it uses flags in struct dma_async_tx_descriptor
to check the ACK status. As hidma reuses the descriptor in a free list
when hidma_prep_dma_*(memcpy/memset) is called, the flag will keep ACKed
if the descriptor has been used before. This will cause a BUG_ON in
async_tx_quiesce().

  kernel BUG at crypto/async_tx/async_tx.c:282!
  Internal error: Oops - BUG: 0 1 SMP
  ...
  task: ffff8017dd3ec000 task.stack: ffff8017dd3e8000
  PC is at async_tx_quiesce+0x54/0x78 [async_tx]
  LR is at async_trigger_callback+0x98/0x110 [async_tx]

This patch initializes flags in dma_async_tx_descriptor by the flags
passed from the caller when hidma_prep_dma_*(memcpy/memset) is called.

Cc: Joey Zheng <yu.zheng@hxt-semitech.com>
Reviewed-by: Sinan Kaya <okaya@kernel.org>
Signed-off-by: Shunyong Yang <shunyong.yang@hxt-semitech.com>
---

v2: add Reviewed-by: Sinan Kaya <okaya@kernel.org>

---
 drivers/dma/qcom/hidma.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Vinod Koul Jan. 20, 2019, 5:14 a.m. UTC | #1
On 07-01-19, 09:32, Shunyong Yang wrote:
> In async_tx_test_ack(), it uses flags in struct dma_async_tx_descriptor
> to check the ACK status. As hidma reuses the descriptor in a free list
> when hidma_prep_dma_*(memcpy/memset) is called, the flag will keep ACKed
> if the descriptor has been used before. This will cause a BUG_ON in
> async_tx_quiesce().
> 
>   kernel BUG at crypto/async_tx/async_tx.c:282!
>   Internal error: Oops - BUG: 0 1 SMP
>   ...
>   task: ffff8017dd3ec000 task.stack: ffff8017dd3e8000
>   PC is at async_tx_quiesce+0x54/0x78 [async_tx]
>   LR is at async_trigger_callback+0x98/0x110 [async_tx]
> 
> This patch initializes flags in dma_async_tx_descriptor by the flags
> passed from the caller when hidma_prep_dma_*(memcpy/memset) is called.

Applied both, thanks
diff mbox series

Patch

diff --git a/drivers/dma/qcom/hidma.c b/drivers/dma/qcom/hidma.c
index 43d4b00b8138..9d639ed1955a 100644
--- a/drivers/dma/qcom/hidma.c
+++ b/drivers/dma/qcom/hidma.c
@@ -415,6 +415,7 @@  static int hidma_alloc_chan_resources(struct dma_chan *dmach)
 	if (!mdesc)
 		return NULL;
 
+	mdesc->desc.flags = flags;
 	hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch,
 				     src, dest, len, flags,
 				     HIDMA_TRE_MEMCPY);
@@ -447,6 +448,7 @@  static int hidma_alloc_chan_resources(struct dma_chan *dmach)
 	if (!mdesc)
 		return NULL;
 
+	mdesc->desc.flags = flags;
 	hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch,
 				     value, dest, len, flags,
 				     HIDMA_TRE_MEMSET);