Messages in this thread | | | Date | Mon, 9 Jan 2023 18:09:05 -0800 | Subject | Re: [RFC][PATCH 11/12] slub: Replace cmpxchg_double() | From | "H. Peter Anvin" <> |
| |
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
| |