diff mbox series

dmaengine: dmaengine_desc_callback_valid(): Check for `callback_result`

Message ID 20211023134101.28042-1-lars@metafoo.de (mailing list archive)
State Accepted
Commit e7e1e880b114ca640a2f280b0d5d38aed98f98c6
Headers show
Series dmaengine: dmaengine_desc_callback_valid(): Check for `callback_result` | expand

Commit Message

Lars-Peter Clausen Oct. 23, 2021, 1:41 p.m. UTC
Before the `callback_result` callback was introduced drivers coded their
invocation to the callback in a similar way to:

	if (cb->callback) {
		spin_unlock(&dma->lock);
		cb->callback(cb->callback_param);
		spin_lock(&dma->lock);
	}

With the introduction of `callback_result` two helpers where introduced to
transparently handle both types of callbacks. And drivers where updated to
look like this:

	if (dmaengine_desc_callback_valid(cb)) {
		spin_unlock(&dma->lock);
		dmaengine_desc_callback_invoke(cb, ...);
		spin_lock(&dma->lock);
	}

dmaengine_desc_callback_invoke() correctly handles both `callback_result`
and `callback`. But we forgot to update the dmaengine_desc_callback_valid()
function to check for `callback_result`. As a result DMA descriptors that
use the `callback_result` rather than `callback` don't have their callback
invoked by drivers that follow the pattern above.

Fix this by checking for both `callback` and `callback_result` in
dmaengine_desc_callback_valid().

Fixes: f067025bc676 ("dmaengine: add support to provide error result from a DMA transation")
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 drivers/dma/dmaengine.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Dave Jiang Oct. 24, 2021, 6:19 p.m. UTC | #1
On 10/23/2021 6:41 AM, Lars-Peter Clausen wrote:
> Before the `callback_result` callback was introduced drivers coded their
> invocation to the callback in a similar way to:
>
> 	if (cb->callback) {
> 		spin_unlock(&dma->lock);
> 		cb->callback(cb->callback_param);
> 		spin_lock(&dma->lock);
> 	}
>
> With the introduction of `callback_result` two helpers where introduced to
> transparently handle both types of callbacks. And drivers where updated to
> look like this:
>
> 	if (dmaengine_desc_callback_valid(cb)) {
> 		spin_unlock(&dma->lock);
> 		dmaengine_desc_callback_invoke(cb, ...);
> 		spin_lock(&dma->lock);
> 	}
>
> dmaengine_desc_callback_invoke() correctly handles both `callback_result`
> and `callback`. But we forgot to update the dmaengine_desc_callback_valid()
> function to check for `callback_result`. As a result DMA descriptors that
> use the `callback_result` rather than `callback` don't have their callback
> invoked by drivers that follow the pattern above.
>
> Fix this by checking for both `callback` and `callback_result` in
> dmaengine_desc_callback_valid().
>
> Fixes: f067025bc676 ("dmaengine: add support to provide error result from a DMA transation")
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>

Acked-by: Dave Jiang <dave.jiang@intel.com>


> ---
>   drivers/dma/dmaengine.h | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h
> index 1bfbd64b1371..53f16d3f0029 100644
> --- a/drivers/dma/dmaengine.h
> +++ b/drivers/dma/dmaengine.h
> @@ -176,7 +176,7 @@ dmaengine_desc_get_callback_invoke(struct dma_async_tx_descriptor *tx,
>   static inline bool
>   dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb)
>   {
> -	return (cb->callback) ? true : false;
> +	return cb->callback || cb->callback_result;
>   }
>   
>   struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);
Vinod Koul Oct. 25, 2021, 4:13 a.m. UTC | #2
On 23-10-21, 15:41, Lars-Peter Clausen wrote:
> Before the `callback_result` callback was introduced drivers coded their
> invocation to the callback in a similar way to:
> 
> 	if (cb->callback) {
> 		spin_unlock(&dma->lock);
> 		cb->callback(cb->callback_param);
> 		spin_lock(&dma->lock);
> 	}
> 
> With the introduction of `callback_result` two helpers where introduced to
> transparently handle both types of callbacks. And drivers where updated to
> look like this:
> 
> 	if (dmaengine_desc_callback_valid(cb)) {
> 		spin_unlock(&dma->lock);
> 		dmaengine_desc_callback_invoke(cb, ...);
> 		spin_lock(&dma->lock);
> 	}
> 
> dmaengine_desc_callback_invoke() correctly handles both `callback_result`
> and `callback`. But we forgot to update the dmaengine_desc_callback_valid()
> function to check for `callback_result`. As a result DMA descriptors that
> use the `callback_result` rather than `callback` don't have their callback
> invoked by drivers that follow the pattern above.
> 
> Fix this by checking for both `callback` and `callback_result` in
> dmaengine_desc_callback_valid().

Thanks for the fix, applied now
diff mbox series

Patch

diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h
index 1bfbd64b1371..53f16d3f0029 100644
--- a/drivers/dma/dmaengine.h
+++ b/drivers/dma/dmaengine.h
@@ -176,7 +176,7 @@  dmaengine_desc_get_callback_invoke(struct dma_async_tx_descriptor *tx,
 static inline bool
 dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb)
 {
-	return (cb->callback) ? true : false;
+	return cb->callback || cb->callback_result;
 }
 
 struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);