LKML Archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
@ 2023-06-09  4:45 Christophe JAILLET
  2023-06-09  4:45 ` [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk Christophe JAILLET
                   ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Christophe JAILLET @ 2023-06-09  4:45 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim
  Cc: linux-kernel, kernel-janitors, Christophe JAILLET,
	linux-arm-kernel, linux-samsung-soc, linux-serial

If clk_get_rate() fails, the clk that has just been allocated needs to be
freed.

Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
 drivers/tty/serial/samsung_tty.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
index 2a7520ad3abd..dd751e7010e3 100644
--- a/drivers/tty/serial/samsung_tty.c
+++ b/drivers/tty/serial/samsung_tty.c
@@ -1459,8 +1459,10 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
 			continue;
 
 		rate = clk_get_rate(clk);
-		if (!rate)
+		if (!rate) {
+			clk_put(clk);
 			continue;
+		}
 
 		if (ourport->info->has_divslot) {
 			unsigned long div = rate / req_baud;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
  2023-06-09  4:45 [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error Christophe JAILLET
@ 2023-06-09  4:45 ` Christophe JAILLET
  2023-06-09  8:57   ` AW: " Walter Harms
                     ` (2 more replies)
  2023-06-09 11:51 ` [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error Krzysztof Kozlowski
  2023-06-10 10:26 ` Andi Shyti
  2 siblings, 3 replies; 18+ messages in thread
From: Christophe JAILLET @ 2023-06-09  4:45 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim
  Cc: linux-kernel, kernel-janitors, Christophe JAILLET,
	linux-arm-kernel, linux-samsung-soc, linux-serial

When the best clk is searched, we iterate over all possible clk.

If we find a better match, the previous one, if any, needs to be freed.
If a better match has already been found, we still need to free the new
one, otherwise it leaks.

Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
This patch is speculative. Review with care.

I think that some clk_put() are also missing somewhere else in the driver
but won't be able to investigate further.
---
 drivers/tty/serial/samsung_tty.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
index dd751e7010e3..c07877dd25fa 100644
--- a/drivers/tty/serial/samsung_tty.c
+++ b/drivers/tty/serial/samsung_tty.c
@@ -1488,10 +1488,18 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
 			calc_deviation = -calc_deviation;
 
 		if (calc_deviation < deviation) {
+			/*
+			 * If we find a better clk, release the previous one, if
+			 * any.
+			 */
+			if (!IS_ERR(*best_clk))
+				clk_put(*best_clk);
 			*best_clk = clk;
 			best_quot = quot;
 			*clk_num = cnt;
 			deviation = calc_deviation;
+		} else {
+			clk_put(clk);
 		}
 	}
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* AW: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
  2023-06-09  4:45 ` [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk Christophe JAILLET
@ 2023-06-09  8:57   ` Walter Harms
  2023-06-09 11:56     ` Krzysztof Kozlowski
  2023-06-09 16:17     ` Christophe JAILLET
  2023-06-09 11:53   ` Krzysztof Kozlowski
  2023-06-10 10:39   ` Andi Shyti
  2 siblings, 2 replies; 18+ messages in thread
From: Walter Harms @ 2023-06-09  8:57 UTC (permalink / raw)
  To: Christophe JAILLET, Krzysztof Kozlowski, Alim Akhtar,
	Greg Kroah-Hartman, Jiri Slaby, Thomas Abraham, Kukjin Kim
  Cc: linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-samsung-soc@vger.kernel.org, linux-serial@vger.kernel.org


while we are here ....

perhaps INT_MAX from kernel.h ?

int   deviation = (1 << 30) - 1;

the part before looks a bit strange

if (ourport->info->has_divslot) {
                        unsigned long div = rate / req_baud;

                        /* The UDIVSLOT register on the newer UARTs allows us to
                         * get a divisor adjustment of 1/16th on the baud clock.
                         *
                         * We don't keep the UDIVSLOT value (the 16ths we
                         * calculated by not multiplying the baud by 16) as it
                         * is easy enough to recalculate.
                         */

                        quot = div / 16;
                        baud = rate / div;
because
   baud=rate/rate/req_baud = req_baud
can this be simplyfied ? (or is the numeric required  ?)


Homebrew abs()  kernel.h has a abs() can we use it here ?

            if (calc_deviation < 0)
                        calc_deviation = -calc_deviation;

to the patch:

+                       /*
+                        * If we find a better clk, release the previous one, if
+                        * any.
+                        */
+                       if (!IS_ERR(*best_clk))
+                               clk_put(*best_clk);

the intentions are good. *best_clk is user supplied (and should be NULL)
filled & released in the next round but IMHO must be valid (is clk).
so no need to check. (ntl clk_put seems to handle NULL and ERR )
   if (!clk || WARN_ON_ONCE(IS_ERR(clk)))
                return;

JM2C
 wh
________________________________________
Von: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Gesendet: Freitag, 9. Juni 2023 06:45:39
An: Krzysztof Kozlowski; Alim Akhtar; Greg Kroah-Hartman; Jiri Slaby; Thomas Abraham; Kukjin Kim
Cc: linux-kernel@vger.kernel.org; kernel-janitors@vger.kernel.org; Christophe JAILLET; linux-arm-kernel@lists.infradead.org; linux-samsung-soc@vger.kernel.org; linux-serial@vger.kernel.org
Betreff: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk

When the best clk is searched, we iterate over all possible clk.

If we find a better match, the previous one, if any, needs to be freed.
If a better match has already been found, we still need to free the new
one, otherwise it leaks.

Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
This patch is speculative. Review with care.

I think that some clk_put() are also missing somewhere else in the driver
but won't be able to investigate further.
---
 drivers/tty/serial/samsung_tty.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
index dd751e7010e3..c07877dd25fa 100644
--- a/drivers/tty/serial/samsung_tty.c
+++ b/drivers/tty/serial/samsung_tty.c
@@ -1488,10 +1488,18 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
                        calc_deviation = -calc_deviation;

                if (calc_deviation < deviation) {
+                       /*
+                        * If we find a better clk, release the previous one, if
+                        * any.
+                        */
+                       if (!IS_ERR(*best_clk))
+                               clk_put(*best_clk);
                        *best_clk = clk;
                        best_quot = quot;
                        *clk_num = cnt;
                        deviation = calc_deviation;
+               } else {
+                       clk_put(clk);
                }
        }

--
2.34.1


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-09  4:45 [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error Christophe JAILLET
  2023-06-09  4:45 ` [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk Christophe JAILLET
@ 2023-06-09 11:51 ` Krzysztof Kozlowski
  2023-06-10 10:26 ` Andi Shyti
  2 siblings, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2023-06-09 11:51 UTC (permalink / raw)
  To: Christophe JAILLET, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim
  Cc: linux-kernel, kernel-janitors, linux-arm-kernel,
	linux-samsung-soc, linux-serial

On 09/06/2023 06:45, Christophe JAILLET wrote:
> If clk_get_rate() fails, the clk that has just been allocated needs to be
> freed.
> 
> Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> ---


Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
  2023-06-09  4:45 ` [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk Christophe JAILLET
  2023-06-09  8:57   ` AW: " Walter Harms
@ 2023-06-09 11:53   ` Krzysztof Kozlowski
  2023-06-10 10:39   ` Andi Shyti
  2 siblings, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2023-06-09 11:53 UTC (permalink / raw)
  To: Christophe JAILLET, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim
  Cc: linux-kernel, kernel-janitors, linux-arm-kernel,
	linux-samsung-soc, linux-serial

On 09/06/2023 06:45, Christophe JAILLET wrote:
> When the best clk is searched, we iterate over all possible clk.
> 
> If we find a better match, the previous one, if any, needs to be freed.
> If a better match has already been found, we still need to free the new
> one, otherwise it leaks.
> 
> Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> ---
> This patch is speculative. Review with care.
> 


Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: AW: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
  2023-06-09  8:57   ` AW: " Walter Harms
@ 2023-06-09 11:56     ` Krzysztof Kozlowski
  2023-06-09 16:17     ` Christophe JAILLET
  1 sibling, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2023-06-09 11:56 UTC (permalink / raw)
  To: Walter Harms, Christophe JAILLET, Alim Akhtar, Greg Kroah-Hartman,
	Jiri Slaby, Thomas Abraham, Kukjin Kim
  Cc: linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-samsung-soc@vger.kernel.org, linux-serial@vger.kernel.org

On 09/06/2023 10:57, Walter Harms wrote:
> 
> while we are here ....
> 
> perhaps INT_MAX from kernel.h ?
> 
> int   deviation = (1 << 30) - 1;
> 
> the part before looks a bit strange
> 
> if (ourport->info->has_divslot) {
>                         unsigned long div = rate / req_baud;
> 
>                         /* The UDIVSLOT register on the newer UARTs allows us to
>                          * get a divisor adjustment of 1/16th on the baud clock.
>                          *
>                          * We don't keep the UDIVSLOT value (the 16ths we
>                          * calculated by not multiplying the baud by 16) as it
>                          * is easy enough to recalculate.
>                          */
> 
>                         quot = div / 16;
>                         baud = rate / div;
> because
>    baud=rate/rate/req_baud = req_baud
> can this be simplyfied ? (or is the numeric required  ?)
> 
> 
> Homebrew abs()  kernel.h has a abs() can we use it here ?
> 
>             if (calc_deviation < 0)
>                         calc_deviation = -calc_deviation;
> 
> to the patch:
> 
> +                       /*
> +                        * If we find a better clk, release the previous one, if
> +                        * any.
> +                        */
> +                       if (!IS_ERR(*best_clk))
> +                               clk_put(*best_clk);
> 
> the intentions are good. *best_clk is user supplied (and should be NULL)
> filled & released in the next round but IMHO must be valid (is clk).
> so no need to check. (ntl clk_put seems to handle NULL and ERR )
>    if (!clk || WARN_ON_ONCE(IS_ERR(clk)))
>                 return;

Don't top-post.

Anyway, I don't understand what you want to say here.

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: AW: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
  2023-06-09  8:57   ` AW: " Walter Harms
  2023-06-09 11:56     ` Krzysztof Kozlowski
@ 2023-06-09 16:17     ` Christophe JAILLET
  1 sibling, 0 replies; 18+ messages in thread
From: Christophe JAILLET @ 2023-06-09 16:17 UTC (permalink / raw)
  To: Walter Harms, Krzysztof Kozlowski, Alim Akhtar,
	Greg Kroah-Hartman, Jiri Slaby, Thomas Abraham, Kukjin Kim
  Cc: linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-samsung-soc@vger.kernel.org, linux-serial@vger.kernel.org

Le 09/06/2023 à 10:57, Walter Harms a écrit :
> 
> while we are here ....
> 
> perhaps INT_MAX from kernel.h ?

from include/vdso/limits.h

> int   deviation = (1 << 30) - 1;

I don't know the initial intent for this value, but it is not the same 
as MAX_INT.

> 
> the part before looks a bit strange
> 
> if (ourport->info->has_divslot) {
>                          unsigned long div = rate / req_baud;
> 
>                          /* The UDIVSLOT register on the newer UARTs allows us to
>                           * get a divisor adjustment of 1/16th on the baud clock.
>                           *
>                           * We don't keep the UDIVSLOT value (the 16ths we
>                           * calculated by not multiplying the baud by 16) as it
>                           * is easy enough to recalculate.
>                           */
> 
>                          quot = div / 16;
>                          baud = rate / div;
> because
>     baud=rate/rate/req_baud = req_baud

In math yes. In integer computation, no.
	rate = 20000
	req_baud = 9600

	div = rate / req_baud 		==> 2
	baud = rate / div;		==> 20000 / 2 = 10000

	9600 <> 10000

I don't know if it is the intent, but it is the way it works.

And knowing that:
	calc_deviation = req_baud - baud;
I guess that it is the way it is expected to work.

With your reasoning, calc_deviation would be always 0.

> can this be simplyfied ? (or is the numeric required  ?)
> 
> 
> Homebrew abs()  kernel.h has a abs() can we use it here ?

include/linux/math.h

> 
>              if (calc_deviation < 0)
>                          calc_deviation = -calc_deviation;

Ok, why not.

> 
> to the patch:
> 
> +                       /*
> +                        * If we find a better clk, release the previous one, if
> +                        * any.
> +                        */
> +                       if (!IS_ERR(*best_clk))
> +                               clk_put(*best_clk);
> 
> the intentions are good. *best_clk is user supplied (and should be NULL)

??? Why should it be NULL?

There is only one caller, and the value id &clk, knowing that:
    struct clk *clk = ERR_PTR(-EINVAL);

The code could be changed to have an initial NULL value, but it would'nt 
bring that much added value, in my PoV.
It would only save a test which is just fine as-is.

> filled & released in the next round but IMHO must be valid (is clk).
> so no need to check. (ntl clk_put seems to handle NULL and ERR )
>     if (!clk || WARN_ON_ONCE(IS_ERR(clk)))
>                  return;

My point with "if (!IS_ERR(*best_clk))" is to handle the initial 
iteration when *best_clk is ERR_PTR(-EINVAL).
clk_put() can handle it, but it would WARN in the normal path, so it 
sounds strange to me.

CJ

> 
> JM2C
>   wh
> ________________________________________
> Von: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> Gesendet: Freitag, 9. Juni 2023 06:45:39
> An: Krzysztof Kozlowski; Alim Akhtar; Greg Kroah-Hartman; Jiri Slaby; Thomas Abraham; Kukjin Kim
> Cc: linux-kernel@vger.kernel.org; kernel-janitors@vger.kernel.org; Christophe JAILLET; linux-arm-kernel@lists.infradead.org; linux-samsung-soc@vger.kernel.org; linux-serial@vger.kernel.org
> Betreff: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
> 
> When the best clk is searched, we iterate over all possible clk.
> 
> If we find a better match, the previous one, if any, needs to be freed.
> If a better match has already been found, we still need to free the new
> one, otherwise it leaks.
> 
> Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> ---
> This patch is speculative. Review with care.
> 
> I think that some clk_put() are also missing somewhere else in the driver
> but won't be able to investigate further.
> ---
>   drivers/tty/serial/samsung_tty.c | 8 ++++++++
>   1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
> index dd751e7010e3..c07877dd25fa 100644
> --- a/drivers/tty/serial/samsung_tty.c
> +++ b/drivers/tty/serial/samsung_tty.c
> @@ -1488,10 +1488,18 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
>                          calc_deviation = -calc_deviation;
> 
>                  if (calc_deviation < deviation) {
> +                       /*
> +                        * If we find a better clk, release the previous one, if
> +                        * any.
> +                        */
> +                       if (!IS_ERR(*best_clk))
> +                               clk_put(*best_clk);
>                          *best_clk = clk;
>                          best_quot = quot;
>                          *clk_num = cnt;
>                          deviation = calc_deviation;
> +               } else {
> +                       clk_put(clk);
>                  }
>          }
> 
> --
> 2.34.1
> 
> 


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-09  4:45 [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error Christophe JAILLET
  2023-06-09  4:45 ` [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk Christophe JAILLET
  2023-06-09 11:51 ` [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error Krzysztof Kozlowski
@ 2023-06-10 10:26 ` Andi Shyti
  2023-06-10 14:07   ` Christophe JAILLET
  2 siblings, 1 reply; 18+ messages in thread
From: Andi Shyti @ 2023-06-10 10:26 UTC (permalink / raw)
  To: Christophe JAILLET
  Cc: Krzysztof Kozlowski, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim, linux-kernel, kernel-janitors,
	linux-arm-kernel, linux-samsung-soc, linux-serial

Hi Christophe,

On Fri, Jun 09, 2023 at 06:45:38AM +0200, Christophe JAILLET wrote:
> If clk_get_rate() fails, the clk that has just been allocated needs to be
> freed.
> 
> Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>

As this is a fix, can you cc the stable kernel

Cc: <stable@vger.kernel.org> # v3.3+

> ---
>  drivers/tty/serial/samsung_tty.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
> index 2a7520ad3abd..dd751e7010e3 100644
> --- a/drivers/tty/serial/samsung_tty.c
> +++ b/drivers/tty/serial/samsung_tty.c
> @@ -1459,8 +1459,10 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
>  			continue;
>  
>  		rate = clk_get_rate(clk);
> -		if (!rate)
> +		if (!rate) {
> +			clk_put(clk);
>  			continue;

could you also print an error here?

In any case:

Reviewed-by: Andi Shyti <andi.shyti@kernel.org> 

Andi

> +		}
>  
>  		if (ourport->info->has_divslot) {
>  			unsigned long div = rate / req_baud;
> -- 
> 2.34.1
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
  2023-06-09  4:45 ` [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk Christophe JAILLET
  2023-06-09  8:57   ` AW: " Walter Harms
  2023-06-09 11:53   ` Krzysztof Kozlowski
@ 2023-06-10 10:39   ` Andi Shyti
  2023-06-10 10:45     ` Krzysztof Kozlowski
  2 siblings, 1 reply; 18+ messages in thread
From: Andi Shyti @ 2023-06-10 10:39 UTC (permalink / raw)
  To: Christophe JAILLET
  Cc: Krzysztof Kozlowski, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim, linux-kernel, kernel-janitors,
	linux-arm-kernel, linux-samsung-soc, linux-serial

Hi Christophe,

On Fri, Jun 09, 2023 at 06:45:39AM +0200, Christophe JAILLET wrote:
> When the best clk is searched, we iterate over all possible clk.
> 
> If we find a better match, the previous one, if any, needs to be freed.
> If a better match has already been found, we still need to free the new
> one, otherwise it leaks.
> 
> Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> ---
> This patch is speculative. Review with care.
> 
> I think that some clk_put() are also missing somewhere else in the driver
> but won't be able to investigate further.
> ---
>  drivers/tty/serial/samsung_tty.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
> index dd751e7010e3..c07877dd25fa 100644
> --- a/drivers/tty/serial/samsung_tty.c
> +++ b/drivers/tty/serial/samsung_tty.c
> @@ -1488,10 +1488,18 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
>  			calc_deviation = -calc_deviation;
>  
>  		if (calc_deviation < deviation) {
> +			/*
> +			 * If we find a better clk, release the previous one, if
> +			 * any.
> +			 */
> +			if (!IS_ERR(*best_clk))

what is the case when *best_clk has an error in it?

Andi

> +				clk_put(*best_clk);
>  			*best_clk = clk;
>  			best_quot = quot;
>  			*clk_num = cnt;
>  			deviation = calc_deviation;
> +		} else {
> +			clk_put(clk);
>  		}
>  	}
>  
> -- 
> 2.34.1
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
  2023-06-10 10:39   ` Andi Shyti
@ 2023-06-10 10:45     ` Krzysztof Kozlowski
  2023-06-10 10:57       ` Andi Shyti
  0 siblings, 1 reply; 18+ messages in thread
From: Krzysztof Kozlowski @ 2023-06-10 10:45 UTC (permalink / raw)
  To: Andi Shyti, Christophe JAILLET
  Cc: Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby, Thomas Abraham,
	Kukjin Kim, linux-kernel, kernel-janitors, linux-arm-kernel,
	linux-samsung-soc, linux-serial

On 10/06/2023 12:39, Andi Shyti wrote:
> Hi Christophe,
> 
> On Fri, Jun 09, 2023 at 06:45:39AM +0200, Christophe JAILLET wrote:
>> When the best clk is searched, we iterate over all possible clk.
>>
>> If we find a better match, the previous one, if any, needs to be freed.
>> If a better match has already been found, we still need to free the new
>> one, otherwise it leaks.
>>
>> Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
>> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
>> ---
>> This patch is speculative. Review with care.
>>
>> I think that some clk_put() are also missing somewhere else in the driver
>> but won't be able to investigate further.
>> ---
>>  drivers/tty/serial/samsung_tty.c | 8 ++++++++
>>  1 file changed, 8 insertions(+)
>>
>> diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
>> index dd751e7010e3..c07877dd25fa 100644
>> --- a/drivers/tty/serial/samsung_tty.c
>> +++ b/drivers/tty/serial/samsung_tty.c
>> @@ -1488,10 +1488,18 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
>>  			calc_deviation = -calc_deviation;
>>  
>>  		if (calc_deviation < deviation) {
>> +			/*
>> +			 * If we find a better clk, release the previous one, if
>> +			 * any.
>> +			 */
>> +			if (!IS_ERR(*best_clk))
> 
> what is the case when *best_clk has an error in it?

The initial one? Open the place where the function is being called.

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk
  2023-06-10 10:45     ` Krzysztof Kozlowski
@ 2023-06-10 10:57       ` Andi Shyti
  0 siblings, 0 replies; 18+ messages in thread
From: Andi Shyti @ 2023-06-10 10:57 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Christophe JAILLET, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim, linux-kernel, kernel-janitors,
	linux-arm-kernel, linux-samsung-soc, linux-serial

Hi Krzysztof,

> On Sat, Jun 10, 2023 at 12:45:53PM +0200, Krzysztof Kozlowski wrote:
> On 10/06/2023 12:39, Andi Shyti wrote:
> > Hi Christophe,
> > 
> > On Fri, Jun 09, 2023 at 06:45:39AM +0200, Christophe JAILLET wrote:
> >> When the best clk is searched, we iterate over all possible clk.
> >>
> >> If we find a better match, the previous one, if any, needs to be freed.
> >> If a better match has already been found, we still need to free the new
> >> one, otherwise it leaks.
> >>
> >> Fixes: 5f5a7a5578c5 ("serial: samsung: switch to clkdev based clock lookup")
> >> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
> >> ---
> >> This patch is speculative. Review with care.
> >>
> >> I think that some clk_put() are also missing somewhere else in the driver
> >> but won't be able to investigate further.
> >> ---
> >>  drivers/tty/serial/samsung_tty.c | 8 ++++++++
> >>  1 file changed, 8 insertions(+)
> >>
> >> diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c
> >> index dd751e7010e3..c07877dd25fa 100644
> >> --- a/drivers/tty/serial/samsung_tty.c
> >> +++ b/drivers/tty/serial/samsung_tty.c
> >> @@ -1488,10 +1488,18 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
> >>  			calc_deviation = -calc_deviation;
> >>  
> >>  		if (calc_deviation < deviation) {
> >> +			/*
> >> +			 * If we find a better clk, release the previous one, if
> >> +			 * any.
> >> +			 */
> >> +			if (!IS_ERR(*best_clk))
> > 
> > what is the case when *best_clk has an error in it?
> 
> The initial one? Open the place where the function is being called.

Right!

Reviewed-by: Andi Shyti <andi.shyti@kernel.org> 

Andi

> 
> Best regards,
> Krzysztof
> 

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-10 10:26 ` Andi Shyti
@ 2023-06-10 14:07   ` Christophe JAILLET
  2023-06-10 14:54     ` Andi Shyti
  0 siblings, 1 reply; 18+ messages in thread
From: Christophe JAILLET @ 2023-06-10 14:07 UTC (permalink / raw)
  To: Andi Shyti
  Cc: Krzysztof Kozlowski, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim, linux-kernel, kernel-janitors,
	linux-arm-kernel, linux-samsung-soc, linux-serial

Le 10/06/2023 à 12:26, Andi Shyti a écrit :
>> @@ -1459,8 +1459,10 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
>>   			continue;
>>   
>>   		rate = clk_get_rate(clk);
>> -		if (!rate)
>> +		if (!rate) {
>> +			clk_put(clk);
>>   			continue;
> 
> could you also print an error here?
> 

Is:
	dev_err(ourport->port.dev,
		"Failed to get clock rate for %s.\n", clkname);

fine for you?

CJ


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-10 14:07   ` Christophe JAILLET
@ 2023-06-10 14:54     ` Andi Shyti
  2023-06-10 16:23       ` Krzysztof Kozlowski
  0 siblings, 1 reply; 18+ messages in thread
From: Andi Shyti @ 2023-06-10 14:54 UTC (permalink / raw)
  To: Christophe JAILLET
  Cc: Krzysztof Kozlowski, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim, linux-kernel, kernel-janitors,
	linux-arm-kernel, linux-samsung-soc, linux-serial

On Sat, Jun 10, 2023 at 04:07:51PM +0200, Christophe JAILLET wrote:
> Le 10/06/2023 à 12:26, Andi Shyti a écrit :
> > > @@ -1459,8 +1459,10 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
> > >   			continue;
> > >   		rate = clk_get_rate(clk);
> > > -		if (!rate)
> > > +		if (!rate) {
> > > +			clk_put(clk);
> > >   			continue;
> > 
> > could you also print an error here?
> > 
> 
> Is:
> 	dev_err(ourport->port.dev,
> 		"Failed to get clock rate for %s.\n", clkname);

Fantastic! Thanks!

Andi

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-10 14:54     ` Andi Shyti
@ 2023-06-10 16:23       ` Krzysztof Kozlowski
  2023-06-10 17:10         ` Andi Shyti
  0 siblings, 1 reply; 18+ messages in thread
From: Krzysztof Kozlowski @ 2023-06-10 16:23 UTC (permalink / raw)
  To: Andi Shyti, Christophe JAILLET
  Cc: Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby, Thomas Abraham,
	Kukjin Kim, linux-kernel, kernel-janitors, linux-arm-kernel,
	linux-samsung-soc, linux-serial

On 10/06/2023 16:54, Andi Shyti wrote:
> On Sat, Jun 10, 2023 at 04:07:51PM +0200, Christophe JAILLET wrote:
>> Le 10/06/2023 à 12:26, Andi Shyti a écrit :
>>>> @@ -1459,8 +1459,10 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
>>>>   			continue;
>>>>   		rate = clk_get_rate(clk);
>>>> -		if (!rate)
>>>> +		if (!rate) {
>>>> +			clk_put(clk);
>>>>   			continue;
>>>
>>> could you also print an error here?
>>>
>>
>> Is:
>> 	dev_err(ourport->port.dev,
>> 		"Failed to get clock rate for %s.\n", clkname);

Why do we need it? Most of other users of clk_get_rate() don't print.
Probably because such condition is highly unlikely if not impossible.
This makes simple function unnecessarily bigger...

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-10 16:23       ` Krzysztof Kozlowski
@ 2023-06-10 17:10         ` Andi Shyti
  2023-06-10 17:32           ` Krzysztof Kozlowski
                             ` (2 more replies)
  0 siblings, 3 replies; 18+ messages in thread
From: Andi Shyti @ 2023-06-10 17:10 UTC (permalink / raw)
  To: Krzysztof Kozlowski
  Cc: Christophe JAILLET, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim, linux-kernel, kernel-janitors,
	linux-arm-kernel, linux-samsung-soc, linux-serial

On Sat, Jun 10, 2023 at 06:23:58PM +0200, Krzysztof Kozlowski wrote:
> On 10/06/2023 16:54, Andi Shyti wrote:
> > On Sat, Jun 10, 2023 at 04:07:51PM +0200, Christophe JAILLET wrote:
> >> Le 10/06/2023 à 12:26, Andi Shyti a écrit :
> >>>> @@ -1459,8 +1459,10 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
> >>>>   			continue;
> >>>>   		rate = clk_get_rate(clk);
> >>>> -		if (!rate)
> >>>> +		if (!rate) {
> >>>> +			clk_put(clk);
> >>>>   			continue;
> >>>
> >>> could you also print an error here?
> >>>
> >>
> >> Is:
> >> 	dev_err(ourport->port.dev,
> >> 		"Failed to get clock rate for %s.\n", clkname);
> 
> Why do we need it? Most of other users of clk_get_rate() don't print.

that's not a reason not to print it.

> Probably because such condition is highly unlikely if not impossible.

still... that's not a reason not to print it.

All errors are unlikely and if it's unlikely, why there is no
unlikely(!rate)? Which doesn't improve the reason not to print
it.

The more unlikely, the lauder you need to be:

WARN_ON(!rate)... maybe too much!
BUG_ON(!rate)... way too much!

But these are inversely proportional to the likeliness of the
error.

> This makes simple function unnecessarily bigger...

and... that's not a reason not to print it :)

If it's needed, it's needed. If we are considering the error,
then we need to treat it as an error.

In any case, I'm not strong with it, indeed, I r-b it anyway. I
personally prefer and suggested printing the error. Up to
Christophe.

Thanks,
Andi

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-10 17:10         ` Andi Shyti
@ 2023-06-10 17:32           ` Krzysztof Kozlowski
  2023-06-10 17:40           ` Christophe JAILLET
  2023-06-12  4:53           ` Dan Carpenter
  2 siblings, 0 replies; 18+ messages in thread
From: Krzysztof Kozlowski @ 2023-06-10 17:32 UTC (permalink / raw)
  To: Andi Shyti
  Cc: Christophe JAILLET, Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby,
	Thomas Abraham, Kukjin Kim, linux-kernel, kernel-janitors,
	linux-arm-kernel, linux-samsung-soc, linux-serial

On 10/06/2023 19:10, Andi Shyti wrote:
> On Sat, Jun 10, 2023 at 06:23:58PM +0200, Krzysztof Kozlowski wrote:
>> On 10/06/2023 16:54, Andi Shyti wrote:
>>> On Sat, Jun 10, 2023 at 04:07:51PM +0200, Christophe JAILLET wrote:
>>>> Le 10/06/2023 à 12:26, Andi Shyti a écrit :
>>>>>> @@ -1459,8 +1459,10 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
>>>>>>   			continue;
>>>>>>   		rate = clk_get_rate(clk);
>>>>>> -		if (!rate)
>>>>>> +		if (!rate) {
>>>>>> +			clk_put(clk);
>>>>>>   			continue;
>>>>>
>>>>> could you also print an error here?
>>>>>
>>>>
>>>> Is:
>>>> 	dev_err(ourport->port.dev,
>>>> 		"Failed to get clock rate for %s.\n", clkname);
>>
>> Why do we need it? Most of other users of clk_get_rate() don't print.
> 
> that's not a reason not to print it.

This is the reason, because it was the conscious choice - not to print,
otherwise drivers are unreadable.

> 
>> Probably because such condition is highly unlikely if not impossible.
> 
> still... that's not a reason not to print it.

It is a reason not to print it in the driver. Code readability is more
important than adding error messages for every possible case in the driver.

> 
> All errors are unlikely and if it's unlikely, why there is no
> unlikely(!rate)? Which doesn't improve the reason not to print
> it.
> 
> The more unlikely, the lauder you need to be:
> 
> WARN_ON(!rate)... maybe too much!
> BUG_ON(!rate)... way too much!
> 
> But these are inversely proportional to the likeliness of the
> error.
> 
>> This makes simple function unnecessarily bigger...
> 
> and... that's not a reason not to print it :)

This is the reason not to print it in the driver, because it makes the
code less maintainable. Such unlikely errors should be handled by core,
not by every driver. If this error message here is reasonable, I would
argue that it is reasonable to add it to other places... try doing it.
You will see to what silly code it leads.

It's like adding dev_err to regmap_mmio read/write failures - code will
be difficult to read.

Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-10 17:10         ` Andi Shyti
  2023-06-10 17:32           ` Krzysztof Kozlowski
@ 2023-06-10 17:40           ` Christophe JAILLET
  2023-06-12  4:53           ` Dan Carpenter
  2 siblings, 0 replies; 18+ messages in thread
From: Christophe JAILLET @ 2023-06-10 17:40 UTC (permalink / raw)
  To: Andi Shyti, Krzysztof Kozlowski
  Cc: Alim Akhtar, Greg Kroah-Hartman, Jiri Slaby, Thomas Abraham,
	Kukjin Kim, linux-kernel, kernel-janitors, linux-arm-kernel,
	linux-samsung-soc, linux-serial

Le 10/06/2023 à 19:10, Andi Shyti a écrit :
> On Sat, Jun 10, 2023 at 06:23:58PM +0200, Krzysztof Kozlowski wrote:
>> On 10/06/2023 16:54, Andi Shyti wrote:
>>> On Sat, Jun 10, 2023 at 04:07:51PM +0200, Christophe JAILLET wrote:
>>>> Le 10/06/2023 à 12:26, Andi Shyti a écrit :
>>>>>> @@ -1459,8 +1459,10 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
>>>>>>    			continue;
>>>>>>    		rate = clk_get_rate(clk);
>>>>>> -		if (!rate)
>>>>>> +		if (!rate) {
>>>>>> +			clk_put(clk);
>>>>>>    			continue;
>>>>>
>>>>> could you also print an error here?
>>>>>
>>>>
>>>> Is:
>>>> 	dev_err(ourport->port.dev,
>>>> 		"Failed to get clock rate for %s.\n", clkname);
>>
>> Why do we need it? Most of other users of clk_get_rate() don't print.
> 
> that's not a reason not to print it.
> 
>> Probably because such condition is highly unlikely if not impossible.
> 
> still... that's not a reason not to print it.
> 
> All errors are unlikely and if it's unlikely, why there is no
> unlikely(!rate)? Which doesn't improve the reason not to print
> it.
> 
> The more unlikely, the lauder you need to be:
> 
> WARN_ON(!rate)... maybe too much!
> BUG_ON(!rate)... way too much!
> 
> But these are inversely proportional to the likeliness of the
> error.
> 
>> This makes simple function unnecessarily bigger...
> 
> and... that's not a reason not to print it :)
> 
> If it's needed, it's needed. If we are considering the error,
> then we need to treat it as an error.
> 
> In any case, I'm not strong with it, indeed, I r-b it anyway. I
> personally prefer and suggested printing the error. Up to
> Christophe.

git grep -A5 clk_get_rate | grep dev_err | wc -l
173
git grep clk_get_rate | wc -l
1464

(+ Krzysztof's argumentation)

So lets go for v1.

Can v1 be taken as is?
(knowing that I don't really care about the new 3/3 related to abs())

Or should I send a v3 to ease the process?

CJ


> 
> Thanks,
> Andi
> 


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error
  2023-06-10 17:10         ` Andi Shyti
  2023-06-10 17:32           ` Krzysztof Kozlowski
  2023-06-10 17:40           ` Christophe JAILLET
@ 2023-06-12  4:53           ` Dan Carpenter
  2 siblings, 0 replies; 18+ messages in thread
From: Dan Carpenter @ 2023-06-12  4:53 UTC (permalink / raw)
  To: Andi Shyti
  Cc: Krzysztof Kozlowski, Christophe JAILLET, Alim Akhtar,
	Greg Kroah-Hartman, Jiri Slaby, Thomas Abraham, Kukjin Kim,
	linux-kernel, kernel-janitors, linux-arm-kernel,
	linux-samsung-soc, linux-serial

On Sat, Jun 10, 2023 at 07:10:15PM +0200, Andi Shyti wrote:
> All errors are unlikely and if it's unlikely, why there is no
> unlikely(!rate)?

The likely/unlikely() annotations help performance at the expense of
readability.  If they improved readability every if statement would have
them.  They should only be used if it makes a difference in a benchmark.
I think I have heard other people say the rule is that they shouldn't be
used in the drivers/ directory.

Also the other thing to consider is that quite often GCC is clever
enough to figure out which paths are success paths and which are failure
paths.  So sometimes adding the annotation is redundant.

regards,
dan carpenter


^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2023-06-12  4:53 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-09  4:45 [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error Christophe JAILLET
2023-06-09  4:45 ` [PATCH 2/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() when iterating clk Christophe JAILLET
2023-06-09  8:57   ` AW: " Walter Harms
2023-06-09 11:56     ` Krzysztof Kozlowski
2023-06-09 16:17     ` Christophe JAILLET
2023-06-09 11:53   ` Krzysztof Kozlowski
2023-06-10 10:39   ` Andi Shyti
2023-06-10 10:45     ` Krzysztof Kozlowski
2023-06-10 10:57       ` Andi Shyti
2023-06-09 11:51 ` [PATCH 1/2] tty: serial: samsung_tty: Fix a memory leak in s3c24xx_serial_getclk() in case of error Krzysztof Kozlowski
2023-06-10 10:26 ` Andi Shyti
2023-06-10 14:07   ` Christophe JAILLET
2023-06-10 14:54     ` Andi Shyti
2023-06-10 16:23       ` Krzysztof Kozlowski
2023-06-10 17:10         ` Andi Shyti
2023-06-10 17:32           ` Krzysztof Kozlowski
2023-06-10 17:40           ` Christophe JAILLET
2023-06-12  4:53           ` Dan Carpenter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).