2022-06-03 18:08:50

by Ian Rogers

[permalink] [raw]
Subject: [PATCH] libbpf: Fix is_pow_of_2

From: Yuze Chi <[email protected]>

There is a missing not. Consider a power of 2 number like 4096:

x && (x & (x - 1))
4096 && (4096 & (4096 - 1))
4096 && (4096 & 4095)
4096 && 0
0

with the not this is:
x && !(x & (x - 1))
4096 && !(4096 & (4096 - 1))
4096 && !(4096 & 4095)
4096 && !0
4096 && 1
1

Reported-by: Yuze Chi <[email protected]>
Signed-off-by: Yuze Chi <[email protected]>
Signed-off-by: Ian Rogers <[email protected]>
---
tools/lib/bpf/libbpf.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 3f4f18684bd3..fd0414ea00df 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -4956,7 +4956,7 @@ static void bpf_map__destroy(struct bpf_map *map);

static bool is_pow_of_2(size_t x)
{
- return x && (x & (x - 1));
+ return x && !(x & (x - 1));
}

static size_t adjust_ringbuf_sz(size_t sz)
--
2.36.1.255.ge46751e96f-goog


2022-06-06 05:18:53

by Zvi Effron

[permalink] [raw]
Subject: Re: [PATCH] libbpf: Fix is_pow_of_2

On Thu, Jun 2, 2022 at 9:17 PM Ian Rogers <[email protected]> wrote:
>
> From: Yuze Chi <[email protected]>
>
> There is a missing not. Consider a power of 2 number like 4096:
>
> x && (x & (x - 1))
> 4096 && (4096 & (4096 - 1))
> 4096 && (4096 & 4095)
> 4096 && 0
> 0
>
> with the not this is:
> x && !(x & (x - 1))
> 4096 && !(4096 & (4096 - 1))
> 4096 && !(4096 & 4095)
> 4096 && !0
> 4096 && 1
> 1
>
> Reported-by: Yuze Chi <[email protected]>
> Signed-off-by: Yuze Chi <[email protected]>
> Signed-off-by: Ian Rogers <[email protected]>
> ---
> tools/lib/bpf/libbpf.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index 3f4f18684bd3..fd0414ea00df 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -4956,7 +4956,7 @@ static void bpf_map__destroy(struct bpf_map *map);
>
> static bool is_pow_of_2(size_t x)
> {
> - return x && (x & (x - 1));
> + return x && !(x & (x - 1));

No idea if anyone cares about the consistency, but in linker.c (same directory)
the same static function is defined using == 0 at the end instead of using the
not operator.

Aside from the consistency issue, personally I find the == 0 version a little
bit easier to read and understand because it's a bit less dense (and a "!" next
to a "(" is an easy character to overlook).

> }
>
> static size_t adjust_ringbuf_sz(size_t sz)
> --
> 2.36.1.255.ge46751e96f-goog
>

2022-06-19 17:22:09

by Pavel Machek

[permalink] [raw]
Subject: Re: [PATCH] libbpf: Fix is_pow_of_2

Hi!

> From: Yuze Chi <[email protected]>
>
> +++ b/tools/lib/bpf/libbpf.c
> @@ -4956,7 +4956,7 @@ static void bpf_map__destroy(struct bpf_map *map);
>
> static bool is_pow_of_2(size_t x)
> {
> - return x && (x & (x - 1));
> + return x && !(x & (x - 1));
> }

I'm pretty sure we have this test in macro in includes somewhere... should we use
that instead?
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

2022-06-21 23:06:28

by Zvi Effron

[permalink] [raw]
Subject: Re: [PATCH] libbpf: Fix is_pow_of_2

On Sun, Jun 19, 2022 at 12:13 PM Pavel Machek <[email protected]> wrote:
>
> Hi!
>
> > From: Yuze Chi <[email protected]>
> >
> > +++ b/tools/lib/bpf/libbpf.c
> > @@ -4956,7 +4956,7 @@ static void bpf_map__destroy(struct bpf_map *map);
> >
> > static bool is_pow_of_2(size_t x)
> > {
> > - return x && (x & (x - 1));
> > + return x && !(x & (x - 1));
> > }
>
> I'm pretty sure we have this test in macro in includes somewhere... should we use
> that instead?

I went looking for a macro that provided this check and could not find one. I
did find the inlined static function is_power_of_2 in log2.h, though, that we
could use.

> Pavel
> --
> (english) http://www.livejournal.com/~pavelmachek
> (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

2022-06-22 00:56:14

by Tiezhu Yang

[permalink] [raw]
Subject: Re: [PATCH] libbpf: Fix is_pow_of_2



On 06/22/2022 07:03 AM, Zvi Effron wrote:
> On Sun, Jun 19, 2022 at 12:13 PM Pavel Machek <[email protected]> wrote:
>>
>> Hi!
>>
>>> From: Yuze Chi <[email protected]>
>>>
>>> +++ b/tools/lib/bpf/libbpf.c
>>> @@ -4956,7 +4956,7 @@ static void bpf_map__destroy(struct bpf_map *map);
>>>
>>> static bool is_pow_of_2(size_t x)
>>> {
>>> - return x && (x & (x - 1));
>>> + return x && !(x & (x - 1));
>>> }
>>
>> I'm pretty sure we have this test in macro in includes somewhere... should we use
>> that instead?
>
> I went looking for a macro that provided this check and could not find one. I

arch/microblaze/mm/pgtable.c

#define is_power_of_2(x) ((x) != 0 && (((x) & ((x) - 1)) == 0))

> did find the inlined static function is_power_of_2 in log2.h, though, that we
> could use.

Here is a patch, but it seems that this is not worth the extra pain.

https://lore.kernel.org/bpf/[email protected]/

Thanks,
Tiezhu