Fix alignment of custom sections made from structures
Subsystems (5)
Mathieu Desnoyers
reviewercover Fix alignment of custom sections made from structures
Hello,
Here is a patchset that fixes the Ftrace-induced crash experienced on sparc64 discussed in the following thread: https://lkml.org/lkml/2011/1/16/2
The third patch changes the Tracepoints to use the more compact alignment scheme proposed here, even though their alignment on 32-byte works fine. This third patch is therefore not a fix per se.
The patchset is based on 2.6.37. Hopefully there are not too many things to update for the current -git.
Comments, flames as well as acclamation are welcome. ;-)
Mathieu
Signature · 4 lines
Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com
Mathieu Desnoyers
reviewerPATCH 1/3 introduce __u64_packed_aligned, __u64_aligned and U64_ALIGN() for structure alignment in custom sections
Problem description:
gcc happily align on 32-byte structures defined statically. Ftrace trace events and Tracepoints both statically define structures into custom sections (using the "section" attribute), to then assign these to symbols with the linker scripts to iterate the these sections as an array.
However, gcc uses different alignments for these structures when they are defined statically than when they are globally visible and/or in an array. Therefore iteration on these arrays sees "holes" of padding. gcc is within its rights to increase the alignment of the statically defined structures because, normally, there should be no other accesses to them than in the local object. We are actually iterating on the generated structures as if they were an array without letting gcc knowing anything about it.
This patch introduces __u64_packed_aligned and __u64_aligned to force gcc to use the u64 type alignment, up-aligning or down-aligning the target type if necessary. The memory accesses to the target structure are efficient (does not require bytewise memory accesses) and the atomic pointer update guarantees required by RCU are kept. u64 is considered as the largest type that can generate a trap for unaligned accesses (u64 on sparc32 needs to be aligned on 64-bit).
Specifying both "packed" and "aligned" generates decent code (without the bytewise memory accesses generated by simply using "packed"), and forces gcc to down-align the structure alignment to the alignment of a u64 type. This down-alignment provided by "packed" guarantees that the structure alignment for the type declaration will match the alignment of the custom structure, and won't be larger than the alignment of the start of the custom section in the linker script.
This alignment should be used for both structure definitions and declarations (as *both* the type and variable attribute) when using the "section" attribute to generate arrays of structures. Declarations should use the __u64_packed_aligned macro. Definitions should use the __u64_aligned macro. We cannot have one single macro for both, because the use of __u64_packed_aligned with variable definitions causes "warning: ‘__packed__’ attribute ignored" messages. This is understandable because the "aligned" variable attribute enforces a strict alignment (compared to the "aligned" type attribute which only specifies a minimum alignment, hence requiring the "packed" attribute too). This is explained by the gcc Variable Attributes documentation: "When used as part of a typedef, the aligned attribute can both increase and decrease alignment, and specifying the packed attribute will generate a warning." The type attribute takes care of appropriately iterating on the extern array, therefore, no variable attribute needs to be applied to the extern array definition.
Also introduce the linker script U64_ALIGN() macro for specification of custom section alignment that matches that of __u64_packed_aligned and __u64_aligned.
--- include/asm-generic/vmlinux.lds.h | 6 +++ include/linux/align-section.h | 62 ++++++++++++++++++++++++++++++++++++++ include/linux/compiler.h | 14 ++++++++ 3 files changed, 82 insertions(+)
include/linux/compiler.h +14 -0
@@ -57,6 +57,20 @@ extern void __chk_io_ptr(const volatile# include <linux/compiler-intel.h> #endif +#include <linux/align-section.h> + +/* +* Use as variable attribute for custom section structure definition. +* It should also be applied to any static or extern definition of the +* structure that would override the definition to which the "section" +* attribute is applied, e.g. +* +* extern struct __u64_aligned custom; +* struct custom __u64_aligned __attribute__((section("__custom")) identifier; +*/ +#define __u64_aligned \ + __attribute__((__aligned__(__alignof__(long long)))) +/* * Generic compiler-dependent macros required for kernel * build go below this comment. Actual compiler/compiler version
include/asm-generic/vmlinux.lds.h +6 -0
@@ -69,6 +69,12 @@*/ #define STRUCT_ALIGN () . = ALIGN(32) +/* +* Align to a 8 byte boundary. For use with custom section made from structures +* declared with __u64_packed_aligned and defined with __u64_aligned. +*/ +#define U64_ALIGN () . = ALIGN(8) +/* The actual configuration determine if the init/exit sections * are handled as text/data or they can be discarded (which * often happens at runtime)
include/linux/align-section.h new file +62 -0
62 lines not on this page · raw message
Mathieu Desnoyers
reviewerRe: [patch 1/3] introduce __u64_packed_aligned, __u64_aligned and U64_ALIGN() for structure alignment in custom sections
Quoted 2 lines · * Mathieu Desnoyers ([email protected]) wrote:
Problem description:
Argh, Nack-for-myself for the whole patchset. A missing quilt refresh messed up my patches. Sorry about that, will repost shortly.
Mathieu
Quoted 168 lines
gcc happily align on 32-byte structures defined statically. Ftrace trace events and Tracepoints both statically define structures into custom sections (using the "section" attribute), to then assign these to symbols with the linker scripts to iterate the these sections as an array.
However, gcc uses different alignments for these structures when they are defined statically than when they are globally visible and/or in an array. Therefore iteration on these arrays sees "holes" of padding. gcc is within its rights to increase the alignment of the statically defined structures because, normally, there should be no other accesses to them than in the local object. We are actually iterating on the generated structures as if they were an array without letting gcc knowing anything about it.
This patch introduces
__u64_packed_alignedand__u64_alignedto force gcc to use the u64 type alignment, up-aligning or down-aligning the target type if necessary. The memory accesses to the target structure are efficient (does not require bytewise memory accesses) and the atomic pointer update guarantees required by RCU are kept. u64 is considered as the largest type that can generate a trap for unaligned accesses (u64 on sparc32 needs to be aligned on 64-bit).Specifying both "packed" and "aligned" generates decent code (without the bytewise memory accesses generated by simply using "packed"), and forces gcc to down-align the structure alignment to the alignment of a u64 type. This down-alignment provided by "packed" guarantees that the structure alignment for the type declaration will match the alignment of the custom structure, and won't be larger than the alignment of the start of the custom section in the linker script.
This alignment should be used for both structure definitions and declarations (as *both* the type and variable attribute) when using the "section" attribute to generate arrays of structures. Declarations should use the
__u64_packed_alignedmacro. Definitions should use the__u64_alignedmacro. We cannot have one single macro for both, because the use of__u64_packed_alignedwith variable definitions causes "warning: ‘__packed__’ attribute ignored" messages. This is understandable because the "aligned" variable attribute enforces a strict alignment (compared to the "aligned" type attribute which only specifies a minimum alignment, hence requiring the "packed" attribute too). This is explained by the gcc Variable Attributes documentation: "When used as part of a typedef, the aligned attribute can both increase and decrease alignment, and specifying the packed attribute will generate a warning." The type attribute takes care of appropriately iterating on the extern array, therefore, no variable attribute needs to be applied to the extern array definition.Also introduce the linker script
U64_ALIGN()macro for specification of custom section alignment that matches that of__u64_packed_alignedand__u64_aligned.Signed-off-by Mathieu Desnoyers <[email protected]>CC David Miller <[email protected]>CC Steven Rostedt <[email protected]>CC Frederic Weisbecker <[email protected]>CC Ingo Molnar <[email protected]>--- include/asm-generic/vmlinux.lds.h | 6 +++ include/linux/align-section.h | 62 ++++++++++++++++++++++++++++++++++++++ include/linux/compiler.h | 14 ++++++++ 3 files changed, 82 insertions(+)Index:
linux-2.6-lttng/include/linux/compiler.h
===================================================================include/linux/compiler.h +14
-0@@ -57,6 +57,20 @@ extern void __chk_io_ptr(const volatile# include <linux/compiler-intel.h> #endif +#include <linux/align-section.h> + +/* +* Use as variable attribute for custom section structure definition. +* It should also be applied to any static or extern definition of the +* structure that would override the definition to which the "section" +* attribute is applied, e.g. +* +* extern struct __u64_aligned custom; +* struct custom __u64_aligned __attribute__((section("__custom")) identifier; +*/ +#define __u64_aligned \ + __attribute__((__aligned__(__alignof__(long long)))) +/* * Generic compiler-dependent macros required for kernel * build go below this comment. Actual compiler/compiler version Index:
linux-2.6-lttng/include/asm-generic/vmlinux.lds.h
===================================================================include/asm-generic/vmlinux.lds.h +6
-0@@ -69,6 +69,12 @@*/ #define STRUCT_ALIGN () . = ALIGN(32) +/* +* Align to a 8 byte boundary. For use with custom section made from structures +* declared with __u64_packed_aligned and defined with __u64_aligned. +*/ +#define U64_ALIGN () . = ALIGN(8) +/* The actual configuration determine if the init/exit sections * are handled as text/data or they can be discarded (which * often happens at runtime) Index:
linux-2.6-lttng/include/linux/align-section.h
===================================================================include/linux/align-section.h new file +62
-0@@ -0,0 +1,62 @@ +#ifndef _LINUX_ALIGN_SECTION_H +#define _LINUX_ALIGN_SECTION_H + +/* +* __u64_packed_aligned and __u64_aligned: +* +* __u64_aligned should be used as type attribute for structure definitions, and +* __u64_packed_aligned as type attribute for structure declaration when using +* the "section" attribute to generate arrays of structures. U64_ALIGN() must be +* used prior to these section definitions in the linker script. +* +* It forces the compiler to use the u64 type alignment, up-aligning or +* down-aligning the target type if necessary. The memory accesses to the target +* structure are efficient (does not require bytewise memory accesses) and the +* atomic pointer update guarantees required by RCU are kept. u64 is considered +* as the largest type that can generate a trap for unaligned accesses (u64 on +* sparc32 needs to be aligned on 64-bit). +* +* Specifying both "packed" and "aligned" generates decent code (without the +* bytewise memory accesses generated by simply using "packed"), and forces +* gcc to down-align the structure alignment to the alignment of a u64 type. +*/ + +/* +* Use __u64_packed_aligned as type attribute for custom section structure +* declaration, e.g. +* +* struct custom { +* unsigned long field; +* ... +* } __u64_packed_aligned; +* +* The array can then be defined with: +* +* extern struct custom __start___custom[]; +* extern struct custom __stop___custom[]; +* +* With linking performed by the linker script: +* +* U64_ALIGN(); +* VMLINUX_SYMBOL(__start___custom) = .; +* *(__custom) +* VMLINUX_SYMBOL(__stop___custom) = .; +*/ + +#define __u64_packed_aligned \ + __attribute__((__packed__, __aligned__(__alignof__(long long)))) + +/* +* Use __u64_aligned as variable attribute for custom section structure +* definition. It should also be applied to any static or extern definition of +* the structure that would override the definition to which the "section" +* attribute is applied, e.g. +* +* extern struct __u64_aligned custom; +* struct custom __u64_aligned __attribute__((section("__custom")) identifier; +*/ + +#define __u64_aligned \ + __attribute__((__aligned__(__alignof__(long long)))) + +#endif /* _LINUX_ALIGN_SECTION_H */
Signature · 4 lines
Mathieu Desnoyers Operating System Efficiency R&D Consultant EfficiOS Inc. http://www.efficios.com
Mathieu Desnoyers
reviewerPATCH 2/3 tracing: use __u64_packed_aligned as type and variable attribute
In reply to Mathieu DesnoyersProblem description:
gcc happily align structures defined statically on 32-byte. Ftrace trace events and Tracepoints both statically define structures into sections (using the "section" attribute), to then assign these to symbols with the linker scripts to iterate the these sections as an array.
However, gcc uses different alignments for these structures when they are defined statically and when they are globally visible and/or in an array. Therefore iteration on these arrays sees "holes" of padding.
Use the __u64_packed_aligned for type declarations and __u64_aligned for variable definitions to ensure that gcc
a) iterates on the correctly aligned type. (type attribute)
b) generates the definitions within the sections with the appropriate alignment. (variable attribute)
The Ftrace code introduced the "aligned(4)" variable attribute in commit 1473e4417c79f12d91ef91a469699bfa911f510f to try to work around this problem that showed up on x86_64, but it causes unaligned accesses on sparc64, and is generally a bad idea on 64-bit if RCU pointers are contained within the structure. Moreover, it did not use the same attribute as type attribute, which could cause the iteration on the extern array structure not to match the variable definitions for some structure sizes.
Fix this by using __u64_packed_aligned as both type and variable attribute.
We should also ensure proper alignment of each Ftrace section in include/asm-generic/vmlinux.lds.h.
Moving all STRUCT_ALIGN() for FTRACE_EVENTS() and TRACE_SYSCALLS() into the definitions, so the alignment is only done if these infrastructures are configured in. Use U64_ALIGN instead of STRUCT_ALIGN.
Also align TRACE_PRINTKS on 64_ALIGN to make sure the beginning of the section is aligned on pointer size.
--- include/asm-generic/vmlinux.lds.h | 19 ++++++++++--------- include/linux/compiler.h | 6 +++--- include/linux/ftrace_event.h | 2 +- include/linux/syscalls.h | 18 ++++++++---------- include/trace/ftrace.h | 8 ++++---- include/trace/syscall.h | 2 +- kernel/trace/trace.h | 2 +- kernel/trace/trace_export.c | 2 +- 8 files changed, 29 insertions(+), 30 deletions(-)
include/linux/compiler.h +3 -3
@@ -92,7 +92,7 @@ struct ftrace_branch_data { };unsigned long miss_hit[2 ]; }; -}; +} __u64_packed_aligned;/* * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
@@ -108,7 +108,7 @@ void ftrace_likely_update(struct ftrace_#define __branch_check__ (x, expect) ({ \ int ______r; \ static struct ftrace_branch_data \ - __attribute__((__aligned__(4))) \ + __u64_aligned \ __attribute__((section("_ftrace_annotated_branch"))) \ ______f = { \ .func = __func__, \
@@ -143,7 +143,7 @@ void ftrace_likely_update(struct ftrace_ ({ \ int ______r; \ static struct ftrace_branch_data \ - __attribute__((__aligned__(4))) \ + __u64_aligned \ __attribute__((section("_ftrace_branch"))) \ ______f = { \ .func = __func__, \
include/linux/syscalls.h +8 -10
@@ -126,12 +126,11 @@ extern struct trace_event_functions exit#define SYSCALL_TRACE_ENTER_EVENT (sname) \ static struct syscall_metadata \ - __attribute__((__aligned__(4))) __syscall_meta_##sname; \ + __u64_aligned __syscall_meta_##sname; \ static struct ftrace_event_call \ - __attribute__((__aligned__(4))) event_enter_##sname; \ + __u64_aligned event_enter_##sname; \ static struct ftrace_event_call __used \ - __attribute__((__aligned__(4))) \ - __attribute__((section("_ftrace_events"))) \ + __u64_aligned __attribute__((section("_ftrace_events"))) \ event_enter_##sname = { \ .name = "sys_enter"#sname, \ .class = &event_class_syscall_enter, \
@@ -141,12 +140,11 @@ extern struct trace_event_functions exit#define SYSCALL_TRACE_EXIT_EVENT (sname) \ static struct syscall_metadata \ - __attribute__((__aligned__(4))) __syscall_meta_##sname; \ + __u64_aligned __syscall_meta_##sname; \ static struct ftrace_event_call \ - __attribute__((__aligned__(4))) event_exit_##sname; \ + __u64_aligned event_exit_##sname; \ static struct ftrace_event_call __used \ - __attribute__((__aligned__(4))) \ - __attribute__((section("_ftrace_events"))) \ + __u64_aligned __attribute__((section("_ftrace_events"))) \ event_exit_##sname = { \ .name = "sys_exit"#sname, \ .class = &event_class_syscall_exit, \
@@ -158,7 +156,7 @@ extern struct trace_event_functions exitSYSCALL_TRACE_ENTER_EVENT (sname); \SYSCALL_TRACE_EXIT_EVENT (sname); \ static struct syscall_metadata __used \ - __attribute__((__aligned__(4))) \ + __u64_aligned \ __attribute__((section("__syscalls_metadata"))) \ __syscall_meta_##sname = { \ .name = "sys"#sname, \
@@ -174,7 +172,7 @@ extern struct trace_event_functions exit SYSCALL_TRACE_ENTER_EVENT(_##sname); \ SYSCALL_TRACE_EXIT_EVENT(_##sname); \ static struct syscall_metadata __used \ - __attribute__((__aligned__(4))) \ + __u64_aligned \ __attribute__((section("__syscalls_metadata"))) \ __syscall_meta__##sname = { \ .name = "sys_"#sname, \
include/trace/ftrace.h +4 -4
@@ -79,7 +79,7 @@#undef DEFINE_EVENT#define DEFINE_EVENT (template, name, proto, args) \ static struct ftrace_event_call __used \ - __attribute__((__aligned__(4))) event_##name; + __u64_aligned event_##name;#undef DEFINE_EVENT_PRINT#define DEFINE_EVENT_PRINT (template, name, proto, args, print) \
@@ -447,7 +447,7 @@ static inline notrace int ftrace_get_off* }; * * static struct ftrace_event_call __used -* __attribute__((__aligned__(4))) +* __u64_aligned * __attribute__((section("_ftrace_events"))) event_<call> = { * .name = "<call>", * .class = event_class_<template>,
@@ -581,7 +581,7 @@ static struct ftrace_event_class __used#define DEFINE_EVENT (template, call, proto, args) \ \ static struct ftrace_event_call __used \ -__attribute__((__aligned__(4))) \ +__u64_aligned \ __attribute__((section("_ftrace_events"))) event_##call = { \ .name = #call, \ .class = &event_class_##template, \
@@ -595,7 +595,7 @@ __attribute__((section("_ftrace_events") static const char print_fmt_##call[] = print; \ \ static struct ftrace_event_call __used \ -__attribute__((__aligned__(4))) \ +__u64_aligned \ __attribute__((section("_ftrace_events"))) event_##call = { \ .name = #call, \ .class = &event_class_##template, \
kernel/trace/trace.h +1 -1
@@ -749,7 +749,7 @@ extern const char *__stop___trace_bprint#undef FTRACE_ENTRY#define FTRACE_ENTRY (call, struct_name, id, tstruct, print) \ extern struct ftrace_event_call \ - __attribute__((__aligned__(4))) event_##call; + __u64_aligned event_##call;#undef FTRACE_ENTRY_DUP#define FTRACE_ENTRY_DUP (call, struct_name, id, tstruct, print) \ FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print))
kernel/trace/trace_export.c +1 -1
@@ -156,7 +156,7 @@ struct ftrace_event_class event_class_ft }; \ \ struct ftrace_event_call __used \ -__attribute__((__aligned__(4))) \ +__u64_aligned \ __attribute__((section("_ftrace_events"))) event_##call = { \ .name = #call, \ .event.type = etype, \
include/linux/ftrace_event.h +1 -1
@@ -194,7 +194,7 @@ struct ftrace_event_call {int perf_refcount;struct hlist_head __percpu *perf_events;#endif -}; +} __u64_packed_aligned;#define PERF_MAX_TRACE_SIZE 2048
include/trace/syscall.h +1 -1
@@ -29,7 +29,7 @@ struct syscall_metadata {struct ftrace_event_call *enter_event;struct ftrace_event_call *exit_event; -}; +} __u64_packed_aligned;#ifdef CONFIG_FTRACE_SYSCALLS extern unsigned long arch_syscall_addr (int nr);
include/asm-generic/vmlinux.lds.h +10 -9
@@ -113,7 +113,8 @@#endif #ifdef CONFIG_TRACE_BRANCH_PROFILING -#define LIKELY_PROFILE () VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \ +#define LIKELY_PROFILE () U64_ALIGN(); \ + VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \ *(_ftrace_annotated_branch) \ VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .;#else
@@ -121,7 +122,8 @@#endif #ifdef CONFIG_PROFILE_ALL_BRANCHES -#define BRANCH_PROFILE () VMLINUX_SYMBOL(__start_branch_profile) = .; \ +#define BRANCH_PROFILE () U64_ALIGN(); \ + VMLINUX_SYMBOL(__start_branch_profile) = .; \ *(_ftrace_branch) \ VMLINUX_SYMBOL(__stop_branch_profile) = .;#else
@@ -129,7 +131,8 @@#endif #ifdef CONFIG_EVENT_TRACING -#define FTRACE_EVENTS () VMLINUX_SYMBOL(__start_ftrace_events) = .; \ +#define FTRACE_EVENTS () U64_ALIGN(); \ + VMLINUX_SYMBOL(__start_ftrace_events) = .; \ *(_ftrace_events) \ VMLINUX_SYMBOL(__stop_ftrace_events) = .;#else
@@ -137,7 +140,8 @@#endif #ifdef CONFIG_TRACING -#define TRACE_PRINTKS () VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \ +#define TRACE_PRINTKS () U64_ALIGN(); \ + VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \ *(__trace_printk_fmt)/* Trace_printk fmt' pointer */ \ VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .;#else
@@ -145,7 +149,8 @@#endif #ifdef CONFIG_FTRACE_SYSCALLS -#define TRACE_SYSCALLS () VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \ +#define TRACE_SYSCALLS () U64_ALIGN(); \ + VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \ *(__syscalls_metadata) \ VMLINUX_SYMBOL(__stop_syscalls_metadata) = .;#else
@@ -175,11 +180,7 @@ LIKELY_PROFILE() \ BRANCH_PROFILE() \ TRACE_PRINTKS() \ - \ -STRUCT_ALIGN (); \ FTRACE_EVENTS() \ - \ -STRUCT_ALIGN (); \TRACE_SYSCALLS ()/*
Mathieu Desnoyers
reviewerPATCH 3/3 tracepoints: use __u64_packed_aligned() as type and variable attribute
In reply to Mathieu Desnoyerscommit 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.
Working on issues within Ftrace, we came up with __64_packed_aligned, which deals with this issue more elegantly by forcing an 8-byte alignment to both the type declaration and variable definition.
This therefore saves space, bringing down the size of struct tracepoint from 64 bytes to 38 on 64-bit architectures.
Updating:
- The type attribute (for iteration over the struct tracepoint array)
- Added the variable attribute to the extern definition (needed to force gcc to consider this alignment for the following definition)
- The definition variable attribute (to force gcc to this specific alignment for the static definitions)
- The linker script (8-byte alignment can now replace the previous 32-byte alignment for the custom tracepoint section)
--- include/asm-generic/vmlinux.lds.h | 2 +- include/linux/tracepoint.h | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-)
include/asm-generic/vmlinux.lds.h +1 -1
@@ -168,7 +168,7 @@ CPU_KEEP(exit.data) \ MEM_KEEP(init.data) \ MEM_KEEP(exit.data) \ - . = ALIGN(32); \ +U64_ALIGN (); \ VMLINUX_SYMBOL(__start___tracepoints) = .; \ *(__tracepoints ) \ VMLINUX_SYMBOL(__stop___tracepoints) = .; \
include/linux/tracepoint.h +4 -8
@@ -33,12 +33,7 @@ struct tracepoint {void (*regfunc)(void );void (*unregfunc)(void );struct tracepoint_func *funcs; -} __attribute__((aligned(32))); /* -* Aligned on 32 bytes because it is -* globally visible and gcc happily -* align these on the structure size. -* Keep in sync with vmlinux.lds.h. -*/ +} __u64_packed_aligned;/* * Connect a probe to a tracepoint.
@@ -143,7 +138,7 @@ static inline void tracepoint_update_pro* structure. Force alignment to the same alignment as the section start. */ #define __DECLARE_TRACE (name, proto, args, data_proto, data_args) \ - extern struct tracepoint __tracepoint_##name; \ + extern struct tracepoint __u64_aligned __tracepoint_##name; \ static inline void trace_##name(proto) \ { \ JUMP_LABEL(&__tracepoint_##name.state, do_trace); \
@@ -174,7 +169,8 @@ do_trace: \ static const char __tpstrtab_##name[] \ __attribute__((section("__tracepoints_strings"))) = #name; \ struct tracepoint __tracepoint_##name \ - __attribute__((section("__tracepoints"), aligned(32))) = \ + __u64_aligned \ + __attribute__((section("__tracepoints"))) = \ { __tpstrtab_##name, 0, reg, unreg, NULL };#define DEFINE_TRACE (name) \