Re: [PATCH v1 1/1] x86/percpu: Cast -1 to argument type when comparing in percpu_add_op()

From: Dave Hansen
Date: Wed Oct 16 2024 - 15:44:36 EST


On 10/16/24 12:20, Peter Zijlstra wrote:
> The code as is, is wrong, I don't think we'll ever end up in the dec
> case for 'short' unsigned types. Clang is just clever enough to realize
> this and issues a warning.

Ahhh, that's the key to it. Thanks, Peter.

> Something like so might work:
>
> const int pao_ID__ = __builtin_constant_p(val) ?
> ((typeof(var))(val) == 1 ? 1 :
> ((typeof(var))(val) == (typeof(var))-1 ? -1 : 0 )) : 0;

Would anybody hate if we broke this up a bit, like:

const typeof(var) _val = val;
const int paoconst = __builtin_constant_p(val);
const int paoinc = paoconst && ((_val) == 1);
const int paodec = paoconst && ((_val) == (typeof(var))-1);

and then did

if (paoinc)
percpu_unary_op(size, qual, "inc", var);
...

Or even:

#define PAOINC 1234

const int pao_ID__ = __builtin_constant_p(val) ?
((typeof(var))(val) == 1 ? PAOINC :
...
if (PAOINC)
percpu_unary_op(size, qual, "inc", var);

Since the 1 and -1 ternary results end up just being magic numbers
anyway. Otherwise that pao_ID__ expression is pretty gnarly.