From: Mathieu Desnoyers Fix the alignment of the struct marker declaration in the trace_mark() macro. Otherwise, we run into problems on 64 bits architectures where the struct marker structure is bigger than 32 bytes : gcc becomes alignment-happy and align these structures on 32 bytes while the iteration on the markers is itself only aligned on 8 bytes, as specified by the type attribute. Specifying the alignmentof the type only is not enough to restrain gcc happiness; we must specify a variable alignment attribute too. This bug causes NULL pointer dereference at module load time on x86_64 when we load marker-example.ko. Thanks to Mike Mason for reporting this. It applies to 2.6.23-rc8-mm2, after the linux kernel markers coding style fixes. This is an important bugfix that should be merged with the markers. Signed-off-by: Mathieu Desnoyers Cc: Christoph Hellwig Cc: Mike Mason Cc: "Frank Ch. Eigler" Signed-off-by: Andrew Morton --- diff -puN include/linux/marker.h~linux-kernel-markers-alignment-fix include/linux/marker.h --- a/include/linux/marker.h~linux-kernel-markers-alignment-fix +++ a/include/linux/marker.h @@ -58,7 +58,7 @@ struct marker { __attribute__((section("__markers_strings"))) \ = format; \ static struct marker __mark_##name \ - __attribute__((section("__markers"))) = \ + __attribute__((section("__markers"), aligned(8))) = \ { __mstrtab_name_##name, __mstrtab_format_##name, \ 0, __mark_empty_function, NULL }; \ asm volatile("" : : "i" (&__mark_##name)); \ _