Skip to content

Commit

Permalink
[PATCH] roundup_pow_of_two() 64-bit fix
Browse files Browse the repository at this point in the history
fls() takes an integer, so roundup_pow_of_two() is busted for ulongs larger
than 2^32-1.

Fix this by implementing and using fls_long().

(Why does roundup_pow_of_two() return a long?)

(Why is roundup_pow_of_two() __attribute_const__ whereas long_log2() is
__attribute_pure__?)

(Why does long_log2() suck so much?  Because we were missing fls_long()?)

Cc: Roland Dreier <rdreier@cisco.com>
Cc: "Chen, Kenneth W" <kenneth.w.chen@intel.com>
Cc: John Hawkes <hawkes@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Andrew Morton authored and Linus Torvalds committed Mar 25, 2006
1 parent 231bed2 commit 962749a
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
7 changes: 7 additions & 0 deletions include/linux/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,4 +175,11 @@ static inline __u32 ror32(__u32 word, unsigned int shift)
return (word >> shift) | (word << (32 - shift));
}

static inline unsigned fls_long(unsigned long l)
{
if (sizeof(l) == 4)
return fls(l);
return fls64(l);
}

#endif
5 changes: 3 additions & 2 deletions include/linux/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,10 @@ static inline int __attribute_pure__ long_log2(unsigned long x)
return r;
}

static inline unsigned long __attribute_const__ roundup_pow_of_two(unsigned long x)
static inline unsigned long
__attribute_const__ roundup_pow_of_two(unsigned long x)
{
return (1UL << fls(x - 1));
return 1UL << fls_long(x - 1);
}

extern int printk_ratelimit(void);
Expand Down

0 comments on commit 962749a

Please sign in to comment.