* [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
* [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-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
* 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 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-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
* [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
* 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
* 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-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
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.