Re: [PATCH v2 2/2] serial: samsung: Add missing checks for dma_map_single failure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Mar 23, 2017 at 01:01:53PM +0100, Marek Szyprowski wrote:
> This patch adds missing checks for dma_map_single() failure and proper error
> reporting. While touching this part of the code, it also removes unnecessary
> spinlock calls around dma_map_single() for TX buffer. This finally solves all
> the issues reported by DMA API debug framework.
> 
> Reported-by: Seung-Woo Kim <sw0312.kim@xxxxxxxxxxx>
> Fixes: 62c37eedb74c8 ("serial: samsung: add dma reqest/release functions")
> CC: stable@xxxxxxxxxxxxxxx # v4.10+
> Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
> Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@xxxxxxxxxxx>
> ---
> This issue was there since adding DMA support, but this patch applies cleanly
> only to v4.10+ kernels due to other changes in the surrounding code.
> 
> v2:
> - fixed commit id in 'fixes' tag, added 'reviewed-by' tag
> ---
>  drivers/tty/serial/samsung.c | 35 ++++++++++++++++++++++++-----------
>  1 file changed, 24 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
> index 9f3759bdb44f..8aca18c4cdea 100644
> --- a/drivers/tty/serial/samsung.c
> +++ b/drivers/tty/serial/samsung.c
> @@ -859,7 +859,7 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state)
>  static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
>  {
>  	struct s3c24xx_uart_dma	*dma = p->dma;
> -	unsigned long flags;
> +	int ret;
>  
>  	/* Default slave configuration parameters */
>  	dma->rx_conf.direction		= DMA_DEV_TO_MEM;
> @@ -884,8 +884,8 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
>  
>  	dma->tx_chan = dma_request_chan(p->port.dev, "tx");
>  	if (IS_ERR(dma->tx_chan)) {
> -		dma_release_channel(dma->rx_chan);
> -		return PTR_ERR(dma->tx_chan);
> +		ret = PTR_ERR(dma->tx_chan);
> +		goto err_release_rx;
>  	}
>  
>  	dmaengine_slave_config(dma->tx_chan, &dma->tx_conf);
> @@ -894,25 +894,38 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
>  	dma->rx_size = PAGE_SIZE;
>  
>  	dma->rx_buf = kmalloc(dma->rx_size, GFP_KERNEL);
> -
>  	if (!dma->rx_buf) {
> -		dma_release_channel(dma->rx_chan);
> -		dma_release_channel(dma->tx_chan);
> -		return -ENOMEM;
> +		ret = -ENOMEM;
> +		goto err_release_tx;
>  	}
>  
>  	dma->rx_addr = dma_map_single(p->port.dev, dma->rx_buf,
>  				dma->rx_size, DMA_FROM_DEVICE);
> -
> -	spin_lock_irqsave(&p->port.lock, flags);

Error paths look fine but how about splitting spinlock removal out of
this patch?  Logically they are two different changes and unrelated code
should not be backported.

Best regards,
Krzysztof




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]