* 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; 12+ 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] 12+ 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; 12+ 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] 12+ 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; 12+ 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] 12+ 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; 12+ 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] 12+ 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; 12+ 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] 12+ 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; 12+ 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] 12+ messages in thread* [PATCH] mmc: sh_mmcif: simplify clock divisor calculation
@ 2011-11-23 14:52 ` Guennadi Liakhovetski
0 siblings, 0 replies; 12+ 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] 12+ 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; 12+ 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] 12+ messages in thread
* Re: [PATCH] mmc: sh_mmcif: simplify clock divisor calculation
@ 2011-12-01 18:24 ` Chris Ball
0 siblings, 0 replies; 12+ 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] 12+ messages in thread