[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 1/5] xen/ppc: Implement atomic.h
On 12.09.2023 01:56, Shawn Anastasio wrote: > On 9/11/23 6:33 AM, Jan Beulich wrote: >> On 09.09.2023 00:50, Shawn Anastasio wrote: >>> +static always_inline void read_atomic_size(const volatile void *p, void >>> *res, >>> + unsigned int size) >>> +{ >>> + ASSERT(IS_ALIGNED((vaddr_t)p, size)); >>> + switch ( size ) >>> + { >>> + case 1: >>> + *(uint8_t *)res = read_u8_atomic(p); >>> + break; >>> + case 2: >>> + *(uint16_t *)res = read_u16_atomic(p); >>> + break; >>> + case 4: >>> + *(uint32_t *)res = read_u32_atomic(p); >>> + break; >>> + case 8: >>> + *(uint64_t *)res = read_u64_atomic(p); >>> + break; >>> + default: >>> + __bad_atomic_read(p, res); >>> + break; >>> + } >>> +} >>> + >>> +static always_inline void write_atomic_size(volatile void *p, const void >>> *val, >>> + unsigned int size) >>> +{ >>> + ASSERT(IS_ALIGNED((vaddr_t)p, size)); >>> + switch ( size ) >>> + { >>> + case 1: >>> + write_u8_atomic(p, *(const uint8_t *)val); >>> + break; >>> + case 2: >>> + write_u16_atomic(p, *(const uint16_t *)val); >>> + break; >>> + case 4: >>> + write_u32_atomic(p, *(const uint32_t *)val); >>> + break; >>> + case 8: >>> + write_u64_atomic(p, *(const uint64_t *)val); >>> + break; >>> + default: >>> + __bad_atomic_size(); >>> + break; >>> + } >>> +} >> >> These two functions being as similar as is possible, ... >> >>> +#define read_atomic(p) >>> \ >>> + ({ >>> \ >>> + union { >>> \ >>> + typeof(*(p)) val; >>> \ >>> + char c[sizeof(*(p))]; >>> \ >>> + } x_; >>> \ >>> + read_atomic_size(p, x_.c, sizeof(*(p))); >>> \ >>> + x_.val; >>> \ >>> + }) >> >> ... is there a reason you keep using a union here ... >> >>> +#define write_atomic(p, x) >>> \ >>> + do >>> \ >>> + { >>> \ >>> + typeof(*(p)) x_ = (x); >>> \ >>> + write_atomic_size(p, &x_, sizeof(*(p))); >>> \ >>> + } while ( 0 ) >> >> ... while you did away with its use here? >> > > Yes. In the case of read_atomic the caller is allowed (expected, even) > to pass in const pointers for `p`, which wouldn't work if a simple > typeof(*(p)) declaration was used since it would inherit the constness > and thus wouldn't be passable to read_atomic_size. But the helper function's first parameter is const volatile void *, and while you can't assign to a const variable, such a variable can of course have an initializer (like you have it in the write case). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |