[PATCH] dmaengine: qcom_hidma: release the descriptor before the callback
lars at metafoo.de
Fri Aug 5 01:34:20 PDT 2016
On 08/05/2016 08:32 AM, Robert Jarzmik wrote:
> Lars-Peter Clausen <lars at metafoo.de> writes:
>> On 08/04/2016 06:08 PM, Sinan Kaya wrote:
>>> The other way is I can feed this information to what Dave just introduced
>>> as part of the callback mechanism and not touch this.
>> Use the callback mechanism. It is a lot easier to implement correctly than
>> the tx_status() mechanism.
>>> The main discussion here is that
>>> "tx_status does not indicate whether the final transaction is successful or
>>> not" whether the driver has the capability to determine error or not.
>> tx_status() is supposed to be able to indicate whether a transfer failed or
>> not. But in my opinion this feature is broken by design and implementing it
>> correctly is very difficult without creating memory leaks. Which is probably
>> why so few drivers actually implement it.
> I think you can implement the error reporting by remembering the "last" cookie
> where an error occurred such as in :
> - e093bf60ca49 ("dmaengine: pxa: handle bus errors")
> => see the part of the commit beginning with "As dma_cookie_status() ..."
> The point about error reporting was already discussed with Vinod in here:
> => Vinod and I were seeing the reporting can be improved
But that allows you only to report the error for the last descriptor that
failed. If two or more have failed any but the last will return DMA_COMPLETE
instead of DMA_ERROR. In your case that sort of works because you completely
stop execution after a descriptor failed. But as you noted in the commit
message this will report misleading status values for the descriptors after
the descriptor that failed.
I believe we need to invest some effort to come up with clear semantics on
what is the expected behavior when transferring a descriptor fails.
Potentially allowing clients to choose the desired behavior, e.g. either
abort all descriptors on error or continue with the next one.
More information about the linux-arm-kernel