From: Mathieu Desnoyers Date: Thu, 1 Mar 2012 22:23:47 +0000 (-0500) Subject: Merge branch 'master' into dev X-Git-Tag: v2.1.0-rc1~97^2~3 X-Git-Url: http://git.liburcu.org/?a=commitdiff_plain;h=2253b139ffb6a4eca7291b60083cc5206a6e128d;hp=a025b017d398818300ad45c92284116d64c56fc1;p=lttng-ust.git Merge branch 'master' into dev Conflicts: liblttng-ust/ltt-events.c liblttng-ust/lttng-context-vtid.c liblttng-ust/lttng-ust-comm.c libringbuffer/ring_buffer_frontend.c Signed-off-by: Mathieu Desnoyers --- diff --git a/.gitignore b/.gitignore index 4239f2e6..076cd007 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ autom4te.cache/ /include/lttng/config.h /include/lttng/stamp-h2 /include/lttng/ust-version.h +/include/lttng/ust-config.h /config.h.in config/ config.log diff --git a/include/lttng/ringbuffer-config.h b/include/lttng/ringbuffer-config.h index 728738cd..5273f321 100644 --- a/include/lttng/ringbuffer-config.h +++ b/include/lttng/ringbuffer-config.h @@ -24,6 +24,7 @@ #include #include #include +#include #include "lttng/align.h" struct lttng_ust_lib_ring_buffer; @@ -122,6 +123,7 @@ struct lttng_ust_lib_ring_buffer_client_cb { * RING_BUFFER_WAKEUP_NONE does not perform any wakeup whatsoever. The client * has the responsibility to perform wakeups. */ +#define LTTNG_UST_RING_BUFFER_CONFIG_PADDING 32 struct lttng_ust_lib_ring_buffer_config { enum { RING_BUFFER_ALLOC_PER_CPU, @@ -175,6 +177,7 @@ struct lttng_ust_lib_ring_buffer_config { * callbacks and update the cb pointers. */ int client_type; + char padding[LTTNG_UST_RING_BUFFER_CONFIG_PADDING]; }; /* @@ -184,6 +187,7 @@ struct lttng_ust_lib_ring_buffer_config { * lib_ring_buffer_try_discard_reserve(), lib_ring_buffer_align_ctx() and * lib_ring_buffer_write(). */ +#define LTTNG_UST_RING_BUFFER_CTX_PADDING 24 struct lttng_ust_lib_ring_buffer_ctx { /* input received by lib_ring_buffer_reserve(), saved here. */ struct channel *chan; /* channel */ @@ -211,6 +215,7 @@ struct lttng_ust_lib_ring_buffer_ctx { */ uint64_t tsc; /* time-stamp counter value */ unsigned int rflags; /* reservation flags */ + char padding[LTTNG_UST_RING_BUFFER_CTX_PADDING]; }; /** @@ -235,6 +240,7 @@ void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, ctx->cpu = cpu; ctx->rflags = 0; ctx->handle = handle; + memset(ctx->padding, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING); } /* diff --git a/include/lttng/tracepoint-types.h b/include/lttng/tracepoint-types.h index 37a7662b..9b104b07 100644 --- a/include/lttng/tracepoint-types.h +++ b/include/lttng/tracepoint-types.h @@ -19,11 +19,14 @@ struct tracepoint_probe { void *data; }; +#define TRACEPOINT_PADDING 16 struct tracepoint { const char *name; int state; struct tracepoint_probe *probes; int *tracepoint_provider_ref; + const char *signature; + char padding[TRACEPOINT_PADDING]; }; #endif /* _LTTNG_TRACEPOINT_TYPES_H */ diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 5fda51f4..b1c2d360 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -149,7 +149,8 @@ end: \ static inline void __tracepoint_register_##_provider##___##_name(char *name, \ void *func, void *data) \ { \ - __tracepoint_probe_register(name, func, data); \ + __tracepoint_probe_register(name, func, data, \ + __tracepoint_##_provider##___##_name.signature); \ } \ static inline void __tracepoint_unregister_##_provider##___##_name(char *name, \ void *func, void *data) \ @@ -157,7 +158,8 @@ static inline void __tracepoint_unregister_##_provider##___##_name(char *name, __tracepoint_probe_unregister(name, func, data); \ } -extern int __tracepoint_probe_register(const char *name, void *func, void *data); +extern int __tracepoint_probe_register(const char *name, void *func, void *data, + const char *signature); extern int __tracepoint_probe_unregister(const char *name, void *func, void *data); /* @@ -191,10 +193,9 @@ extern struct tracepoint_dlopen tracepoint_dlopen; * object from the executable. */ #ifdef TRACEPOINT_PROBE_DYNAMIC_LINKAGE -#define _TRACEPOINT_UNDEFINED_REF(provider) +#define _TRACEPOINT_UNDEFINED_REF(provider) NULL #else /* TRACEPOINT_PROBE_DYNAMIC_LINKAGE */ -#define _TRACEPOINT_UNDEFINED_REF(provider) \ - &__tracepoint_provider_##provider, +#define _TRACEPOINT_UNDEFINED_REF(provider) &__tracepoint_provider_##provider #endif /* TRACEPOINT_PROBE_DYNAMIC_LINKAGE */ /* @@ -202,17 +203,25 @@ extern struct tracepoint_dlopen tracepoint_dlopen; * in the __tracepoints_ptrs section. * Therefore, this section is _not_ const (read-only). */ -#define _DEFINE_TRACEPOINT(provider, name) \ - extern int __tracepoint_provider_##provider; \ - static const char __tp_strtab_##provider##___##name[] \ +#define _TP_EXTRACT_STRING(...) #__VA_ARGS__ + +#define _DEFINE_TRACEPOINT(_provider, _name, _args) \ + extern int __tracepoint_provider_##_provider; \ + static const char __tp_strtab_##_provider##___##_name[] \ __attribute__((section("__tracepoints_strings"))) = \ - #provider ":" #name; \ - struct tracepoint __tracepoint_##provider##___##name \ + #_provider ":" #_name; \ + struct tracepoint __tracepoint_##_provider##___##_name \ __attribute__((section("__tracepoints"))) = \ - { __tp_strtab_##provider##___##name, 0, NULL, _TRACEPOINT_UNDEFINED_REF(provider) }; \ - static struct tracepoint * __tracepoint_ptr_##provider##___##name \ + { \ + __tp_strtab_##_provider##___##_name, \ + 0, \ + NULL, \ + _TRACEPOINT_UNDEFINED_REF(_provider), \ + _TP_EXTRACT_STRING(_args), \ + }; \ + static struct tracepoint * __tracepoint_ptr_##_provider##___##_name \ __attribute__((used, section("__tracepoints_ptrs"))) = \ - &__tracepoint_##provider##___##name; + &__tracepoint_##_provider##___##_name; /* * These weak symbols, the constructor, and destructor take care of @@ -281,7 +290,7 @@ static void __attribute__((destructor)) __tracepoints__destroy(void) #else /* TRACEPOINT_DEFINE */ -#define _DEFINE_TRACEPOINT(provider, name) +#define _DEFINE_TRACEPOINT(_provider, _name, _args) #endif /* #else TRACEPOINT_DEFINE */ @@ -376,13 +385,13 @@ static void __attribute__((destructor)) __tracepoints__destroy(void) #define TRACEPOINT_EVENT(provider, name, args, fields) \ _DECLARE_TRACEPOINT(provider, name, _TP_PARAMS(args)) \ - _DEFINE_TRACEPOINT(provider, name) + _DEFINE_TRACEPOINT(provider, name, _TP_PARAMS(args)) #define TRACEPOINT_EVENT_CLASS(provider, name, args, fields) #define TRACEPOINT_EVENT_INSTANCE(provider, _template, name, args) \ _DECLARE_TRACEPOINT(provider, name, _TP_PARAMS(args)) \ - _DEFINE_TRACEPOINT(provider, name) + _DEFINE_TRACEPOINT(provider, name, _TP_PARAMS(args)) #endif /* #ifndef TRACEPOINT_EVENT */ diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index 96435c48..f1ef8c91 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -32,6 +32,11 @@ struct ltt_channel; struct ltt_session; struct lttng_ust_lib_ring_buffer_ctx; +/* + * Data structures used by tracepoint event declarations, and by the + * tracer. Those structures have padding for future extension. + */ + /* * LTTng client type enumeration. Used by the consumer to map the * callbacks from its own address space. @@ -64,9 +69,11 @@ enum lttng_string_encodings { NR_STRING_ENCODINGS, }; +#define LTTNG_UST_ENUM_ENTRY_PADDING 16 struct lttng_enum_entry { unsigned long long start, end; /* start and end are inclusive */ const char *string; + char padding[LTTNG_UST_ENUM_ENTRY_PADDING]; }; #define __type_integer(_type, _byte_order, _base, _encoding) \ @@ -83,6 +90,7 @@ struct lttng_enum_entry { }, \ } \ +#define LTTNG_UST_INTEGER_TYPE_PADDING 24 struct lttng_integer_type { unsigned int size; /* in bits */ unsigned short alignment; /* in bits */ @@ -90,6 +98,7 @@ struct lttng_integer_type { unsigned int reverse_byte_order:1; unsigned int base; /* 2, 8, 10, 16, for pretty print */ enum lttng_string_encodings encoding; + char padding[LTTNG_UST_INTEGER_TYPE_PADDING]; }; /* @@ -114,13 +123,16 @@ struct lttng_integer_type { }, \ } \ +#define LTTNG_UST_FLOAT_TYPE_PADDING 24 struct lttng_float_type { unsigned int exp_dig; /* exponent digits, in bits */ unsigned int mant_dig; /* mantissa digits, in bits */ unsigned short alignment; /* in bits */ unsigned int reverse_byte_order:1; + char padding[LTTNG_UST_FLOAT_TYPE_PADDING]; }; +#define LTTNG_UST_BASIC_TYPE_PADDING 128 union _lttng_basic_type { struct lttng_integer_type integer; struct { @@ -130,6 +142,7 @@ union _lttng_basic_type { enum lttng_string_encodings encoding; } string; struct lttng_float_type _float; + char padding[LTTNG_UST_BASIC_TYPE_PADDING]; }; struct lttng_basic_type { @@ -139,6 +152,7 @@ struct lttng_basic_type { } u; }; +#define LTTNG_UST_TYPE_PADDING 128 struct lttng_type { enum abstract_types atype; union { @@ -151,23 +165,29 @@ struct lttng_type { struct lttng_basic_type length_type; struct lttng_basic_type elem_type; } sequence; + char padding[LTTNG_UST_TYPE_PADDING]; } u; }; +#define LTTNG_UST_ENUM_TYPE_PADDING 24 struct lttng_enum { const char *name; struct lttng_type container_type; const struct lttng_enum_entry *entries; unsigned int len; + char padding[LTTNG_UST_ENUM_TYPE_PADDING]; }; /* Event field description */ +#define LTTNG_UST_EVENT_FIELD_PADDING 32 struct lttng_event_field { const char *name; struct lttng_type type; + char padding[LTTNG_UST_EVENT_FIELD_PADDING]; }; +#define LTTNG_UST_CTX_FIELD_PADDING 40 struct lttng_ctx_field { struct lttng_event_field event_field; size_t (*get_size)(size_t offset); @@ -175,16 +195,42 @@ struct lttng_ctx_field { struct lttng_ust_lib_ring_buffer_ctx *ctx, struct ltt_channel *chan); union { + char padding[LTTNG_UST_CTX_FIELD_PADDING]; } u; void (*destroy)(struct lttng_ctx_field *field); }; +#define LTTNG_UST_CTX_PADDING 24 struct lttng_ctx { struct lttng_ctx_field *fields; unsigned int nr_fields; unsigned int allocated_fields; + char padding[LTTNG_UST_CTX_PADDING]; +}; + +#define LTTNG_UST_EVENT_DESC_PADDING 40 +struct lttng_event_desc { + const char *name; + void *probe_callback; + const struct lttng_event_ctx *ctx; /* context */ + const struct lttng_event_field *fields; /* event payload */ + unsigned int nr_fields; + const int **loglevel; + const char *signature; /* Argument types/names received */ + char padding[LTTNG_UST_EVENT_DESC_PADDING]; +}; + +#define LTTNG_UST_PROBE_DESC_PADDING 40 +struct lttng_probe_desc { + const char *provider; + const struct lttng_event_desc **event_desc; + unsigned int nr_events; + struct cds_list_head head; /* chain registered probes */ + char padding[LTTNG_UST_PROBE_DESC_PADDING]; }; +/* Data structures used by the tracer. */ + /* * Entry describing a per-session active wildcard, along with the event * attribute and channel information configuring the events that need to @@ -214,22 +260,6 @@ struct wildcard_entry { char name[0]; }; -struct lttng_event_desc { - const char *name; - void *probe_callback; - const struct lttng_event_ctx *ctx; /* context */ - const struct lttng_event_field *fields; /* event payload */ - unsigned int nr_fields; - const int **loglevel; -}; - -struct lttng_probe_desc { - const char *provider; - const struct lttng_event_desc **event_desc; - unsigned int nr_events; - struct cds_list_head head; /* chain registered probes */ -}; - struct tp_list_entry { struct lttng_ust_tracepoint_iter tp; struct cds_list_head head; diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 18aa4e44..1dffd946 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -76,7 +76,7 @@ _TP_PARAMS(_args), \ _TP_PARAMS(_fields)) \ TRACEPOINT_EVENT_INSTANCE(_provider, _name, _name, \ - _TP_PARAMS(args)) + _TP_PARAMS(_args)) /* Helpers */ #define _TP_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) @@ -433,6 +433,25 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))\ #undef __get_dynamic_len +/* + * Stage 5.1 of tracepoint event generation. + * + * Create probe signature + */ + +/* Reset all macros within TRACEPOINT_EVENT */ +#include + +#undef TP_ARGS +#define TP_ARGS(args...) #args + +#undef TRACEPOINT_EVENT_CLASS +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +const char __tp_event_signature___##_provider##___##_name[] = \ + _args; + +#include TRACEPOINT_INCLUDE + /* * Stage 6 of tracepoint event generation. * @@ -475,6 +494,7 @@ const struct lttng_event_desc __event_desc___##_provider##_##_name = { \ .probe_callback = (void *) &__event_probe__##_provider##___##_template,\ .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template), \ .loglevel = &__ref_loglevel___##_provider##___##_name, \ + .signature = __tp_event_signature___##_provider##___##_template, \ }; #include TRACEPOINT_INCLUDE diff --git a/liblttng-ust/ltt-events.c b/liblttng-ust/ltt-events.c index d6f569e8..dcc64a55 100644 --- a/liblttng-ust/ltt-events.c +++ b/liblttng-ust/ltt-events.c @@ -277,7 +277,7 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) remove_pending_probe(e); ret |= __tracepoint_probe_register(name, event->desc->probe_callback, - event); + event, event->desc->signature); if (ret) continue; event->id = chan->free_event_id++; @@ -552,7 +552,7 @@ int ltt_event_create(struct ltt_channel *chan, if (event->desc) { ret = __tracepoint_probe_register(event_param->name, event->desc->probe_callback, - event); + event, event->desc->signature); if (ret) goto register_error; event->id = chan->free_event_id++; diff --git a/liblttng-ust/ltt-probes.c b/liblttng-ust/ltt-probes.c index 474ac454..0de5c6a4 100644 --- a/liblttng-ust/ltt-probes.c +++ b/liblttng-ust/ltt-probes.c @@ -99,7 +99,12 @@ desc_added: * fix the events awaiting probe load. */ for (i = 0; i < desc->nr_events; i++) { - ret = pending_probe_fix_events(desc->event_desc[i]); + const struct lttng_event_desc *ed; + + ed = desc->event_desc[i]; + DBG("Registered event probe \"%s\" with signature \"%s\"", + ed->name, ed->signature); + ret = pending_probe_fix_events(ed); assert(!ret); } end: diff --git a/liblttng-ust/tracepoint-internal.h b/liblttng-ust/tracepoint-internal.h index d302e6ba..98688ace 100644 --- a/liblttng-ust/tracepoint-internal.h +++ b/liblttng-ust/tracepoint-internal.h @@ -31,8 +31,11 @@ struct tracepoint_lib { int tracepoints_count; }; -extern int tracepoint_probe_register_noupdate(const char *name, void *callback, void *priv); -extern int tracepoint_probe_unregister_noupdate(const char *name, void *callback, void *priv); +extern int tracepoint_probe_register_noupdate(const char *name, + void *callback, void *priv, + const char *signature); +extern int tracepoint_probe_unregister_noupdate(const char *name, + void *callback, void *priv); extern void tracepoint_probe_update_all(void); /* diff --git a/liblttng-ust/tracepoint.c b/liblttng-ust/tracepoint.c index 7144fab4..a14c8b34 100644 --- a/liblttng-ust/tracepoint.c +++ b/liblttng-ust/tracepoint.c @@ -94,6 +94,7 @@ struct tracepoint_entry { struct cds_hlist_node hlist; struct tracepoint_probe *probes; int refcount; /* Number of times armed. 0 if disarmed. */ + const char *signature; char name[0]; }; @@ -243,7 +244,8 @@ static struct tracepoint_entry *get_tracepoint(const char *name) * Add the tracepoint to the tracepoint hash table. Must be called with * tracepoint mutex held. */ -static struct tracepoint_entry *add_tracepoint(const char *name) +static struct tracepoint_entry *add_tracepoint(const char *name, + const char *signature) { struct cds_hlist_head *head; struct cds_hlist_node *node; @@ -274,6 +276,7 @@ static struct tracepoint_entry *add_tracepoint(const char *name) e->name[name_len] = '\0'; e->probes = NULL; e->refcount = 0; + e->signature = signature; cds_hlist_add_head(&e->hlist, head); return e; } @@ -295,6 +298,23 @@ static void set_tracepoint(struct tracepoint_entry **entry, struct tracepoint *elem, int active) { WARN_ON(strncmp((*entry)->name, elem->name, LTTNG_UST_SYM_NAME_LEN - 1) != 0); + /* + * Check that signatures match before connecting a probe to a + * tracepoint. Warn the user if they don't. + */ + if (strcmp(elem->signature, (*entry)->signature) != 0) { + static int warned = 0; + + /* Only print once, don't flood console. */ + if (!warned) { + WARN("Tracepoint signature mismatch, not enabling one or more tracepoints. Ensure that the tracepoint probes prototypes match the application."); + WARN("Tracepoint \"%s\" signatures: call: \"%s\" vs probe: \"%s\".", + elem->name, elem->signature, (*entry)->signature); + warned = 1; + } + /* Don't accept connecting non-matching signatures. */ + return; + } /* * rcu_assign_pointer has a cmm_smp_wmb() which makes sure that the new @@ -370,14 +390,15 @@ static void tracepoint_update_probes(void) } static struct tracepoint_probe * -tracepoint_add_probe(const char *name, void *probe, void *data) +tracepoint_add_probe(const char *name, void *probe, void *data, + const char *signature) { struct tracepoint_entry *entry; struct tracepoint_probe *old; entry = get_tracepoint(name); if (!entry) { - entry = add_tracepoint(name); + entry = add_tracepoint(name, signature); if (IS_ERR(entry)) return (struct tracepoint_probe *)entry; } @@ -396,7 +417,8 @@ tracepoint_add_probe(const char *name, void *probe, void *data) * The probe address must at least be aligned on the architecture pointer size. * Called with the tracepoint mutex held. */ -int __tracepoint_probe_register(const char *name, void *probe, void *data) +int __tracepoint_probe_register(const char *name, void *probe, void *data, + const char *signature) { void *old; int ret = 0; @@ -404,7 +426,7 @@ int __tracepoint_probe_register(const char *name, void *probe, void *data) DBG("Registering probe to tracepoint %s", name); pthread_mutex_lock(&tracepoint_mutex); - old = tracepoint_add_probe(name, probe, data); + old = tracepoint_add_probe(name, probe, data, signature); if (IS_ERR(old)) { ret = PTR_ERR(old); goto end; @@ -477,13 +499,13 @@ static void tracepoint_add_old_probes(void *old) * caller must call tracepoint_probe_update_all() */ int tracepoint_probe_register_noupdate(const char *name, void *probe, - void *data) + void *data, const char *signature) { void *old; int ret = 0; pthread_mutex_lock(&tracepoint_mutex); - old = tracepoint_add_probe(name, probe, data); + old = tracepoint_add_probe(name, probe, data, signature); if (IS_ERR(old)) { ret = PTR_ERR(old); goto end; diff --git a/libringbuffer/backend_types.h b/libringbuffer/backend_types.h index 3d8bd3cb..81e67119 100644 --- a/libringbuffer/backend_types.h +++ b/libringbuffer/backend_types.h @@ -15,12 +15,14 @@ #include "shm_internal.h" #include "vatomic.h" +#define RB_BACKEND_PAGES_PADDING 16 struct lttng_ust_lib_ring_buffer_backend_pages { unsigned long mmap_offset; /* offset of the subbuffer in mmap */ union v_atomic records_commit; /* current records committed count */ union v_atomic records_unread; /* records to read */ unsigned long data_size; /* Amount of data to read from subbuf */ DECLARE_SHMP(char, p); /* Backing memory map */ + char padding[RB_BACKEND_PAGES_PADDING]; }; struct lttng_ust_lib_ring_buffer_backend_subbuffer { @@ -38,6 +40,7 @@ struct lttng_ust_lib_ring_buffer_backend_pages_shmp { DECLARE_SHMP(struct lttng_ust_lib_ring_buffer_backend_pages, shmp); }; +#define RB_BACKEND_RING_BUFFER_PADDING 64 struct lttng_ust_lib_ring_buffer_backend { /* Array of ring_buffer_backend_subbuffer for writer */ DECLARE_SHMP(struct lttng_ust_lib_ring_buffer_backend_subbuffer, buf_wsb); @@ -54,12 +57,14 @@ struct lttng_ust_lib_ring_buffer_backend { int cpu; /* This buffer's cpu. -1 if global. */ union v_atomic records_read; /* Number of records read */ unsigned int allocated:1; /* is buffer allocated ? */ + char padding[RB_BACKEND_RING_BUFFER_PADDING]; }; struct lttng_ust_lib_ring_buffer_shmp { DECLARE_SHMP(struct lttng_ust_lib_ring_buffer, shmp); /* Channel per-cpu buffers */ }; +#define RB_BACKEND_CHANNEL_PADDING 64 struct channel_backend { unsigned long buf_size; /* Size of the buffer */ unsigned long subbuf_size; /* Sub-buffer size */ @@ -75,6 +80,7 @@ struct channel_backend { DECLARE_SHMP(void *, priv_data);/* Client-specific information */ struct lttng_ust_lib_ring_buffer_config config; /* Ring buffer configuration */ char name[NAME_MAX]; /* Channel name */ + char padding[RB_BACKEND_CHANNEL_PADDING]; struct lttng_ust_lib_ring_buffer_shmp buf[]; }; diff --git a/libringbuffer/frontend_types.h b/libringbuffer/frontend_types.h index 961c90e5..1d47b275 100644 --- a/libringbuffer/frontend_types.h +++ b/libringbuffer/frontend_types.h @@ -34,6 +34,7 @@ enum switch_mode { SWITCH_ACTIVE, SWITCH_FLUSH }; /* channel: collection of per-cpu ring buffers. */ +#define RB_CHANNEL_PADDING 64 struct channel { int record_disabled; unsigned long commit_count_mask; /* @@ -53,20 +54,26 @@ struct channel { * be last member. */ struct channel_backend backend; /* Associated backend */ + char padding[RB_CHANNEL_PADDING]; } __attribute__((aligned(CAA_CACHE_LINE_SIZE))); /* Per-subbuffer commit counters used on the hot path */ +#define RB_COMMIT_COUNT_HOT_PADDING 16 struct commit_counters_hot { union v_atomic cc; /* Commit counter */ union v_atomic seq; /* Consecutive commits */ + char padding[RB_COMMIT_COUNT_HOT_PADDING]; } __attribute__((aligned(CAA_CACHE_LINE_SIZE))); /* Per-subbuffer commit counters used only on cold paths */ +#define RB_COMMIT_COUNT_COLD_PADDING 24 struct commit_counters_cold { union v_atomic cc_sb; /* Incremented _once_ at sb switch */ + char padding[RB_COMMIT_COUNT_COLD_PADDING]; } __attribute__((aligned(CAA_CACHE_LINE_SIZE))); /* ring buffer state */ +#define RB_RING_BUFFER_PADDING 64 struct lttng_ust_lib_ring_buffer { /* First 32 bytes cache-hot cacheline */ union v_atomic offset; /* Current offset in the buffer */ @@ -109,6 +116,7 @@ struct lttng_ust_lib_ring_buffer { read_timer_enabled:1; /* Protected by ring_buffer_nohz_lock */ /* shmp pointer to self */ DECLARE_SHMP(struct lttng_ust_lib_ring_buffer, self); + char padding[RB_RING_BUFFER_PADDING]; } __attribute__((aligned(CAA_CACHE_LINE_SIZE))); static inline