diff mbox series

tty: serial: atmel: Check return code of dmaengine_submit()

Message ID 20211115143004.32743-1-tudor.ambarus@microchip.com (mailing list archive)
State New, archived
Headers show
Series tty: serial: atmel: Check return code of dmaengine_submit() | expand

Commit Message

Tudor Ambarus Nov. 15, 2021, 2:30 p.m. UTC
dma_cookie_t < 0 indicates an error code, check for it.

Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
---
 drivers/tty/serial/atmel_serial.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Greg KH Nov. 15, 2021, 3:58 p.m. UTC | #1
On Mon, Nov 15, 2021 at 04:30:04PM +0200, Tudor Ambarus wrote:
> dma_cookie_t < 0 indicates an error code, check for it.

Very odd changelog text, please be more descriptive about what is
happening here.

> 
> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
> ---
>  drivers/tty/serial/atmel_serial.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
> index 2c99a47a2535..376f7a9c2868 100644
> --- a/drivers/tty/serial/atmel_serial.c
> +++ b/drivers/tty/serial/atmel_serial.c
> @@ -1004,6 +1004,11 @@ static void atmel_tx_dma(struct uart_port *port)
>  		desc->callback = atmel_complete_tx_dma;
>  		desc->callback_param = atmel_port;
>  		atmel_port->cookie_tx = dmaengine_submit(desc);
> +		if (dma_submit_error(atmel_port->cookie_tx)) {
> +			dev_err(port->dev, "dma_submit_error %d\n",
> +				atmel_port->cookie_tx);
> +			return;

What can a user do with this error message?

Have you seen this happen in real life?

What commit does this "fix"?

thanks,

greg k-h
Tudor Ambarus Nov. 16, 2021, 6:14 a.m. UTC | #2
On 11/15/21 5:58 PM, Greg KH wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> 
> On Mon, Nov 15, 2021 at 04:30:04PM +0200, Tudor Ambarus wrote:
>> dma_cookie_t < 0 indicates an error code, check for it.
> 
> Very odd changelog text, please be more descriptive about what is
> happening here.
> 

The tx_submit() method of struct dma_async_tx_descriptor is entitled to do
sanity checks and return errors if encountered. It's not the case for the
DMA controller drivers that this client is using (at_h/xdmac), because they
currently don't do sanity checks and always return a positive cookie at
tx_submit() method. In case the controller drivers will implement sanity
checks and return errors, print a message so that the client will be informed
that something went wrong at tx_submit() level.

>>
>> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
>> ---
>>  drivers/tty/serial/atmel_serial.c | 10 ++++++++++
>>  1 file changed, 10 insertions(+)
>>
>> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
>> index 2c99a47a2535..376f7a9c2868 100644
>> --- a/drivers/tty/serial/atmel_serial.c
>> +++ b/drivers/tty/serial/atmel_serial.c
>> @@ -1004,6 +1004,11 @@ static void atmel_tx_dma(struct uart_port *port)
>>               desc->callback = atmel_complete_tx_dma;
>>               desc->callback_param = atmel_port;
>>               atmel_port->cookie_tx = dmaengine_submit(desc);
>> +             if (dma_submit_error(atmel_port->cookie_tx)) {
>> +                     dev_err(port->dev, "dma_submit_error %d\n",
>> +                             atmel_port->cookie_tx);
>> +                     return;
> 
> What can a user do with this error message?
> 
will be informed that something went wrong at tx_submit() level.

> Have you seen this happen in real life?

No. I debugged a locking problem and I observed that dma_submit_error() is not called,
so I thought to update this.

> 
> What commit does this "fix"?

This is rather an improvement, but if you're looking for a fixes tag, I think
we can use:
Fixes: 08f738be88bb ("serial: at91: add tx dma support")

I'll send a v2 as part of a bigger series. If you find this patch does not worth it,
I can as well drop it.

Cheers,
ta
Greg KH Nov. 16, 2021, 8:26 a.m. UTC | #3
On Tue, Nov 16, 2021 at 06:14:23AM +0000, Tudor.Ambarus@microchip.com wrote:
> On 11/15/21 5:58 PM, Greg KH wrote:
> > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> > 
> > On Mon, Nov 15, 2021 at 04:30:04PM +0200, Tudor Ambarus wrote:
> >> dma_cookie_t < 0 indicates an error code, check for it.
> > 
> > Very odd changelog text, please be more descriptive about what is
> > happening here.
> > 
> 
> The tx_submit() method of struct dma_async_tx_descriptor is entitled to do
> sanity checks and return errors if encountered. It's not the case for the
> DMA controller drivers that this client is using (at_h/xdmac), because they
> currently don't do sanity checks and always return a positive cookie at
> tx_submit() method. In case the controller drivers will implement sanity
> checks and return errors, print a message so that the client will be informed
> that something went wrong at tx_submit() level.
> 
> >>
> >> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
> >> ---
> >>  drivers/tty/serial/atmel_serial.c | 10 ++++++++++
> >>  1 file changed, 10 insertions(+)
> >>
> >> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
> >> index 2c99a47a2535..376f7a9c2868 100644
> >> --- a/drivers/tty/serial/atmel_serial.c
> >> +++ b/drivers/tty/serial/atmel_serial.c
> >> @@ -1004,6 +1004,11 @@ static void atmel_tx_dma(struct uart_port *port)
> >>               desc->callback = atmel_complete_tx_dma;
> >>               desc->callback_param = atmel_port;
> >>               atmel_port->cookie_tx = dmaengine_submit(desc);
> >> +             if (dma_submit_error(atmel_port->cookie_tx)) {
> >> +                     dev_err(port->dev, "dma_submit_error %d\n",
> >> +                             atmel_port->cookie_tx);
> >> +                     return;
> > 
> > What can a user do with this error message?
> > 
> will be informed that something went wrong at tx_submit() level.
> 
> > Have you seen this happen in real life?
> 
> No. I debugged a locking problem and I observed that dma_submit_error() is not called,
> so I thought to update this.
> 
> > 
> > What commit does this "fix"?
> 
> This is rather an improvement, but if you're looking for a fixes tag, I think
> we can use:
> Fixes: 08f738be88bb ("serial: at91: add tx dma support")
> 
> I'll send a v2 as part of a bigger series. If you find this patch does not worth it,
> I can as well drop it.

Please resend it because as-is, I can not take it.

thanks,

greg k-h
Tudor Ambarus Nov. 16, 2021, 11:33 a.m. UTC | #4
On 11/16/21 10:26 AM, Greg KH wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> 
> On Tue, Nov 16, 2021 at 06:14:23AM +0000, Tudor.Ambarus@microchip.com wrote:
>> On 11/15/21 5:58 PM, Greg KH wrote:
>>> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
>>>
>>> On Mon, Nov 15, 2021 at 04:30:04PM +0200, Tudor Ambarus wrote:
>>>> dma_cookie_t < 0 indicates an error code, check for it.
>>>
>>> Very odd changelog text, please be more descriptive about what is
>>> happening here.
>>>
>>
>> The tx_submit() method of struct dma_async_tx_descriptor is entitled to do
>> sanity checks and return errors if encountered. It's not the case for the
>> DMA controller drivers that this client is using (at_h/xdmac), because they
>> currently don't do sanity checks and always return a positive cookie at
>> tx_submit() method. In case the controller drivers will implement sanity
>> checks and return errors, print a message so that the client will be informed
>> that something went wrong at tx_submit() level.
>>
>>>>
>>>> Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com>
>>>> ---
>>>>  drivers/tty/serial/atmel_serial.c | 10 ++++++++++
>>>>  1 file changed, 10 insertions(+)
>>>>
>>>> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
>>>> index 2c99a47a2535..376f7a9c2868 100644
>>>> --- a/drivers/tty/serial/atmel_serial.c
>>>> +++ b/drivers/tty/serial/atmel_serial.c
>>>> @@ -1004,6 +1004,11 @@ static void atmel_tx_dma(struct uart_port *port)
>>>>               desc->callback = atmel_complete_tx_dma;
>>>>               desc->callback_param = atmel_port;
>>>>               atmel_port->cookie_tx = dmaengine_submit(desc);
>>>> +             if (dma_submit_error(atmel_port->cookie_tx)) {
>>>> +                     dev_err(port->dev, "dma_submit_error %d\n",
>>>> +                             atmel_port->cookie_tx);
>>>> +                     return;
>>>
>>> What can a user do with this error message?
>>>
>> will be informed that something went wrong at tx_submit() level.
>>
>>> Have you seen this happen in real life?
>>
>> No. I debugged a locking problem and I observed that dma_submit_error() is not called,
>> so I thought to update this.
>>
>>>
>>> What commit does this "fix"?
>>
>> This is rather an improvement, but if you're looking for a fixes tag, I think
>> we can use:
>> Fixes: 08f738be88bb ("serial: at91: add tx dma support")
>>
>> I'll send a v2 as part of a bigger series. If you find this patch does not worth it,
>> I can as well drop it.
> 
> Please resend it because as-is, I can not take it.
> 

I've sent a v2 of this patch as a part of a larger series:
https://lore.kernel.org/all/20211116112036.96349-1-tudor.ambarus@microchip.com/

The slave DMA usage was wrong in both the DMA controller driver and the
serial driver and patch 1/13 and 3/13 are trying to address that.
v2 of this patch is 2/13. I guess all should be considered for an immutable
branch on the DMA tree.

Cheers,
ta
diff mbox series

Patch

diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index 2c99a47a2535..376f7a9c2868 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -1004,6 +1004,11 @@  static void atmel_tx_dma(struct uart_port *port)
 		desc->callback = atmel_complete_tx_dma;
 		desc->callback_param = atmel_port;
 		atmel_port->cookie_tx = dmaengine_submit(desc);
+		if (dma_submit_error(atmel_port->cookie_tx)) {
+			dev_err(port->dev, "dma_submit_error %d\n",
+				atmel_port->cookie_tx);
+			return;
+		}
 	}
 
 	if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
@@ -1258,6 +1263,11 @@  static int atmel_prepare_rx_dma(struct uart_port *port)
 	desc->callback_param = port;
 	atmel_port->desc_rx = desc;
 	atmel_port->cookie_rx = dmaengine_submit(desc);
+	if (dma_submit_error(atmel_port->cookie_rx)) {
+		dev_err(port->dev, "dma_submit_error %d\n",
+			atmel_port->cookie_rx);
+		goto chan_err;
+	}
 
 	return 0;