Merge branch 'master' into dev
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 1 Mar 2012 22:23:47 +0000 (17:23 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 1 Mar 2012 22:23:47 +0000 (17:23 -0500)
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 <mathieu.desnoyers@efficios.com>
12 files changed:
.gitignore
include/lttng/ringbuffer-config.h
include/lttng/tracepoint-types.h
include/lttng/tracepoint.h
include/lttng/ust-events.h
include/lttng/ust-tracepoint-event.h
liblttng-ust/ltt-events.c
liblttng-ust/ltt-probes.c
liblttng-ust/tracepoint-internal.h
liblttng-ust/tracepoint.c
libringbuffer/backend_types.h
libringbuffer/frontend_types.h

index 4239f2e6fa134a34e784cc6df3a429e6ffc33c20..076cd007cca120b6f08082d207507b52296814b5 100644 (file)
@@ -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
index 728738cd84b1734647ffeb180b8770c34660621f..5273f321af01be088e8634405545da3220137646 100644 (file)
@@ -24,6 +24,7 @@
 #include <stdint.h>
 #include <stddef.h>
 #include <urcu/arch.h>
+#include <string.h>
 #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);
 }
 
 /*
index 37a7662b605f8a9deb5bb3082bd65437c11312e7..9b104b07be6698e927dc4362b200eb99b16d86d7 100644 (file)
@@ -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 */
index 5fda51f43bb0aa1f1390f8dc6d00f2bf34b5373d..b1c2d360feffb3de46aa53237ba4d5cd2843d416 100644 (file)
@@ -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 */
 
index 96435c481c7b5aa117ed04b893a057bd531dfdfd..f1ef8c91ee7f6f52cf6e7105147e0317c2dbc7a2 100644 (file)
@@ -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;
index 18aa4e44f1439b56d194601e5c1d4c89aee4ad9c..1dffd94635364f84a5f7b9bdd9a28036403aa1fa 100644 (file)
@@ -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 <lttng/ust-tracepoint-event-reset.h>
+
+#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
index d6f569e8a28bcdfc546dca4008dcf727e1226f53..dcc64a55044d6edadc9aacedec273fabe4545e81 100644 (file)
@@ -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++;
index 474ac454a7aac33a67e0b280ece029ec9673046d..0de5c6a48f2ed6b5a4b0fd71b068cac6519c4433 100644 (file)
@@ -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:
index d302e6ba34d2d6792d85eaf42b08152b869ecddf..98688ace8bd80c0a31aaefa7eb152fa9238565a7 100644 (file)
@@ -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);
 
 /*
index 7144fab40003c586a726fff5a6b4544f14d4c36c..a14c8b34303e43dc40be48cd3aefcd89a31c2197 100644 (file)
@@ -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;
index 3d8bd3cb3392c1f5c3db2d3fc11323e1b29f7081..81e67119847a119b2ad140e71aefa0a648ef5bfa 100644 (file)
 #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[];
 };
 
index 961c90e5084bd705c502d40e40a7cbb7b54307f6..1d47b275b6fabd3cdc2c5351771662b4989378f7 100644 (file)
@@ -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
This page took 0.038863 seconds and 4 git commands to generate.