Messages in this thread |  | | | Date | Wed, 2 Feb 2011 13:29:45 -0500 | | From | Mathieu Desnoyers <> | | Subject | Re: [RFC PATCH] Tracepoints: fix section alignment using pointer array |
| |
* Rusty Russell (rusty@rustcorp.com.au) wrote: > On Thu, 27 Jan 2011 08:56:22 am Mathieu Desnoyers wrote: > > Make the tracepoints more robust, making them solid enough to handle compiler > > changes by not relying on anything based on compiler-specific behavior with > > respect to structure alignment. Implement an approach proposed by David Miller: > > use an array of const pointers to refer to the individual structures, and export > > this pointer array through the linker script rather than the structures per se. > > It will consume 32 extra bytes per tracepoint (24 for structure padding and 8 > > for the pointers), but are less likely to break due to compiler changes. > > > > History: > > > > commit 7e066fb870fcd1025ec3ba7bbde5d541094f4ce1 added the aligned(32) type and > > variable attribute to the tracepoint structures to deal with gcc happily > > aligning statically defined structures on 32-byte multiples. > > > > commit 15e3540ce2159705f18fad6147ffedf04445ad64 tried to use a 8-byte alignment > > for tracepoint structures by applying both the variable and type attribute to > > tracepoint structures definitions and declarations. It worked fine with gcc > > 4.5.1, but broke with gcc 4.4.4 and 4.4.5. > > > > The reason is that the "aligned" attribute only specify the _minimum_ alignment > > for a structure, leaving both the compiler and the linker free to align on > > larger multiples. Because tracepoint.c expects the structures to be placed as an > > array within each section, up-alignment cause NULL-pointer exceptions due to the > > extra unexpected padding. > > Hmm, that assumption is used in module parameters too, so we already rely on > the toolchain not to over-pad. > > Perhaps we should fix that too, or wait until it explodes?
Hrm, yeah, struct kernel_param seems to fit into the same category. I'd recommend to fix it too. On 64-bit, this structure size is 28 bytes, but its alignment is specified by:
__attribute__ ((unused,__section__ ("__param"),aligned(sizeof(void *)))) So AFAIU, if you declare __param sections in multiple different objects, that you later link together to generate a module (or the kernel core), you might end up with a whole caused by the realignment on 32-byte done by the linker.
In the past, tracepoints were 8-byte aligned, and I had to bump their structure to a 32-byte alignment because of compiler behavior changes. I would personally prefer not to wait for other things to break before introducing this fix for struct kernel_param too.
Thanks,
Mathieu
-- Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com
|  |