[lkml]   [2011]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[29/53] linux/log2.h: Fix rounddown_pow_of_two(1)
    3.1-stable review patch.  If anyone has any objections, please let me know.


    From: Linus Torvalds <>

    commit 13c07b0286d340275f2d97adf085cecda37ede37 upstream.

    Exactly like roundup_pow_of_two(1), the rounddown version was buggy for
    the case of a compile-time constant '1' argument. Probably because it
    originated from the same code, sharing history with the roundup version
    from before the bugfix (for that one, see commit 1a06a52ee1b0: "Fix

    However, unlike the roundup version, the fix for rounddown is to just
    remove the broken special case entirely. It's simply not needed - the
    generic code

    1UL << ilog2(n)

    does the right thing for the constant '1' argment too. The only reason
    roundup needed that special case was because rounding up does so by
    subtracting one from the argument (and then adding one to the result)
    causing the obvious problems with "ilog2(0)".

    But rounddown doesn't do any of that, since ilog2() naturally truncates
    (ie "rounds down") to the right rounded down value. And without the
    ilog2(0) case, there's no reason for the special case that had the wrong

    tl;dr: rounddown_pow_of_two(1) should be 1, not 0.

    Acked-by: Dmitry Torokhov <>
    Signed-off-by: Linus Torvalds <>
    Signed-off-by: Greg Kroah-Hartman <>

    include/linux/log2.h | 1 -
    1 file changed, 1 deletion(-)

    --- a/include/linux/log2.h
    +++ b/include/linux/log2.h
    @@ -185,7 +185,6 @@ unsigned long __rounddown_pow_of_two(uns
    #define rounddown_pow_of_two(n) \
    ( \
    __builtin_constant_p(n) ? ( \
    - (n == 1) ? 0 : \
    (1UL << ilog2(n))) : \
    __rounddown_pow_of_two(n) \

     \ /
      Last update: 2011-12-16 20:55    [W:0.020 / U:9.704 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site