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 |
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);
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 --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);
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(-)