2022-02-15 03:39:43

by 王擎

[permalink] [raw]
Subject: [PATCH] tty: serial: add missing pci_dev_put() before return

From: Wang Qing <[email protected]>

pci_get_slot() increases its reference count, the caller must
decrement the reference count by calling pci_dev_put()

Signed-off-by: Wang Qing <[email protected]>
---
drivers/tty/serial/pch_uart.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
index f0351e6..da5a276
--- a/drivers/tty/serial/pch_uart.c
+++ b/drivers/tty/serial/pch_uart.c
@@ -723,7 +723,7 @@ static void pch_request_dma(struct uart_port *port)
if (!chan) {
dev_err(priv->port.dev, "%s:dma_request_channel FAILS(Tx)\n",
__func__);
- return;
+ goto out;
}
priv->chan_tx = chan;

@@ -739,13 +739,16 @@ static void pch_request_dma(struct uart_port *port)
__func__);
dma_release_channel(priv->chan_tx);
priv->chan_tx = NULL;
- return;
+ goto out;
}

/* Get Consistent memory for DMA */
priv->rx_buf_virt = dma_alloc_coherent(port->dev, port->fifosize,
&priv->rx_buf_dma, GFP_KERNEL);
priv->chan_rx = chan;
+
+out:
+ pci_dev_put(dma_dev);
}

static void pch_dma_rx_complete(void *arg)
--
2.7.4


2022-02-15 07:28:56

by Jiri Slaby

[permalink] [raw]
Subject: Re: [PATCH] tty: serial: add missing pci_dev_put() before return

On 15. 02. 22, 3:01, Qing Wang wrote:
> From: Wang Qing <[email protected]>
>
> pci_get_slot() increases its reference count, the caller must
> decrement the reference count by calling pci_dev_put()
>
> Signed-off-by: Wang Qing <[email protected]>
> ---
> drivers/tty/serial/pch_uart.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
> index f0351e6..da5a276
> --- a/drivers/tty/serial/pch_uart.c
> +++ b/drivers/tty/serial/pch_uart.c
> @@ -723,7 +723,7 @@ static void pch_request_dma(struct uart_port *port)
> if (!chan) {
> dev_err(priv->port.dev, "%s:dma_request_channel FAILS(Tx)\n",
> __func__);
> - return;
> + goto out;
> }
> priv->chan_tx = chan;
>
> @@ -739,13 +739,16 @@ static void pch_request_dma(struct uart_port *port)
> __func__);
> dma_release_channel(priv->chan_tx);
> priv->chan_tx = NULL;
> - return;
> + goto out;
> }
>
> /* Get Consistent memory for DMA */
> priv->rx_buf_virt = dma_alloc_coherent(port->dev, port->fifosize,
> &priv->rx_buf_dma, GFP_KERNEL);
> priv->chan_rx = chan;
> +
> +out:
> + pci_dev_put(dma_dev);

Again, dma_dev is stored to an internal structure and shouldn't be freed
now.

> }
>
> static void pch_dma_rx_complete(void *arg)


--
js
suse labs

2022-02-15 09:13:19

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH] tty: serial: add missing pci_dev_put() before return

On Mon, Feb 14, 2022 at 06:01:12PM -0800, Qing Wang wrote:
> From: Wang Qing <[email protected]>
>
> pci_get_slot() increases its reference count, the caller must
> decrement the reference count by calling pci_dev_put()
>
> Signed-off-by: Wang Qing <[email protected]>
> ---
> drivers/tty/serial/pch_uart.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
> index f0351e6..da5a276
> --- a/drivers/tty/serial/pch_uart.c
> +++ b/drivers/tty/serial/pch_uart.c
> @@ -723,7 +723,7 @@ static void pch_request_dma(struct uart_port *port)
> if (!chan) {
> dev_err(priv->port.dev, "%s:dma_request_channel FAILS(Tx)\n",
> __func__);
> - return;
> + goto out;
> }
> priv->chan_tx = chan;
>
> @@ -739,13 +739,16 @@ static void pch_request_dma(struct uart_port *port)
> __func__);
> dma_release_channel(priv->chan_tx);
> priv->chan_tx = NULL;
> - return;
> + goto out;
> }
>
> /* Get Consistent memory for DMA */
> priv->rx_buf_virt = dma_alloc_coherent(port->dev, port->fifosize,
> &priv->rx_buf_dma, GFP_KERNEL);
> priv->chan_rx = chan;
> +
> +out:
> + pci_dev_put(dma_dev);
> }
>
> static void pch_dma_rx_complete(void *arg)
> --
> 2.7.4
>

What tool are you using to find these? As Jiri points out, it is not
very correct at all, be careful to not cause bugs when you are
attempting to fix them.

For stuff like this, please always test your changes to verify they
work.

thanks,

greg k-h

2022-02-15 09:15:02

by 王擎

[permalink] [raw]
Subject: RE: [PATCH] tty: serial: add missing pci_dev_put() before return


>>On Mon, Feb 14, 2022 at 06:01:12PM -0800, Qing Wang wrote:
>> From: Wang Qing <[email protected]>
>>
>> pci_get_slot() increases its reference count, the caller must
>> decrement the reference count by calling pci_dev_put()
>>
>> Signed-off-by: Wang Qing <[email protected]>
>> ---
>>  drivers/tty/serial/pch_uart.c | 7 +++++--
>>  1 file changed, 5 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c
>> index f0351e6..da5a276
>> --- a/drivers/tty/serial/pch_uart.c
>> +++ b/drivers/tty/serial/pch_uart.c
>> @@ -723,7 +723,7 @@ static void pch_request_dma(struct uart_port *port)
>>        if (!chan) {
>>                dev_err(priv->port.dev, "%s:dma_request_channel FAILS(Tx)\n",
>>                        __func__);
>> -             return;
>> +             goto out;
>>        }
>>        priv->chan_tx = chan;
>> 
>> @@ -739,13 +739,16 @@ static void pch_request_dma(struct uart_port *port)
>>                        __func__);
>>                dma_release_channel(priv->chan_tx);
>>                priv->chan_tx = NULL;
>> -             return;
>> +             goto out;
>>        }
>> 
>>        /* Get Consistent memory for DMA */
>>        priv->rx_buf_virt = dma_alloc_coherent(port->dev, port->fifosize,
>>                                    &priv->rx_buf_dma, GFP_KERNEL);
>>        priv->chan_rx = chan;
>> +
>> +out:
>> +     pci_dev_put(dma_dev);
>>  }
>> 
>>  static void pch_dma_rx_complete(void *arg)
>> --
>> 2.7.4
>>
>
>What tool are you using to find these?  As Jiri points out, it is not
>very correct at all, be careful to not cause bugs when you are
>attempting to fix them.
>
>For stuff like this, please always test your changes to verify they
>work.

Got it.

Some tools are taken from the cocci community, some are developed byself,
I will improve the tool and add tests to avoid this situation.

Thanks,
Qing
>
>thanks,
>
>greg k-h
>