Re: [PATCH 22/36] move round_up/down to kernel.h

Andi Kleen
2010-01-21T23:14:40Z

Christoph Lameter <cl@linux-foundation.org> writes:

> On Wed, 20 Jan 2010, Yinghai Lu wrote:
>
>> + * This looks more complex than it should be. But we need to
>> + * get the type for the ~ right in round_down (it needs to be
>> + * as wide as the result!), and we want to evaluate the macro
>> + * arguments just once each.
>> + */
>> +#define __round_mask(x,y) ((__typeof__(x))((y)-1))
>> +#define round_up(x,y) ((((x)-1) | __round_mask(x,y))+1)
>> +#define round_down(x,y) ((x) & ~__round_mask(x,y))
>> +
>> #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
>> #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
>> #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
>
> So we are back to the earlier version.
>
> Two functions doing the same thing. round_up and roundup.
>
> If they are different(are they really used that way?) then they should
> have names that emphasize the difference.

round_up() basically only works for power of two, but they
should generate the same code for constants.

The only user right now is e820.c, but it uses the second
argument with non constants, so would generate a slower
true division with roundup() Right now it probably doesn't
make much difference because e820 lists are small, but I saw
a patchkit to let e820 replace bootmem and then they might
not be anymore.

-Andi

--
ak@linux.intel.com -- Speaking for myself only.