lkml.org 
[lkml]   [2016]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [RFC/PATCH] linux/kernel.h: Fix DIV_ROUND_CLOSEST to support negative divisors
From
Date
On 12/22/2016 02:22 AM, Niklas Söderlund wrote:
> Add support to DIV_ROUND_CLOSEST for negative divisors if both dividend
> and divisor variable types are signed. This should not alter current
> behavior for users of the macro as previously negative divisors where
> not supported.
>
> Before:
>
> DIV_ROUND_CLOSEST( 59, 4) = 15
> DIV_ROUND_CLOSEST( 59, -4) = -14
> DIV_ROUND_CLOSEST( -59, 4) = -15
> DIV_ROUND_CLOSEST( -59, -4) = 14
>
> After:
>
> DIV_ROUND_CLOSEST( 59, 4) = 15
> DIV_ROUND_CLOSEST( 59, -4) = -15
> DIV_ROUND_CLOSEST( -59, 4) = -15
> DIV_ROUND_CLOSEST( -59, -4) = 15
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> ---
>
> Hi,
>
> While working on a thermal driver I encounter a scenario where the
> divisor could be negative, instead of adding local code to handle this I
> though I first try to add support for this in DIV_ROUND_CLOSEST.
>
> Maybe there is a reason why this is not already supported? If so please
> let me know and I can do something locally in the driver and sorry for
> the noise.
>

Only reason is that I could not figure out a way to make it work.
LGTM except for nitpick.

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

> include/linux/kernel.h | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> index bc6ed52a39b9..f1b2f7e1b2f0 100644
> --- a/include/linux/kernel.h
> +++ b/include/linux/kernel.h
> @@ -95,16 +95,18 @@
> )
>
> /*
> - * Divide positive or negative dividend by positive divisor and round
> - * to closest integer. Result is undefined for negative divisors and
> - * for negative dividends if the divisor variable type is unsigned.
> + * Divide positive or negative dividend by positive or negative divisor
> + * and round to closest integer. Result is undefined for negative
> + * divisors if dividends variable type is unsigned and for negative

s/dividends/the dividend/

> + * 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) ? \
> + ((typeof(divisor))-1) > 0 || \
> + (((__x) > 0) == ((__d) > 0))) ? \
> (((__x) + ((__d) / 2)) / (__d)) : \
> (((__x) - ((__d) / 2)) / (__d)); \
> } \
>

\
 
 \ /
  Last update: 2016-12-22 15:49    [W:0.357 / U:1.264 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site