[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAADnVQKcX2xEWCHu-DX0Cy_mvCL6E0aE_BF1Wo+U-vy_Bi2-3w@mail.gmail.com>
Date: Tue, 10 May 2022 09:50:40 -0700
From: Alexei Starovoitov <alexei.starovoitov@...il.com>
To: Yury Norov <yury.norov@...il.com>
Cc: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>,
David Laight <David.Laight@...lab.com>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Joe Perches <joe@...ches.com>,
Julia Lawall <Julia.Lawall@...ia.fr>,
Michał Mirosław <mirq-linux@...e.qmqm.pl>,
Nicholas Piggin <npiggin@...il.com>,
Nicolas Palix <nicolas.palix@...g.fr>,
Peter Zijlstra <peterz@...radead.org>,
Rasmus Villemoes <linux@...musvillemoes.dk>,
Matti Vaittinen <Matti.Vaittinen@...rohmeurope.com>,
LKML <linux-kernel@...r.kernel.org>,
Alexei Starovoitov <ast@...nel.org>,
Andrew Morton <akpm@...ux-foundation.org>,
Chris Zankel <chris@...kel.net>,
Christophe Leroy <christophe.leroy@...roup.eu>,
"Eric W . Biederman" <ebiederm@...ssion.com>,
Kumar Kartikeya Dwivedi <memxor@...il.com>,
Max Filippov <jcmvbkbc@...il.com>,
Toke Høiland-Jørgensen <toke@...hat.com>,
linux-xtensa@...ux-xtensa.org
Subject: Re: [PATCH 08/22] bitops: introduce MANY_BITS() macro
On Tue, May 10, 2022 at 8:48 AM Yury Norov <yury.norov@...il.com> wrote:
>
> arch/xtensa/kernel/traps.c and include/linux/log2.h define very similar
> functions with different behaviour. XTENSA defines IS_POW2(), and
> log2.h defines is_power_of_2(). The difference is that IS_POW2()
> considers 0 as power of 2, while is_power_of_2() - does not.
>
> This discrepancy may confuse reader. From mathematical point of view,
> 0 is not a power of 2. So let's introduce macro MANY_BITS(), which
> returns true if 2 or more bits are set in a number (which is what
> XTENSA actually needs), and use it in is_power_of_2().
>
> CC: Alexei Starovoitov <ast@...nel.org>
> CC: Andrew Morton <akpm@...ux-foundation.org>
> CC: Chris Zankel <chris@...kel.net>
> CC: Christophe Leroy <christophe.leroy@...roup.eu>
> CC: Eric W. Biederman <ebiederm@...ssion.com>
> CC: Kumar Kartikeya Dwivedi <memxor@...il.com>
> CC: Max Filippov <jcmvbkbc@...il.com>
> CC: Toke Høiland-Jørgensen <toke@...hat.com>
> CC: linux-xtensa@...ux-xtensa.org
> CC: linux-kernel@...r.kernel.org
> Signed-off-by: Yury Norov <yury.norov@...il.com>
> ---
> arch/xtensa/kernel/traps.c | 5 +----
> include/linux/bitops.h | 3 +++
> include/linux/log2.h | 2 +-
> 3 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c
> index 138a86fbe9d7..040ec38bfce2 100644
> --- a/arch/xtensa/kernel/traps.c
> +++ b/arch/xtensa/kernel/traps.c
> @@ -203,10 +203,7 @@ static void do_multihit(struct pt_regs *regs)
>
> #if XTENSA_FAKE_NMI
>
> -#define IS_POW2(v) (((v) & ((v) - 1)) == 0)
> -
> -#if !(PROFILING_INTLEVEL == XCHAL_EXCM_LEVEL && \
> - IS_POW2(XTENSA_INTLEVEL_MASK(PROFILING_INTLEVEL)))
> +#if (MANY_BITS(XTENSA_INTLEVEL_MASK(PROFILING_INTLEVEL)) || PROFILING_INTLEVEL != XCHAL_EXCM_LEVEL)
> #warning "Fake NMI is requested for PMM, but there are other IRQs at or above its level."
> #warning "Fake NMI will be used, but there will be a bugcheck if one of those IRQs fire."
>
> diff --git a/include/linux/bitops.h b/include/linux/bitops.h
> index 7aaed501f768..96bc6a2552d6 100644
> --- a/include/linux/bitops.h
> +++ b/include/linux/bitops.h
> @@ -21,6 +21,9 @@
> #define BITS_TO_U32(nr) __KERNEL_DIV_ROUND_UP(nr, BITS_PER_TYPE(u32))
> #define BITS_TO_BYTES(nr) __KERNEL_DIV_ROUND_UP(nr, BITS_PER_TYPE(char))
>
> +/* Return: nonzero if 2 or more bits are set */
> +#define MANY_BITS(n) ((n) & ((n) - 1))
> +
> extern unsigned int __sw_hweight8(unsigned int w);
> extern unsigned int __sw_hweight16(unsigned int w);
> extern unsigned int __sw_hweight32(unsigned int w);
> diff --git a/include/linux/log2.h b/include/linux/log2.h
> index 9f30d087a128..335b9dbd302d 100644
> --- a/include/linux/log2.h
> +++ b/include/linux/log2.h
> @@ -44,7 +44,7 @@ int __ilog2_u64(u64 n)
> static inline __attribute__((const))
> bool is_power_of_2(unsigned long n)
> {
> - return (n != 0 && ((n & (n - 1)) == 0));
> + return n != 0 && !MANY_BITS(n);
> }
Please don't. Open coded version is much easier to read.
Powered by blists - more mailing lists