On Tue, Feb 12, 2019 at 09:45:52AM -0800, Linus Torvalds wrote:
> On Tue, Feb 12, 2019 at 9:14 AM Frederic Weisbecker <frede...@kernel.org> 
> wrote:
> >
> > +
> > +       while (vectors) {
> > +               long fs = __ffs64(vectors) + 1;
> > +
> > +               vectors >>= fs;
> 
> This is wrong.
> 
> If "vectors" only has the high hit set, you end up with "fs" having
> the value "64".
> 
> And then "vectors >>= fs" is undefined and won't actually do anything
> at all on x86.

Oh! ok didn't know that...

> 
> In general, avoid "ffs()", and the stupid pattern of "__ffs(x)+1".
> 
> Bit numbering starts at 0. "ffs()" is wrong. And you never *ever* just
> add one to a bit number in order to shift by one more bit, exactly
> because of overflow issues.
> 
> So it may look inefficient, but the correct thing to do is
> 
>     long bit = __ffs64(vectors);
>     vectors >>= fs;
>     vectors >>= 1;
> 
> because that actually works.

I see, perhaps I should use for_each_set_bit() that should take care about those
details?

Thanks.

Reply via email to