Make div_round_up() correct for divisors that are not a power of 2
The current div_round_up() implementation relies on round_up() which only works correctly for boundaries that are a power of 2. It is documented as such, but this still seems dangerously easy to overlook, especially since many other environments (e.g. the Linux kernel) have a similar macro without these limitations. There is a different way to calculate this that can deal with all kinds of divisors without other drawbacks, so let's just use that instead. Change-Id: Id382736683f5d4e880ef00c53cfa23a2f9208440 Signed-off-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
parent
211d307c6b
commit
7baa7bcaf5
|
@ -24,6 +24,11 @@
|
|||
*/
|
||||
#define DIV_ROUND_UP_2EVAL(n, d) (((n) + (d) - 1) / (d))
|
||||
|
||||
#define div_round_up(val, div) __extension__ ({ \
|
||||
__typeof__(div) _div = (div); \
|
||||
((val) + _div - 1) / _div; \
|
||||
})
|
||||
|
||||
#define MIN(x, y) __extension__ ({ \
|
||||
__typeof__(x) _x = (x); \
|
||||
__typeof__(y) _y = (y); \
|
||||
|
@ -55,11 +60,6 @@
|
|||
#define round_down(value, boundary) \
|
||||
((value) & ~round_boundary(value, boundary))
|
||||
|
||||
#define div_round_up(val, div) __extension__ ({ \
|
||||
__typeof__(div) _div = (div); \
|
||||
round_up((val), _div)/_div; \
|
||||
})
|
||||
|
||||
/*
|
||||
* Evaluates to 1 if (ptr + inc) overflows, 0 otherwise.
|
||||
* Both arguments must be unsigned pointer values (i.e. uintptr_t).
|
||||
|
|
Loading…
Reference in New Issue