Re: [RFC][PATCH 11/12] slub: Replace cmpxchg_double()

From: H. Peter Anvin
Date: Mon Jan 09 2023 - 21:11:14 EST


On 1/9/23 14:22, H. Peter Anvin wrote:

Another alternative is to try to avoid casting to "u64" as long as
humanly possible, and use only "typeof((*ptr))" everywhere. Then when
the type actually *is* 128-bit, it all works out fine, because it
won't be a pointer. That's the approach the uaccess macros tend to
take, and then they hit the reverse issue on clang, where using the
"byte register" constraints would cause warnings for non-byte
accesses, and we had to do

unsigned char x_u8__;
__get_user_asm(x_u8__, ptr, "b", "=q", label);
(x) = x_u8__;

because using '(x)' directly would then warn when 'x' wasn't a
char-sized thing - even if that asm case never actually was _used_ for
that case, since it was all inside a "switch (sizeof) case 1:"
statement.

Linus


I wrote a crazy macro for dealing with exactly this at one point,
basically producing the "right type" to cast to. It would need to
have 128-bit support added to it, but that should be trivial. It is
called something like int_type() ... not in front of a computer right
now so can't double check.
Right, it is called __inttype and is defined in arch/x86/include/asm/uaccess.h (and, apparently, a few other architectures; probably should be centralized.)

It has been rewritten since my first version using a nice little macro called __typefits, also would we worth centralizing.

-hpa