From 7baa7bcaf58b7fe89aab6e5e7c0f46cc4adc2b93 Mon Sep 17 00:00:00 2001 From: Julius Werner Date: Mon, 22 Jan 2018 13:56:13 -0800 Subject: [PATCH] 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 --- include/lib/utils_def.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/lib/utils_def.h b/include/lib/utils_def.h index 185a1c129..145e1967e 100644 --- a/include/lib/utils_def.h +++ b/include/lib/utils_def.h @@ -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).