All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
@ 2011-11-16 19:56 Andrei Warkentin
  2011-11-16 22:51 ` Rolf Eike Beer
  2011-11-17 23:05 ` Andrew Morton
  0 siblings, 2 replies; 21+ messages in thread
From: Andrei Warkentin @ 2011-11-16 19:56 UTC (permalink / raw)
  To: linux-kernel; +Cc: Andrei Warkentin, Rolf Eike Beer, opensuse-kernel

1 is a power of two, therefore rounddown_pow_of_two(1) should return 1. It does
in case the argument is a variable but in case it's a constant it behaves
wrong and returns 0. Probably nobody ever did it so this was never noticed,
however net/drivers/vmxnet3 with latest GCC does and breaks on unicpu systems.

This is similar to Rolf's patch to roundup_pow_of_two(1).

Cc: Rolf Eike Beer <eike-kernel@sf-tec.de>
Cc: opensuse-kernel@opensuse.org
Reviewed-by: Jesper Juhl <jj@chaosbits.net>
Signed-off-by: Andrei Warkentin <andreiw@vmware.com>
---
 include/linux/log2.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/linux/log2.h b/include/linux/log2.h
index 25b8086..ccda848 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -185,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
 #define rounddown_pow_of_two(n)			\
 (						\
 	__builtin_constant_p(n) ? (		\
-		(n == 1) ? 0 :			\
+		(n == 1) ? 1 :			\
 		(1UL << ilog2(n))) :		\
 	__rounddown_pow_of_two(n)		\
  )
-- 
1.7.4.1


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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-16 19:56 [PATCH] include/log2.h: Fix rounddown_pow_of_two(1) Andrei Warkentin
@ 2011-11-16 22:51 ` Rolf Eike Beer
  2011-11-17 23:05 ` Andrew Morton
  1 sibling, 0 replies; 21+ messages in thread
From: Rolf Eike Beer @ 2011-11-16 22:51 UTC (permalink / raw)
  To: Andrei Warkentin; +Cc: linux-kernel, opensuse-kernel

[-- Attachment #1: Type: text/plain, Size: 416 bytes --]

Andrei Warkentin wrote:
> 1 is a power of two, therefore rounddown_pow_of_two(1) should return 1. It
> does in case the argument is a variable but in case it's a constant it
> behaves wrong and returns 0. Probably nobody ever did it so this was never
> noticed, however net/drivers/vmxnet3 with latest GCC does and breaks on
> unicpu systems.

Obviously correct.

Reviewed-by: Rolf Eike Beer <eike-kernel@sf-tec.de>

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-16 19:56 [PATCH] include/log2.h: Fix rounddown_pow_of_two(1) Andrei Warkentin
  2011-11-16 22:51 ` Rolf Eike Beer
@ 2011-11-17 23:05 ` Andrew Morton
  2011-11-17 23:19   ` [opensuse-kernel] " Cristian Rodríguez
                     ` (4 more replies)
  1 sibling, 5 replies; 21+ messages in thread
From: Andrew Morton @ 2011-11-17 23:05 UTC (permalink / raw)
  To: Andrei Warkentin
  Cc: linux-kernel, Rolf Eike Beer, opensuse-kernel, Sergiu Iordache,
	Marco Stornelli, Eddie Wai, Jayamohan Kallickal,
	Guennadi Liakhovetski

On Wed, 16 Nov 2011 14:56:06 -0500
Andrei Warkentin <andreiw@vmware.com> wrote:

> 1 is a power of two, therefore rounddown_pow_of_two(1) should return 1. It does
> in case the argument is a variable but in case it's a constant it behaves
> wrong and returns 0. Probably nobody ever did it so this was never noticed,
> however net/drivers/vmxnet3 with latest GCC does and breaks on unicpu systems.
> 
> This is similar to Rolf's patch to roundup_pow_of_two(1).
> 
> Cc: Rolf Eike Beer <eike-kernel@sf-tec.de>
> Cc: opensuse-kernel@opensuse.org
> Reviewed-by: Jesper Juhl <jj@chaosbits.net>
> Signed-off-by: Andrei Warkentin <andreiw@vmware.com>
> ---
>  include/linux/log2.h |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/include/linux/log2.h b/include/linux/log2.h
> index 25b8086..ccda848 100644
> --- a/include/linux/log2.h
> +++ b/include/linux/log2.h
> @@ -185,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  #define rounddown_pow_of_two(n)			\
>  (						\
>  	__builtin_constant_p(n) ? (		\
> -		(n == 1) ? 0 :			\
> +		(n == 1) ? 1 :			\
>  		(1UL << ilog2(n))) :		\
>  	__rounddown_pow_of_two(n)		\
>   )

I assume that nobody has gone off and checked whether all current
callers will survive this change.  If they had, they'd have looked in
drivers/char/ramoops.c and seen:

	rounddown_pow_of_two(pdata->mem_size);
	rounddown_pow_of_two(pdata->record_size);

These operations are no-ops.  It should be

	pdata->mem_size = rounddown_pow_of_two(pdata->mem_size);
	pdata->record_size = rounddown_pow_of_two(pdata->record_size);

Marco or Sergio: please fix, test and send it over sometime?


drivers/scsi/bnx2i/bnx2i_hwi.c does

                if (!is_power_of_2(hba->max_sqes))
                        hba->max_sqes = rounddown_pow_of_two(hba->max_sqes);

                if (!is_power_of_2(hba->max_rqes))
                        hba->max_rqes = rounddown_pow_of_two(hba->max_rqes);


Both the "if" statements can and should be removed.  I would blame upon
inadequate documentation of rounddown_pow_of_two().


drivers/scsi/be2iscsi/be_main.c does

	if (curr_alloc_size - rounddown_pow_of_two(curr_alloc_size))
		curr_alloc_size = rounddown_pow_of_two(curr_alloc_size);

which is a strange way of doing

	if (!is_power_of_2(curr_alloc_size))
		curr_alloc_size = rounddown_pow_of_two(curr_alloc_size);

which is equivalent to doing

	curr_alloc_size = rounddown_pow_of_two(curr_alloc_size);

but there's an `else' clause to that `if' which I am presently finding
incomprehensible.


drivers/mmc/host/sh_mmcif.c unnecessarily uses __rounddown_pow_of_two()
then feeds the result into ilog2() in an apparent attempt to
reimplement fls().



That we have this many warts using these interfaces is an indication
that the interfaces aren't very good.  Poorly documented, at least.


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

* Re: [opensuse-kernel] Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-17 23:05 ` Andrew Morton
@ 2011-11-17 23:19   ` Cristian Rodríguez
  2011-11-17 23:32     ` Andrew Morton
  2011-11-18 18:46   ` Andrei Warkentin
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 21+ messages in thread
From: Cristian Rodríguez @ 2011-11-17 23:19 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Andrei Warkentin, linux-kernel, Rolf Eike Beer, opensuse-kernel,
	Sergiu Iordache, Marco Stornelli, Eddie Wai, Jayamohan Kallickal,
	Guennadi Liakhovetski

On 17/11/11 20:05, Andrew Morton wrote:

> I assume that nobody has gone off and checked whether all current
> callers will survive this change.  If they had, they'd have looked in
> drivers/char/ramoops.c and seen:
> 
> 	rounddown_pow_of_two(pdata->mem_size);
> 	rounddown_pow_of_two(pdata->record_size);
> 
> These operations are no-ops.  It should be
> 
> 	pdata->mem_size = rounddown_pow_of_two(pdata->mem_size);
> 	pdata->record_size = rounddown_pow_of_two(pdata->record_size);
> 
> That we have this many warts using these interfaces is an indication
> that the interfaces aren't very good.  Poorly documented, at least.
> 

making that macro an inline function and annotating with
__attribute__((warn_unused_result)) looks like a good start for me.


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

* Re: [opensuse-kernel] Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-17 23:19   ` [opensuse-kernel] " Cristian Rodríguez
@ 2011-11-17 23:32     ` Andrew Morton
  0 siblings, 0 replies; 21+ messages in thread
From: Andrew Morton @ 2011-11-17 23:32 UTC (permalink / raw)
  To: Cristian Rodríguez
  Cc: Andrei Warkentin, linux-kernel, Rolf Eike Beer, opensuse-kernel,
	Sergiu Iordache, Marco Stornelli, Eddie Wai, Jayamohan Kallickal,
	Guennadi Liakhovetski

On Thu, 17 Nov 2011 20:19:06 -0300
Cristian Rodr__guez <crrodriguez@opensuse.org> wrote:

> On 17/11/11 20:05, Andrew Morton wrote:
> 
> > I assume that nobody has gone off and checked whether all current
> > callers will survive this change.  If they had, they'd have looked in
> > drivers/char/ramoops.c and seen:
> > 
> > 	rounddown_pow_of_two(pdata->mem_size);
> > 	rounddown_pow_of_two(pdata->record_size);
> > 
> > These operations are no-ops.  It should be
> > 
> > 	pdata->mem_size = rounddown_pow_of_two(pdata->mem_size);
> > 	pdata->record_size = rounddown_pow_of_two(pdata->record_size);
> > 
> > That we have this many warts using these interfaces is an indication
> > that the interfaces aren't very good.  Poorly documented, at least.
> > 
> 
> making that macro an inline function and annotating with
> __attribute__((warn_unused_result)) looks like a good start for me.

The problem is:

 * - this can be used to initialise global variables from constant data

I'm surprised that this is true.  Is gcc smart enough to actually do
this?

<tests it>

--- a/fs/open.c~a
+++ a/fs/open.c
@@ -31,6 +31,10 @@
 #include <linux/ima.h>
 #include <linux/dnotify.h>
 
+#include <linux/log2.h>
+
+int blap = rounddown_pow_of_two(42);
+
 #include "internal.h"
 
 int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
_

ooh, it worked.

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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-17 23:05 ` Andrew Morton
  2011-11-17 23:19   ` [opensuse-kernel] " Cristian Rodríguez
@ 2011-11-18 18:46   ` Andrei Warkentin
  2011-11-19  9:26   ` Marco Stornelli
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 21+ messages in thread
From: Andrei Warkentin @ 2011-11-18 18:46 UTC (permalink / raw)
  To: Andrew Morton
  Cc: linux-kernel, Rolf Eike Beer, opensuse-kernel, Sergiu Iordache,
	Marco Stornelli, Eddie Wai, Jayamohan Kallickal,
	Guennadi Liakhovetski, Andrei Warkentin

Hi,

----- Original Message -----
> From: "Andrew Morton" <akpm@linux-foundation.org>
> To: "Andrei Warkentin" <andreiw@vmware.com>
> Cc: linux-kernel@vger.kernel.org, "Rolf Eike Beer" <eike-kernel@sf-tec.de>, opensuse-kernel@opensuse.org, "Sergiu
> Iordache" <sergiu@chromium.org>, "Marco Stornelli" <marco.stornelli@gmail.com>, "Eddie Wai"
> <eddie.wai@broadcom.com>, "Jayamohan Kallickal" <jayamohan.kallickal@emulex.com>, "Guennadi Liakhovetski"
> <g.liakhovetski@gmx.de>
> Sent: Thursday, November 17, 2011 6:05:49 PM
> Subject: Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
> 
> 
> I assume that nobody has gone off and checked whether all current
> callers will survive this change.  If they had, they'd have looked in
> drivers/char/ramoops.c and seen:
> 
> 	rounddown_pow_of_two(pdata->mem_size);
> 	rounddown_pow_of_two(pdata->record_size);
> 
> These operations are no-ops.  It should be
> 
> 	pdata->mem_size = rounddown_pow_of_two(pdata->mem_size);
> 	pdata->record_size = rounddown_pow_of_two(pdata->record_size);
> 
> Marco or Sergio: please fix, test and send it over sometime?

I did quickly look through for code that expected rounddown_pow_of_two(1) to give 0,
but I didn't apparently look close enough for other issues.

A

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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-17 23:05 ` Andrew Morton
  2011-11-17 23:19   ` [opensuse-kernel] " Cristian Rodríguez
  2011-11-18 18:46   ` Andrei Warkentin
@ 2011-11-19  9:26   ` Marco Stornelli
  2011-11-22 23:34   ` Guennadi Liakhovetski
  2011-11-23 14:52     ` Guennadi Liakhovetski
  4 siblings, 0 replies; 21+ messages in thread
From: Marco Stornelli @ 2011-11-19  9:26 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Andrei Warkentin, linux-kernel, Rolf Eike Beer, opensuse-kernel,
	Sergiu Iordache, Eddie Wai, Jayamohan Kallickal,
	Guennadi Liakhovetski

Il 18/11/2011 00:05, Andrew Morton ha scritto:
> On Wed, 16 Nov 2011 14:56:06 -0500
> Andrei Warkentin<andreiw@vmware.com>  wrote:
>
>> 1 is a power of two, therefore rounddown_pow_of_two(1) should return 1. It does
>> in case the argument is a variable but in case it's a constant it behaves
>> wrong and returns 0. Probably nobody ever did it so this was never noticed,
>> however net/drivers/vmxnet3 with latest GCC does and breaks on unicpu systems.
>>
>> This is similar to Rolf's patch to roundup_pow_of_two(1).
>>
>> Cc: Rolf Eike Beer<eike-kernel@sf-tec.de>
>> Cc: opensuse-kernel@opensuse.org
>> Reviewed-by: Jesper Juhl<jj@chaosbits.net>
>> Signed-off-by: Andrei Warkentin<andreiw@vmware.com>
>> ---
>>   include/linux/log2.h |    2 +-
>>   1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/include/linux/log2.h b/include/linux/log2.h
>> index 25b8086..ccda848 100644
>> --- a/include/linux/log2.h
>> +++ b/include/linux/log2.h
>> @@ -185,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>>   #define rounddown_pow_of_two(n)			\
>>   (						\
>>   	__builtin_constant_p(n) ? (		\
>> -		(n == 1) ? 0 :			\
>> +		(n == 1) ? 1 :			\
>>   		(1UL<<  ilog2(n))) :		\
>>   	__rounddown_pow_of_two(n)		\
>>    )
>
> I assume that nobody has gone off and checked whether all current
> callers will survive this change.  If they had, they'd have looked in
> drivers/char/ramoops.c and seen:
>
> 	rounddown_pow_of_two(pdata->mem_size);
> 	rounddown_pow_of_two(pdata->record_size);
>
> These operations are no-ops.  It should be
>
> 	pdata->mem_size = rounddown_pow_of_two(pdata->mem_size);
> 	pdata->record_size = rounddown_pow_of_two(pdata->record_size);
>
> Marco or Sergio: please fix, test and send it over sometime?

Ok, I'll look at it.

Marco

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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-17 23:05 ` Andrew Morton
                     ` (2 preceding siblings ...)
  2011-11-19  9:26   ` Marco Stornelli
@ 2011-11-22 23:34   ` Guennadi Liakhovetski
  2011-11-23 14:52     ` Guennadi Liakhovetski
  4 siblings, 0 replies; 21+ messages in thread
From: Guennadi Liakhovetski @ 2011-11-22 23:34 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Andrei Warkentin, linux-kernel, Rolf Eike Beer, opensuse-kernel,
	Sergiu Iordache, Marco Stornelli, Eddie Wai, Jayamohan Kallickal

On Thu, 17 Nov 2011, Andrew Morton wrote:

[snip]

> drivers/mmc/host/sh_mmcif.c unnecessarily uses __rounddown_pow_of_two()
> then feeds the result into ilog2() in an apparent attempt to
> reimplement fls().

Yeah, I was wondering too, but wasn't sufficiently motivated to patch 
it;-) I'll test this "obvious" patch tomorrow and submit then:

diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
index c021482..824fee5 100644
--- a/drivers/mmc/host/sh_mmcif.c
+++ b/drivers/mmc/host/sh_mmcif.c
@@ -16,6 +16,7 @@
  *
  */
 
+#include <linux/bitops.h>
 #include <linux/clk.h>
 #include <linux/completion.h>
 #include <linux/delay.h>
@@ -386,7 +387,7 @@ static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk)
 		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
 	else
 		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR &
-			(ilog2(__rounddown_pow_of_two(host->clk / clk)) << 16));
+				((fls(host->clk / clk) - 1) << 16));
 
 	sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE);
 }

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/

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

* [PATCH] mmc: sh_mmcif: simplify clock divisor calculation
  2011-11-17 23:05 ` Andrew Morton
@ 2011-11-23 14:52     ` Guennadi Liakhovetski
  2011-11-18 18:46   ` Andrei Warkentin
                       ` (3 subsequent siblings)
  4 siblings, 0 replies; 21+ messages in thread
From: Guennadi Liakhovetski @ 2011-11-23 14:52 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Andrei Warkentin, linux-mmc, linux-sh, Chris Ball

Replace ilog2(__rounddown_pow_of_two(x)) with the equivalent but much
simpler fls(x) - 1.

Reported-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
---
 drivers/mmc/host/sh_mmcif.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
index c021482..824fee5 100644
--- a/drivers/mmc/host/sh_mmcif.c
+++ b/drivers/mmc/host/sh_mmcif.c
@@ -16,6 +16,7 @@
  *
  */
 
+#include <linux/bitops.h>
 #include <linux/clk.h>
 #include <linux/completion.h>
 #include <linux/delay.h>
@@ -386,7 +387,7 @@ static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk)
 		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
 	else
 		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR &
-			(ilog2(__rounddown_pow_of_two(host->clk / clk)) << 16));
+				((fls(host->clk / clk) - 1) << 16));
 
 	sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE);
 }
-- 
1.7.2.5


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

* [PATCH] mmc: sh_mmcif: simplify clock divisor calculation
@ 2011-11-23 14:52     ` Guennadi Liakhovetski
  0 siblings, 0 replies; 21+ messages in thread
From: Guennadi Liakhovetski @ 2011-11-23 14:52 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Andrei Warkentin, linux-mmc, linux-sh, Chris Ball

Replace ilog2(__rounddown_pow_of_two(x)) with the equivalent but much
simpler fls(x) - 1.

Reported-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
---
 drivers/mmc/host/sh_mmcif.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
index c021482..824fee5 100644
--- a/drivers/mmc/host/sh_mmcif.c
+++ b/drivers/mmc/host/sh_mmcif.c
@@ -16,6 +16,7 @@
  *
  */
 
+#include <linux/bitops.h>
 #include <linux/clk.h>
 #include <linux/completion.h>
 #include <linux/delay.h>
@@ -386,7 +387,7 @@ static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk)
 		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
 	else
 		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR &
-			(ilog2(__rounddown_pow_of_two(host->clk / clk)) << 16));
+				((fls(host->clk / clk) - 1) << 16));
 
 	sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE);
 }
-- 
1.7.2.5


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

* Re: [PATCH] mmc: sh_mmcif: simplify clock divisor calculation
  2011-11-23 14:52     ` Guennadi Liakhovetski
@ 2011-12-01 18:24       ` Chris Ball
  -1 siblings, 0 replies; 21+ messages in thread
From: Chris Ball @ 2011-12-01 18:24 UTC (permalink / raw)
  To: Guennadi Liakhovetski
  Cc: Andrew Morton, Andrei Warkentin, linux-mmc, linux-sh

Hi,

On Wed, Nov 23 2011, Guennadi Liakhovetski wrote:
> Replace ilog2(__rounddown_pow_of_two(x)) with the equivalent but much
> simpler fls(x) - 1.
>
> Reported-by: Andrew Morton <akpm@linux-foundation.org>
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
> ---
>  drivers/mmc/host/sh_mmcif.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
> index c021482..824fee5 100644
> --- a/drivers/mmc/host/sh_mmcif.c
> +++ b/drivers/mmc/host/sh_mmcif.c
> @@ -16,6 +16,7 @@
>   *
>   */
>  
> +#include <linux/bitops.h>
>  #include <linux/clk.h>
>  #include <linux/completion.h>
>  #include <linux/delay.h>
> @@ -386,7 +387,7 @@ static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk)
>  		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
>  	else
>  		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR &
> -			(ilog2(__rounddown_pow_of_two(host->clk / clk)) << 16));
> +				((fls(host->clk / clk) - 1) << 16));
>  
>  	sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE);
>  }

Thanks, pushed to mmc-next for 3.3.

- Chris.
-- 
Chris Ball   <cjb@laptop.org>   <http://printf.net/>
One Laptop Per Child

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

* Re: [PATCH] mmc: sh_mmcif: simplify clock divisor calculation
@ 2011-12-01 18:24       ` Chris Ball
  0 siblings, 0 replies; 21+ messages in thread
From: Chris Ball @ 2011-12-01 18:24 UTC (permalink / raw)
  To: Guennadi Liakhovetski
  Cc: Andrew Morton, Andrei Warkentin, linux-mmc, linux-sh

Hi,

On Wed, Nov 23 2011, Guennadi Liakhovetski wrote:
> Replace ilog2(__rounddown_pow_of_two(x)) with the equivalent but much
> simpler fls(x) - 1.
>
> Reported-by: Andrew Morton <akpm@linux-foundation.org>
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
> ---
>  drivers/mmc/host/sh_mmcif.c |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c
> index c021482..824fee5 100644
> --- a/drivers/mmc/host/sh_mmcif.c
> +++ b/drivers/mmc/host/sh_mmcif.c
> @@ -16,6 +16,7 @@
>   *
>   */
>  
> +#include <linux/bitops.h>
>  #include <linux/clk.h>
>  #include <linux/completion.h>
>  #include <linux/delay.h>
> @@ -386,7 +387,7 @@ static void sh_mmcif_clock_control(struct sh_mmcif_host *host, unsigned int clk)
>  		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_SUP_PCLK);
>  	else
>  		sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_CLEAR &
> -			(ilog2(__rounddown_pow_of_two(host->clk / clk)) << 16));
> +				((fls(host->clk / clk) - 1) << 16));
>  
>  	sh_mmcif_bitset(host, MMCIF_CE_CLK_CTRL, CLK_ENABLE);
>  }

Thanks, pushed to mmc-next for 3.3.

- Chris.
-- 
Chris Ball   <cjb@laptop.org>   <http://printf.net/>
One Laptop Per Child

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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-12-13 20:00 ` Peter Zijlstra
@ 2011-12-13 20:05   ` Peter Zijlstra
  0 siblings, 0 replies; 21+ messages in thread
From: Peter Zijlstra @ 2011-12-13 20:05 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Linus Torvalds, linux-kernel, Andrew Morton, pv-drivers,
	Andrei Warkentin, stable

On Tue, 2011-12-13 at 21:00 +0100, Peter Zijlstra wrote:
> On Mon, 2011-12-12 at 10:02 -0800, Dmitry Torokhov wrote:
> > 1 is a power of two, therefore rounddown_pow_of_two(1) should return 1.
> 
> x^0 = 1
> x^1 = x
> 
> Seems to me 0 was the right answer, no?

n/m head-up-arse, missed that this wasn't actually a log variant.

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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-12-12 18:02 [PATCH] include/log2.h: Fix rounddown_pow_of_two(1) Dmitry Torokhov
  2011-12-12 23:50 ` Linus Torvalds
@ 2011-12-13 20:00 ` Peter Zijlstra
  2011-12-13 20:05   ` Peter Zijlstra
  1 sibling, 1 reply; 21+ messages in thread
From: Peter Zijlstra @ 2011-12-13 20:00 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Linus Torvalds, linux-kernel, Andrew Morton, pv-drivers,
	Andrei Warkentin, stable

On Mon, 2011-12-12 at 10:02 -0800, Dmitry Torokhov wrote:
> 1 is a power of two, therefore rounddown_pow_of_two(1) should return 1.

x^0 = 1
x^1 = x

Seems to me 0 was the right answer, no?



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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-12-12 23:50 ` Linus Torvalds
@ 2011-12-13  6:01   ` Dmitry Torokhov
  0 siblings, 0 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2011-12-13  6:01 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: linux-kernel, Andrew Morton, pv-drivers, Andrei Warkentin,
	stable, Jesper Juhl, Rolf Eike Beer

On Mon, Dec 12, 2011 at 03:50:11PM -0800, Linus Torvalds wrote:
> On Mon, Dec 12, 2011 at 10:02 AM, Dmitry Torokhov <dtor@vmware.com> wrote:
> > From: Andrei Warkentin <andreiw@vmware.com>
> >
> > 1 is a power of two, therefore rounddown_pow_of_two(1) should return 1.
> > It does in case the argument is a variable but in case it's a constant
> > it behaves incorrectly and returns 0. Probably nobody ever did it so
> > this was never noticed, however drivers/net/vmxnet3 with latest GCC does
> > and breaks on unicpu systems.
> >
> > This is similar to Rolf's patch to roundup_pow_of_two(1).
> 
> Umm. I already applied this patch, but then I started looking at it
> more, and asked myself:
> 
>  - Why is that "n == 1" test there AT ALL?
> 
> Afaik, that whole test is just plain stupid. It seems to have been
> copied from the "roundup()" case (where it exists due to the "-1/+1"
> hackery that breaks ilog2()) without any thought about the actual math
> of the function at all.
> 
> I think the *real* fix is to just remove that incorrect line, no?

Yes, you are right, special-casing for 1 is not necessary in rounddown
case.

Thanks,
Dmitry


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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-12-12 18:02 [PATCH] include/log2.h: Fix rounddown_pow_of_two(1) Dmitry Torokhov
@ 2011-12-12 23:50 ` Linus Torvalds
  2011-12-13  6:01   ` Dmitry Torokhov
  2011-12-13 20:00 ` Peter Zijlstra
  1 sibling, 1 reply; 21+ messages in thread
From: Linus Torvalds @ 2011-12-12 23:50 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: linux-kernel, Andrew Morton, pv-drivers, Andrei Warkentin,
	stable, Jesper Juhl, Rolf Eike Beer

On Mon, Dec 12, 2011 at 10:02 AM, Dmitry Torokhov <dtor@vmware.com> wrote:
> From: Andrei Warkentin <andreiw@vmware.com>
>
> 1 is a power of two, therefore rounddown_pow_of_two(1) should return 1.
> It does in case the argument is a variable but in case it's a constant
> it behaves incorrectly and returns 0. Probably nobody ever did it so
> this was never noticed, however drivers/net/vmxnet3 with latest GCC does
> and breaks on unicpu systems.
>
> This is similar to Rolf's patch to roundup_pow_of_two(1).

Umm. I already applied this patch, but then I started looking at it
more, and asked myself:

 - Why is that "n == 1" test there AT ALL?

Afaik, that whole test is just plain stupid. It seems to have been
copied from the "roundup()" case (where it exists due to the "-1/+1"
hackery that breaks ilog2()) without any thought about the actual math
of the function at all.

I think the *real* fix is to just remove that incorrect line, no?

It's a bit sad that we apparently have several reviewers for this
trivial patch, and nobody reacted to the math just not making any
sense.

                                      Linus

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

* [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
@ 2011-12-12 18:02 Dmitry Torokhov
  2011-12-12 23:50 ` Linus Torvalds
  2011-12-13 20:00 ` Peter Zijlstra
  0 siblings, 2 replies; 21+ messages in thread
From: Dmitry Torokhov @ 2011-12-12 18:02 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: linux-kernel, Andrew Morton, pv-drivers, Andrei Warkentin,
	stable, Dmitry Torokhov

From: Andrei Warkentin <andreiw@vmware.com>

1 is a power of two, therefore rounddown_pow_of_two(1) should return 1.
It does in case the argument is a variable but in case it's a constant
it behaves incorrectly and returns 0. Probably nobody ever did it so
this was never noticed, however drivers/net/vmxnet3 with latest GCC does
and breaks on unicpu systems.

This is similar to Rolf's patch to roundup_pow_of_two(1).

Signed-off-by: Andrei Warkentin <andreiw@vmware.com>
Reviewed-by: Jesper Juhl <jj@chaosbits.net>
Reviewed-by: Rolf Eike Beer <eike-kernel@sf-tec.de>
Cc: stable@kernel.org
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
---
 include/linux/log2.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/linux/log2.h b/include/linux/log2.h
index 25b8086..ccda848 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -185,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
 #define rounddown_pow_of_two(n)			\
 (						\
 	__builtin_constant_p(n) ? (		\
-		(n == 1) ? 0 :			\
+		(n == 1) ? 1 :			\
 		(1UL << ilog2(n))) :		\
 	__rounddown_pow_of_two(n)		\
  )
-- 
1.7.4.1


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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-14 21:17   ` Andrei Warkentin
@ 2011-11-14 23:27     ` Jesper Juhl
  0 siblings, 0 replies; 21+ messages in thread
From: Jesper Juhl @ 2011-11-14 23:27 UTC (permalink / raw)
  To: Andrei Warkentin; +Cc: linux-kernel, Andrei Warkentin

On Mon, 14 Nov 2011, Andrei Warkentin wrote:

> ----- Original Message -----
> > From: "Jesper Juhl" <jj@chaosbits.net>
> > To: "Andrei Warkentin" <andreiw@vmware.com>
> > Cc: linux-kernel@vger.kernel.org
> > Sent: Tuesday, November 8, 2011 2:57:27 PM
> > Subject: Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
> > 
> > On Tue, 8 Nov 2011, Andrei Warkentin wrote:
> > 
> > > 1 is a power of two, therefore rounddown_pow_of_two(1) should
> > > return 1. It does
> > > in case the argument is a variable but in case it's a constant it
> > > behaves
> > > wrong and returns 0. Probably nobody ever did it so this was never
> > > noticed,
> > > however net/drivers/vmxnet3 with latest GCC does and breaks on
> > > unicpu systems.
> > > 
> > > Signed-off-by: Andrei Warkentin <andreiw@vmware.com>
> > > ---
> > >  include/linux/log2.h |    2 +-
> > >  1 files changed, 1 insertions(+), 1 deletions(-)
> > > 
> > > diff --git a/include/linux/log2.h b/include/linux/log2.h
> > > index 25b8086..ccda848 100644
> > > --- a/include/linux/log2.h
> > > +++ b/include/linux/log2.h
> > > @@ -185,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned
> > > long n)
> > >  #define rounddown_pow_of_two(n)			\
> > >  (						\
> > >  	__builtin_constant_p(n) ? (		\
> > > -		(n == 1) ? 0 :			\
> > > +		(n == 1) ? 1 :			\
> > >  		(1UL << ilog2(n))) :		\
> > >  	__rounddown_pow_of_two(n)		\
> > >   )
> > > 
> > 
> > For what it's worth; looks good to me.
> 
> Is that an Acked-by or a Reviewed-by?
> 
I don't really know (to be honest). I guess it is whichever is weakest, 
since I did review the patch and convinced myself that the change was 
sane, but didn't spent a whole lot of time checking that *all* users were 
OK with it...


-- 
Jesper Juhl <jj@chaosbits.net>       http://www.chaosbits.net/
Don't top-post http://www.catb.org/jargon/html/T/top-post.html
Plain text mails only, please.


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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-08 19:57 ` Jesper Juhl
@ 2011-11-14 21:17   ` Andrei Warkentin
  2011-11-14 23:27     ` Jesper Juhl
  0 siblings, 1 reply; 21+ messages in thread
From: Andrei Warkentin @ 2011-11-14 21:17 UTC (permalink / raw)
  To: Jesper Juhl; +Cc: linux-kernel, Andrei Warkentin

----- Original Message -----
> From: "Jesper Juhl" <jj@chaosbits.net>
> To: "Andrei Warkentin" <andreiw@vmware.com>
> Cc: linux-kernel@vger.kernel.org
> Sent: Tuesday, November 8, 2011 2:57:27 PM
> Subject: Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
> 
> On Tue, 8 Nov 2011, Andrei Warkentin wrote:
> 
> > 1 is a power of two, therefore rounddown_pow_of_two(1) should
> > return 1. It does
> > in case the argument is a variable but in case it's a constant it
> > behaves
> > wrong and returns 0. Probably nobody ever did it so this was never
> > noticed,
> > however net/drivers/vmxnet3 with latest GCC does and breaks on
> > unicpu systems.
> > 
> > Signed-off-by: Andrei Warkentin <andreiw@vmware.com>
> > ---
> >  include/linux/log2.h |    2 +-
> >  1 files changed, 1 insertions(+), 1 deletions(-)
> > 
> > diff --git a/include/linux/log2.h b/include/linux/log2.h
> > index 25b8086..ccda848 100644
> > --- a/include/linux/log2.h
> > +++ b/include/linux/log2.h
> > @@ -185,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned
> > long n)
> >  #define rounddown_pow_of_two(n)			\
> >  (						\
> >  	__builtin_constant_p(n) ? (		\
> > -		(n == 1) ? 0 :			\
> > +		(n == 1) ? 1 :			\
> >  		(1UL << ilog2(n))) :		\
> >  	__rounddown_pow_of_two(n)		\
> >   )
> > 
> 
> For what it's worth; looks good to me.

Is that an Acked-by or a Reviewed-by?

Thanks,
A

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

* Re: [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
  2011-11-08 19:08 Andrei Warkentin
@ 2011-11-08 19:57 ` Jesper Juhl
  2011-11-14 21:17   ` Andrei Warkentin
  0 siblings, 1 reply; 21+ messages in thread
From: Jesper Juhl @ 2011-11-08 19:57 UTC (permalink / raw)
  To: Andrei Warkentin; +Cc: linux-kernel

On Tue, 8 Nov 2011, Andrei Warkentin wrote:

> 1 is a power of two, therefore rounddown_pow_of_two(1) should return 1. It does
> in case the argument is a variable but in case it's a constant it behaves
> wrong and returns 0. Probably nobody ever did it so this was never noticed,
> however net/drivers/vmxnet3 with latest GCC does and breaks on unicpu systems.
> 
> Signed-off-by: Andrei Warkentin <andreiw@vmware.com>
> ---
>  include/linux/log2.h |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/include/linux/log2.h b/include/linux/log2.h
> index 25b8086..ccda848 100644
> --- a/include/linux/log2.h
> +++ b/include/linux/log2.h
> @@ -185,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  #define rounddown_pow_of_two(n)			\
>  (						\
>  	__builtin_constant_p(n) ? (		\
> -		(n == 1) ? 0 :			\
> +		(n == 1) ? 1 :			\
>  		(1UL << ilog2(n))) :		\
>  	__rounddown_pow_of_two(n)		\
>   )
> 

For what it's worth; looks good to me.

-- 
Jesper Juhl <jj@chaosbits.net>       http://www.chaosbits.net/
Don't top-post http://www.catb.org/jargon/html/T/top-post.html
Plain text mails only, please.


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

* [PATCH] include/log2.h: Fix rounddown_pow_of_two(1)
@ 2011-11-08 19:08 Andrei Warkentin
  2011-11-08 19:57 ` Jesper Juhl
  0 siblings, 1 reply; 21+ messages in thread
From: Andrei Warkentin @ 2011-11-08 19:08 UTC (permalink / raw)
  To: linux-kernel; +Cc: Andrei Warkentin

1 is a power of two, therefore rounddown_pow_of_two(1) should return 1. It does
in case the argument is a variable but in case it's a constant it behaves
wrong and returns 0. Probably nobody ever did it so this was never noticed,
however net/drivers/vmxnet3 with latest GCC does and breaks on unicpu systems.

Signed-off-by: Andrei Warkentin <andreiw@vmware.com>
---
 include/linux/log2.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/linux/log2.h b/include/linux/log2.h
index 25b8086..ccda848 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -185,7 +185,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
 #define rounddown_pow_of_two(n)			\
 (						\
 	__builtin_constant_p(n) ? (		\
-		(n == 1) ? 0 :			\
+		(n == 1) ? 1 :			\
 		(1UL << ilog2(n))) :		\
 	__rounddown_pow_of_two(n)		\
  )
-- 
1.7.4.1


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

end of thread, other threads:[~2011-12-13 20:06 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-16 19:56 [PATCH] include/log2.h: Fix rounddown_pow_of_two(1) Andrei Warkentin
2011-11-16 22:51 ` Rolf Eike Beer
2011-11-17 23:05 ` Andrew Morton
2011-11-17 23:19   ` [opensuse-kernel] " Cristian Rodríguez
2011-11-17 23:32     ` Andrew Morton
2011-11-18 18:46   ` Andrei Warkentin
2011-11-19  9:26   ` Marco Stornelli
2011-11-22 23:34   ` Guennadi Liakhovetski
2011-11-23 14:52   ` [PATCH] mmc: sh_mmcif: simplify clock divisor calculation Guennadi Liakhovetski
2011-11-23 14:52     ` Guennadi Liakhovetski
2011-12-01 18:24     ` Chris Ball
2011-12-01 18:24       ` Chris Ball
  -- strict thread matches above, loose matches on Subject: below --
2011-12-12 18:02 [PATCH] include/log2.h: Fix rounddown_pow_of_two(1) Dmitry Torokhov
2011-12-12 23:50 ` Linus Torvalds
2011-12-13  6:01   ` Dmitry Torokhov
2011-12-13 20:00 ` Peter Zijlstra
2011-12-13 20:05   ` Peter Zijlstra
2011-11-08 19:08 Andrei Warkentin
2011-11-08 19:57 ` Jesper Juhl
2011-11-14 21:17   ` Andrei Warkentin
2011-11-14 23:27     ` Jesper Juhl

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.