On Tue, 27 Jan 2026, Cristian Ciocaltea <[email protected]> wrote: > Currently DIV_ROUND_CLOSEST() is only available for the kernel via > include/linux/math.h. > > Expose it to userland as well by adding __KERNEL_DIV_ROUND_CLOSEST() as > a common definition in uapi. > > Additionally, ensure it allows building ISO C applications by switching > from the 'typeof' GNU extension to the ISO-friendly __typeof__.
I am not convinced that it's a good idea to make the implementation of kernel DIV_ROUND_CLOSEST() part of the kernel UAPI, which is what this change effectively does. I'd at least like to get an ack from Andy Shevchenko first (Cc'd). BR, Jani. > Reviewed-by: NĂcolas F. R. A. Prado <[email protected]> > Tested-by: Diederik de Haas <[email protected]> > Signed-off-by: Cristian Ciocaltea <[email protected]> > --- > include/linux/math.h | 18 +----------------- > include/uapi/linux/const.h | 17 +++++++++++++++++ > 2 files changed, 18 insertions(+), 17 deletions(-) > > diff --git a/include/linux/math.h b/include/linux/math.h > index 6dc1d1d32fbc..1e8fb3efbc8c 100644 > --- a/include/linux/math.h > +++ b/include/linux/math.h > @@ -89,23 +89,7 @@ > } \ > ) > > -/* > - * Divide positive or negative dividend by positive or negative divisor > - * and round to closest integer. Result is undefined for negative > - * divisors if the dividend variable type is unsigned and for negative > - * dividends if the divisor variable type is unsigned. > - */ > -#define DIV_ROUND_CLOSEST(x, divisor)( \ > -{ \ > - typeof(x) __x = x; \ > - typeof(divisor) __d = divisor; \ > - (((typeof(x))-1) > 0 || \ > - ((typeof(divisor))-1) > 0 || \ > - (((__x) > 0) == ((__d) > 0))) ? \ > - (((__x) + ((__d) / 2)) / (__d)) : \ > - (((__x) - ((__d) / 2)) / (__d)); \ > -} \ > -) > +#define DIV_ROUND_CLOSEST __KERNEL_DIV_ROUND_CLOSEST > /* > * Same as above but for u64 dividends. divisor must be a 32-bit > * number. > diff --git a/include/uapi/linux/const.h b/include/uapi/linux/const.h > index b8f629ef135f..471877322f47 100644 > --- a/include/uapi/linux/const.h > +++ b/include/uapi/linux/const.h > @@ -50,4 +50,21 @@ > > #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) > > +/* > + * Divide positive or negative dividend by positive or negative divisor > + * and round to closest integer. Result is undefined for negative > + * divisors if the dividend variable type is unsigned and for negative > + * dividends if the divisor variable type is unsigned. > + */ > +#define __KERNEL_DIV_ROUND_CLOSEST(x, divisor)( \ > +{ \ > + __typeof__(x) __x = x; \ > + __typeof__(divisor) __d = divisor; \ > + (((__typeof__(x))-1) > 0 || \ > + ((__typeof__(divisor))-1) > 0 || \ > + (((__x) > 0) == ((__d) > 0))) ? \ > + (((__x) + ((__d) / 2)) / (__d)) : \ > + (((__x) - ((__d) / 2)) / (__d)); \ > +} \ > +) > #endif /* _UAPI_LINUX_CONST_H */ -- Jani Nikula, Intel
