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.