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

H. Peter Anvin
2023-01-10T02:10:47Z

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