On Mon, Aug 22, 2016 at 03:18:54PM -0400, Steven Rostedt wrote: > On Mon, 22 Aug 2016 20:56:09 +0200 > Peter Zijlstra <pet...@infradead.org> wrote: > > > > Don't we have __alignof__(void *) to avoid #ifdef CONFIG_M68K and > > > other new macros ?
Hmmm... Does __alignof__(void *) give two-byte alignment on m68k, allowing something like this? Heh!!! It is already there. ;-) struct callback_head { struct callback_head *next; void (*func)(struct callback_head *head); } __attribute__((aligned(sizeof(void *)))); #define rcu_head callback_head If so, that does sound quite attractive! Might need the WARN_ON() anyway, to flag wild pointers if nothing else. Adding Geert on CC for his thoughts. > > Yes, but that 'hides' the m68k funny, while doing an explicit #ifdef has > > documentation value... but I don't care too deeply. Well, if I need the WARN_ON() anyway, perhaps we get both. > I'd recommend keeping the #ifdef, and then if another architecture > comes along that is as weird as m68k, we can use the generic > __alignof__(void *). Maybe even add that in the comment, so when/if > that arch is created, people will know how to fix it more generically. Maybe __call_rcu() can do something like this? WARN_ON_ONCE((unsigned long)head & (__alignof__(struct rcu_head) - 1)); Except that RCU needs at least two-byte alignment, so something like this? WARN_ON_ONCE((unsigned long)head & ((__alignof__(struct rcu_head) - 1) | 0x1)); That way, some future architecture that doesn't believe in any alignment at all will be properly informed of RCU's needs in this area. Thanx, Paul