Re: [PATCH 12/35] workqueue: update cwq alignement

From: Frederic Weisbecker
Date: Tue Jun 29 2010 - 08:36:34 EST


On Tue, Jun 29, 2010 at 09:39:41AM +0200, Tejun Heo wrote:
> Hello,
>
> On 06/29/2010 12:47 AM, Frederic Weisbecker wrote:
> >> void __init init_workqueues(void)
> >> {
> >> + /*
> >> + * cwqs are forced aligned according to WORK_STRUCT_FLAG_BITS.
> >> + * Make sure that the alignment isn't lower than that of
> >> + * unsigned long long.
> >> + */
> >> + BUILD_BUG_ON(__alignof__(struct cpu_workqueue_struct) <
> >> + __alignof__(unsigned long long));
> >> +
> >
> > But they are not allocated contiguously as we use the per cpu offsets.
> > So why does the struct itself need to be aligned? Only the base pointer
> > of its dynamic allocation needs to be aligned. Or am I missing something?
>
> work->data doesn't store the percpu pointer but the address of cwq of
> that specific cpu as returned by per_cpu_ptr(), so each element needs
> to be aligned. Besides, if the percpu ptr is aligned the elements are
> aligned so they aren't different things.



But then, if each cpu pointers are aligned, the struct itself doesn't need
to be aligned in its size right? It would need to if multiple elements
were allocated per cpu but for this struct we only have one per cpu. So
what seems to matter wrt alignment is only the base pointer of these structs,
not the size.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/