On 02/15/2017 12:03 AM, Arnd Bergmann wrote:
> 
> -#define WRITE_ONCE(x, val) \
> -({                                                   \
> -     union { typeof(x) __val; char __c[1]; } __u =   \
> -             { .__val = (__force typeof(x)) (val) }; \
> -     __write_once_size(&(x), __u.__c, sizeof(x));    \
> -     __u.__val;                                      \
> -})
> +#define WRITE_ONCE(x, val)                                                   
>         \
> +(                                                                            
>         \
> +     __builtin_choose_expr(sizeof(x) == 1, *(volatile typeof(&(x)))&(x) = 
> (val),     \
> +     __builtin_choose_expr(sizeof(x) == 2, *(volatile typeof(&(x)))&(x) = 
> (val),     \
> +     __builtin_choose_expr(sizeof(x) == 4, *(volatile typeof(&(x)))&(x) = 
> (val),     \
> +     __builtin_choose_expr(sizeof(x) == sizeof(long), *(volatile 
> typeof(&(x)))&(x) = (val),  \

Have you run sparse on those changes?
IIRC we had to add the __force to get rid of address space annotations
in that macro above. Cannot tell if we need something like that here.

Reply via email to