|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 1/5] xen/ppc: Implement atomic.h
On 9/11/23 6:33 AM, Jan Beulich wrote:
> On 09.09.2023 00:50, Shawn Anastasio wrote:
>> Implement atomic.h for PPC, based off of the original Xen 3.2
>> implementation. This implementation depends on some functions that are
>> not yet defined (notably __cmpxchg), so it can't yet be used.
>>
>> Signed-off-by: Shawn Anastasio <sanastasio@xxxxxxxxxxxxxxxxxxxxx>
>
> Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
>
Thanks.
> Just one remaining question:
>
>> +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.
In the case of write_atomic though, there is no need to support const
`p`, so no union is necessary.
> Jan
Thanks,
Shawn
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |