RE: [PATCH net-next 02/37] rxrpc: Use umin() and umax() rather than min_t()/max_t() where possible

From: David Laight
Date: Thu Dec 05 2024 - 06:02:38 EST


From: David Howells
> Sent: 05 December 2024 10:50
>
> David Laight <David.Laight@xxxxxxxxxx> wrote:
>
> > > Use umin() and umax() rather than min_t()/max_t() where the type specified
> > > is an unsigned type.
> >
> > You are also changing some max() to umax().
>
> Good point. If I have to respin my patches again, I'll update that.
>
> > Presumably they have always passed the type check so max() is fine.
> > And max(foo, 1) would have required that 'foo' be 'signed int' and could
> > potentially be negative when max(-1, 1) will be 1 but umax(-1, 1) is
> > undefined.
>
> There have been cases like this:
>
> unsigned long timeout;
> ...
> timeout = max(timeout, 1);
>
> where the macro would complain because it thought "timeout" and "1" were
> different sizes, so "1UL" had to be used. Using umax() deals with that issue.

The current version of max() won't complain if you use "1".
It uses statically_true((x) >= 0) to decide whether values are valid
for an unsigned compare.

So even:
int r = fn();
unsigned int u = fu();
if (r < 0)
return r;
return max(r, u);

is fine since modern compilers do limited domain tracking.

David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)