tracepoint: split provider and event name
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 15 Apr 2021 18:00:13 +0000 (14:00 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 22 Apr 2021 14:59:16 +0000 (10:59 -0400)
Now that we bump the ABI, it's a good opportunity to split the
tracepoint "name" field, which is a concatenation of

  #provider_name ':' #event_name

into separate provider and name fields.

Reject tracepoints and callsites which are larger than the maximum
length supported by LTTng-UST rather than silently truncating them.
This emits a warning visible with LTTNG_UST_DEBUG=1 to allow pinpointing
erroneous users.

Note that as long as tracepoints are defined statically with the
tracepoint API, the length of the provider and event names is validated
with a build-time check.

This means the core of tracepoint.c is now agnostic to the length of the
tracepoint provider/event name. If there is ever a change to the
LTTng-UST protocol allowing larger length for those, changing the
length validations will be straightforward.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I770cf57e1f19ec6f4d8c1c7b05e537a176a046cb

include/lttng/tracepoint-types.h
include/lttng/tracepoint.h
src/common/tracepoint.h
src/lib/lttng-ust-tracepoint/tracepoint.c
src/lib/lttng-ust-tracepoint/tracepoint.h
src/lib/lttng-ust/lttng-events.c

index 5354c3698abc478dd41c6167f5cff07098f7de63..d169a1125bb18d07c7cc14502d9ace2bbd42828a 100644 (file)
@@ -38,7 +38,8 @@ struct lttng_ust_tracepoint_probe {
 struct lttng_ust_tracepoint {
        uint32_t struct_size;
 
-       const char *name;
+       const char *provider_name;
+       const char *event_name;
        int state;
        struct lttng_ust_tracepoint_probe *probes;
        int *tracepoint_provider_ref;
index f85db068d378383d941dbc8271ed555a71d1a9b9..98c3c8dd89bfd2b6419bca7f6e15b255967209aa 100644 (file)
@@ -207,31 +207,31 @@ end:                                                                                      \
        tp_rcu_read_unlock();                                                           \
 }                                                                                      \
 static inline                                                                          \
-void __tracepoint_register_##_provider##___##_name(char *name,                         \
+void __tracepoint_register_##_provider##___##_name(char *provider_name, char *event_name, \
                void (*func)(void), void *data)                                         \
        lttng_ust_notrace;                                                              \
 static inline                                                                          \
-void __tracepoint_register_##_provider##___##_name(char *name,                         \
+void __tracepoint_register_##_provider##___##_name(char *provider_name, char *event_name, \
                void (*func)(void), void *data)                                         \
 {                                                                                      \
-       __tracepoint_probe_register(name, func, data,                                   \
+       __tracepoint_probe_register(provider_name, event_name, func, data,              \
                __tracepoint_##_provider##___##_name.signature);                        \
 }                                                                                      \
 static inline                                                                          \
-void __tracepoint_unregister_##_provider##___##_name(char *name,                       \
+void __tracepoint_unregister_##_provider##___##_name(char *provider_name, char *event_name, \
                void (*func)(void), void *data)                                         \
        lttng_ust_notrace;                                                              \
 static inline                                                                          \
-void __tracepoint_unregister_##_provider##___##_name(char *name,                       \
+void __tracepoint_unregister_##_provider##___##_name(char *provider_name, char *event_name, \
                void (*func)(void), void *data)                                         \
 {                                                                                      \
-       __tracepoint_probe_unregister(name, func, data);                                \
+       __tracepoint_probe_unregister(provider_name, event_name, func, data);           \
 }
 
-extern int __tracepoint_probe_register(const char *name, void (*func)(void),
-               void *data, const char *signature);
-extern int __tracepoint_probe_unregister(const char *name, void (*func)(void),
-               void *data);
+extern int __tracepoint_probe_register(const char *provider_name, const char *event_name,
+               void (*func)(void), void *data, const char *signature);
+extern int __tracepoint_probe_unregister(const char *provider_name, const char *event_name,
+               void (*func)(void), void *data);
 
 /*
  * tracepoint dynamic linkage handling (callbacks). Hidden visibility:
@@ -469,13 +469,17 @@ extern struct lttng_ust_tracepoint * const __stop___tracepoints_ptrs[]
 #define _DEFINE_TRACEPOINT(_provider, _name, _args)                            \
        lttng_ust_tracepoint_validate_name_len(_provider, _name);               \
        extern int __tracepoint_provider_##_provider;                           \
-       static const char __tp_strtab_##_provider##___##_name[]                 \
+       static const char __tp_provider_strtab_##_provider##___##_name[]        \
                __attribute__((section("__tracepoints_strings"))) =             \
-                       #_provider ":" #_name;                                  \
+                       #_provider;                                             \
+       static const char __tp_name_strtab_##_provider##___##_name[]            \
+               __attribute__((section("__tracepoints_strings"))) =             \
+                       #_name;                                                 \
        struct lttng_ust_tracepoint __tracepoint_##_provider##___##_name        \
                __attribute__((section("__tracepoints"))) = {                   \
                        sizeof(struct lttng_ust_tracepoint),                    \
-                       __tp_strtab_##_provider##___##_name,                    \
+                       __tp_provider_strtab_##_provider##___##_name,           \
+                       __tp_name_strtab_##_provider##___##_name,               \
                        0,                                                      \
                        NULL,                                                   \
                        _TRACEPOINT_UNDEFINED_REF(_provider),                   \
index 11c2b8f3ee242a42d087921c7c49126487594016..6c95ccbd463247ca86b1c8159aa2fc805f5a8914 100644 (file)
@@ -13,9 +13,9 @@
  * These symbols are ABI between liblttng-ust-tracepoint and liblttng-ust,
  * which is why they are not hidden and not part of the public API.
  */
-int lttng_ust_tp_probe_register_queue_release(const char *name,
+int lttng_ust_tp_probe_register_queue_release(const char *provider_name, const char *event_name,
                void (*func)(void), void *data, const char *signature);
-int lttng_ust_tp_probe_unregister_queue_release(const char *name,
+int lttng_ust_tp_probe_unregister_queue_release(const char *provider_name, const char *event_name,
                void (*func)(void), void *data);
 void lttng_ust_tp_probe_prune_release_queue(void);
 
index b84604d19ee6028c5b491448fd2ac7b2633742be..939af88872b75daf0bdc2b21502dab0ec1856869 100644 (file)
@@ -104,7 +104,8 @@ struct tracepoint_entry {
        int refcount;   /* Number of times armed. 0 if disarmed. */
        int callsite_refcount;  /* how many libs use this tracepoint */
        char *signature;
-       char *name;
+       char *provider_name;
+       char *event_name;
 };
 
 struct tp_probes {
@@ -135,6 +136,15 @@ lttng_ust_static_assert(LTTNG_UST_TRACEPOINT_NAME_LEN_MAX == LTTNG_UST_ABI_SYM_N
                "Tracepoint name max length mismatch between UST ABI and tracepoint API",
                Tracepoint_name_max_length_mismatch);
 
+static
+bool lttng_ust_tp_validate_event_name(const struct lttng_ust_tracepoint *tp)
+{
+       if (strlen(tp->provider_name) + 1 +
+                       strlen(tp->event_name) >= LTTNG_UST_TRACEPOINT_NAME_LEN_MAX)
+               return false;
+       return true;
+}
+
 /* coverity[+alloc] */
 static void *allocate_probes(int count)
 {
@@ -253,22 +263,18 @@ tracepoint_entry_remove_probe(struct tracepoint_entry *entry,
  * Must be called with tracepoint mutex held.
  * Returns NULL if not present.
  */
-static struct tracepoint_entry *get_tracepoint(const char *name)
+static struct tracepoint_entry *get_tracepoint(const char *provider_name, const char *event_name)
 {
        struct cds_hlist_head *head;
        struct cds_hlist_node *node;
        struct tracepoint_entry *e;
-       size_t name_len = strlen(name);
        uint32_t hash;
 
-       if (name_len > LTTNG_UST_ABI_SYM_NAME_LEN - 1) {
-               WARN("Truncating tracepoint name %s which exceeds size limits of %u chars", name, LTTNG_UST_ABI_SYM_NAME_LEN - 1);
-               name_len = LTTNG_UST_ABI_SYM_NAME_LEN - 1;
-       }
-       hash = jhash(name, name_len, 0);
+       hash = jhash(provider_name, strlen(provider_name), 0) ^
+               jhash(event_name, strlen(event_name), 0);
        head = &tracepoint_table[hash & (TRACEPOINT_TABLE_SIZE - 1)];
        cds_hlist_for_each_entry(e, node, head, hlist) {
-               if (!strncmp(name, e->name, LTTNG_UST_ABI_SYM_NAME_LEN - 1))
+               if (!strcmp(event_name, e->event_name) && !strcmp(provider_name, e->provider_name))
                        return e;
        }
        return NULL;
@@ -278,26 +284,24 @@ 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 *provider_name, const char *event_name,
                const char *signature)
 {
        struct cds_hlist_head *head;
        struct cds_hlist_node *node;
        struct tracepoint_entry *e;
-       size_t name_len = strlen(name);
        size_t sig_len = strlen(signature);
-       size_t sig_off, name_off;
+       size_t sig_off, provider_name_off, event_name_off;
+       size_t provider_name_len = strlen(provider_name);
+       size_t event_name_len = strlen(event_name);
        uint32_t hash;
 
-       if (name_len > LTTNG_UST_ABI_SYM_NAME_LEN - 1) {
-               WARN("Truncating tracepoint name %s which exceeds size limits of %u chars", name, LTTNG_UST_ABI_SYM_NAME_LEN - 1);
-               name_len = LTTNG_UST_ABI_SYM_NAME_LEN - 1;
-       }
-       hash = jhash(name, name_len, 0);
+       hash = jhash(provider_name, provider_name_len, 0) ^
+               jhash(event_name, event_name_len, 0);
        head = &tracepoint_table[hash & (TRACEPOINT_TABLE_SIZE - 1)];
        cds_hlist_for_each_entry(e, node, head, hlist) {
-               if (!strncmp(name, e->name, LTTNG_UST_ABI_SYM_NAME_LEN - 1)) {
-                       DBG("tracepoint %s busy", name);
+               if (!strcmp(event_name, e->event_name) && !strcmp(provider_name, e->provider_name)) {
+                       DBG("tracepoint \"%s:%s\" busy", provider_name, event_name);
                        return ERR_PTR(-EEXIST);        /* Already there */
                }
        }
@@ -306,15 +310,21 @@ static struct tracepoint_entry *add_tracepoint(const char *name,
         * Using zmalloc here to allocate a variable length elements: name and
         * signature. Could cause some memory fragmentation if overused.
         */
-       name_off = sizeof(struct tracepoint_entry);
-       sig_off = name_off + name_len + 1;
+       provider_name_off = sizeof(struct tracepoint_entry);
+       event_name_off = provider_name_off + provider_name_len + 1;
+       sig_off = event_name_off + event_name_len + 1;
 
-       e = zmalloc(sizeof(struct tracepoint_entry) + name_len + 1 + sig_len + 1);
+       e = zmalloc(sizeof(struct tracepoint_entry) + provider_name_len + 1 +
+                       event_name_len + 1 + sig_len + 1);
        if (!e)
                return ERR_PTR(-ENOMEM);
-       e->name = (char *) e + name_off;
-       memcpy(e->name, name, name_len + 1);
-       e->name[name_len] = '\0';
+       e->provider_name = (char *) e + provider_name_off;
+       memcpy(e->provider_name, provider_name, provider_name_len + 1);
+       e->provider_name[provider_name_len] = '\0';
+
+       e->event_name = (char *) e + event_name_off;
+       memcpy(e->event_name, event_name, event_name_len + 1);
+       e->event_name[event_name_len] = '\0';
 
        e->signature = (char *) e + sig_off;
        memcpy(e->signature, signature, sig_len + 1);
@@ -344,7 +354,8 @@ static void remove_tracepoint(struct tracepoint_entry *e)
 static void set_tracepoint(struct tracepoint_entry **entry,
        struct lttng_ust_tracepoint *elem, int active)
 {
-       WARN_ON(strncmp((*entry)->name, elem->name, LTTNG_UST_ABI_SYM_NAME_LEN - 1) != 0);
+       WARN_ON(strcmp((*entry)->provider_name, elem->provider_name) != 0);
+       WARN_ON(strcmp((*entry)->event_name, elem->event_name) != 0);
        /*
         * Check that signatures match before connecting a probe to a
         * tracepoint. Warn the user if they don't.
@@ -355,8 +366,8 @@ static void set_tracepoint(struct tracepoint_entry **entry,
                /* 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);
+                       WARN("Tracepoint \"%s:%s\" signatures: call: \"%s\" vs probe: \"%s\".",
+                               elem->provider_name, elem->event_name, elem->signature, (*entry)->signature);
                        warned = 1;
                }
                /* Don't accept connecting non-matching signatures. */
@@ -394,27 +405,27 @@ static void add_callsite(struct tracepoint_lib * lib, struct lttng_ust_tracepoin
 {
        struct cds_hlist_head *head;
        struct callsite_entry *e;
-       const char *name = tp->name;
-       size_t name_len = strlen(name);
        uint32_t hash;
        struct tracepoint_entry *tp_entry;
 
-       if (name_len > LTTNG_UST_ABI_SYM_NAME_LEN - 1) {
-               WARN("Truncating tracepoint name %s which exceeds size limits of %u chars", name, LTTNG_UST_ABI_SYM_NAME_LEN - 1);
-               name_len = LTTNG_UST_ABI_SYM_NAME_LEN - 1;
+       if (!lttng_ust_tp_validate_event_name(tp)) {
+               WARN("Rejecting tracepoint name \"%s:%s\" which exceeds size limits of %u chars",
+                       tp->provider_name, tp->event_name, LTTNG_UST_TRACEPOINT_NAME_LEN_MAX - 1);
+               return;
        }
-       hash = jhash(name, name_len, 0);
+       hash = jhash(tp->provider_name, strlen(tp->provider_name), 0) ^
+               jhash(tp->event_name, strlen(tp->event_name), 0);
        head = &callsite_table[hash & (CALLSITE_TABLE_SIZE - 1)];
        e = zmalloc(sizeof(struct callsite_entry));
        if (!e) {
-               PERROR("Unable to add callsite for tracepoint \"%s\"", name);
+               PERROR("Unable to add callsite for tracepoint \"%s:%s\"", tp->provider_name, tp->event_name);
                return;
        }
        cds_hlist_add_head(&e->hlist, head);
        e->tp = tp;
        cds_list_add(&e->node, &lib->callsites);
 
-       tp_entry = get_tracepoint(name);
+       tp_entry = get_tracepoint(tp->provider_name, tp->event_name);
        if (!tp_entry)
                return;
        tp_entry->callsite_refcount++;
@@ -429,7 +440,7 @@ static void remove_callsite(struct callsite_entry *e)
 {
        struct tracepoint_entry *tp_entry;
 
-       tp_entry = get_tracepoint(e->tp->name);
+       tp_entry = get_tracepoint(e->tp->provider_name, e->tp->event_name);
        if (tp_entry) {
                if (e->tp_entry_callsite_ref)
                        tp_entry->callsite_refcount--;
@@ -446,26 +457,24 @@ static void remove_callsite(struct callsite_entry *e)
  * tracepoint entry.
  * Must be called with tracepoint mutex held.
  */
-static void tracepoint_sync_callsites(const char *name)
+static void tracepoint_sync_callsites(const char *provider_name, const char *event_name)
 {
+       struct tracepoint_entry *tp_entry;
        struct cds_hlist_head *head;
        struct cds_hlist_node *node;
        struct callsite_entry *e;
-       size_t name_len = strlen(name);
        uint32_t hash;
-       struct tracepoint_entry *tp_entry;
 
-       tp_entry = get_tracepoint(name);
-       if (name_len > LTTNG_UST_ABI_SYM_NAME_LEN - 1) {
-               WARN("Truncating tracepoint name %s which exceeds size limits of %u chars", name, LTTNG_UST_ABI_SYM_NAME_LEN - 1);
-               name_len = LTTNG_UST_ABI_SYM_NAME_LEN - 1;
-       }
-       hash = jhash(name, name_len, 0);
+       tp_entry = get_tracepoint(provider_name, event_name);
+       hash = jhash(provider_name, strlen(provider_name), 0) ^
+               jhash(event_name, strlen(event_name), 0);
        head = &callsite_table[hash & (CALLSITE_TABLE_SIZE - 1)];
        cds_hlist_for_each_entry(e, node, head, hlist) {
                struct lttng_ust_tracepoint *tp = e->tp;
 
-               if (strncmp(name, tp->name, LTTNG_UST_ABI_SYM_NAME_LEN - 1))
+               if (strcmp(event_name, tp->event_name))
+                       continue;
+               if (strcmp(provider_name, tp->provider_name))
                        continue;
                if (tp_entry) {
                        if (!e->tp_entry_callsite_ref) {
@@ -498,11 +507,17 @@ void tracepoint_update_probe_range(struct lttng_ust_tracepoint * const *begin,
        for (iter = begin; iter < end; iter++) {
                if (!*iter)
                        continue;       /* skip dummy */
-               if (!(*iter)->name) {
+               if (!(*iter)->provider_name || !(*iter)->event_name) {
+                       disable_tracepoint(*iter);
+                       continue;
+               }
+               if (!lttng_ust_tp_validate_event_name(*iter)) {
+                       WARN("Rejecting tracepoint name \"%s:%s\" which exceeds size limits of %u chars",
+                               (*iter)->provider_name, (*iter)->event_name, LTTNG_UST_TRACEPOINT_NAME_LEN_MAX - 1);
                        disable_tracepoint(*iter);
                        continue;
                }
-               mark_entry = get_tracepoint((*iter)->name);
+               mark_entry = get_tracepoint((*iter)->provider_name, (*iter)->event_name);
                if (mark_entry) {
                        set_tracepoint(&mark_entry, *iter,
                                        !!mark_entry->refcount);
@@ -530,7 +545,7 @@ static void lib_register_callsites(struct tracepoint_lib *lib)
        for (iter = begin; iter < end; iter++) {
                if (!*iter)
                        continue;       /* skip dummy */
-               if (!(*iter)->name) {
+               if (!(*iter)->provider_name || !(*iter)->event_name) {
                        continue;
                }
                add_callsite(lib, *iter);
@@ -558,20 +573,21 @@ static void tracepoint_update_probes(void)
 }
 
 static struct lttng_ust_tracepoint_probe *
-tracepoint_add_probe(const char *name, void (*probe)(void), void *data,
-               const char *signature)
+tracepoint_add_probe(const char *provider_name, const char *event_name,
+               void (*probe)(void), void *data, const char *signature)
 {
        struct tracepoint_entry *entry;
        struct lttng_ust_tracepoint_probe *old;
 
-       entry = get_tracepoint(name);
+       entry = get_tracepoint(provider_name, event_name);
        if (entry) {
                if (strcmp(entry->signature, signature) != 0) {
-                       ERR("Tracepoint and probe signature do not match.");
+                       ERR("Tracepoint \"%s:%s\": tracepoint and probe signature do not match: \"%s\" vs \"%s\".",
+                               provider_name, event_name, entry->signature, signature);
                        return ERR_PTR(-EINVAL);
                }
        } else {
-               entry = add_tracepoint(name, signature);
+               entry = add_tracepoint(provider_name, event_name, signature);
                if (IS_ERR(entry))
                        return (struct lttng_ust_tracepoint_probe *)entry;
        }
@@ -593,29 +609,30 @@ static void tracepoint_release_queue_add_old_probes(void *old)
 
 /**
  * __tracepoint_probe_register -  Connect a probe to a tracepoint
- * @name: tracepoint name
+ * @name: tracepoint provider name
+ * @name: tracepoint event name
  * @probe: probe handler
  *
  * Returns 0 if ok, error value on error.
  * 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),
-               void *data, const char *signature)
+int __tracepoint_probe_register(const char *provider_name, const char *event_name,
+               void (*probe)(void), void *data, const char *signature)
 {
        void *old;
        int ret = 0;
 
-       DBG("Registering probe to tracepoint %s", name);
+       DBG("Registering probe to tracepoint \"%s:%s\"", provider_name, event_name);
 
        pthread_mutex_lock(&tracepoint_mutex);
-       old = tracepoint_add_probe(name, probe, data, signature);
+       old = tracepoint_add_probe(provider_name, event_name, probe, data, signature);
        if (IS_ERR(old)) {
                ret = PTR_ERR(old);
                goto end;
        }
 
-       tracepoint_sync_callsites(name);
+       tracepoint_sync_callsites(provider_name, event_name);
        release_probes(old);
 end:
        pthread_mutex_unlock(&tracepoint_mutex);
@@ -627,35 +644,35 @@ end:
  * calling lttng_ust_tp_probe_register_queue_release() one or multiple
  * times to ensure it does not leak memory.
  */
-int lttng_ust_tp_probe_register_queue_release(const char *name,
+int lttng_ust_tp_probe_register_queue_release(const char *provider_name, const char *event_name,
                void (*probe)(void), void *data, const char *signature)
 {
        void *old;
        int ret = 0;
 
-       DBG("Registering probe to tracepoint %s. Queuing release.", name);
+       DBG("Registering probe to tracepoint \"%s:%s\". Queuing release.", provider_name, event_name);
 
        pthread_mutex_lock(&tracepoint_mutex);
-       old = tracepoint_add_probe(name, probe, data, signature);
+       old = tracepoint_add_probe(provider_name, event_name, probe, data, signature);
        if (IS_ERR(old)) {
                ret = PTR_ERR(old);
                goto end;
        }
 
-       tracepoint_sync_callsites(name);
+       tracepoint_sync_callsites(provider_name, event_name);
        tracepoint_release_queue_add_old_probes(old);
 end:
        pthread_mutex_unlock(&tracepoint_mutex);
        return ret;
 }
 
-static void *tracepoint_remove_probe(const char *name, void (*probe)(void),
-               void *data)
+static void *tracepoint_remove_probe(const char *provider_name, const char *event_name,
+               void (*probe)(void), void *data)
 {
        struct tracepoint_entry *entry;
        void *old;
 
-       entry = get_tracepoint(name);
+       entry = get_tracepoint(provider_name, event_name);
        if (!entry)
                return ERR_PTR(-ENOENT);
        old = tracepoint_entry_remove_probe(entry, probe, data);
@@ -668,25 +685,26 @@ static void *tracepoint_remove_probe(const char *name, void (*probe)(void),
 
 /**
  * tracepoint_probe_unregister -  Disconnect a probe from a tracepoint
- * @name: tracepoint name
+ * @provider_name: tracepoint provider name
+ * @event_name: tracepoint event name
  * @probe: probe function pointer
  * @probe: probe data pointer
  */
-int __tracepoint_probe_unregister(const char *name, void (*probe)(void),
-               void *data)
+int __tracepoint_probe_unregister(const char *provider_name, const char *event_name,
+               void (*probe)(void), void *data)
 {
        void *old;
        int ret = 0;
 
-       DBG("Un-registering probe from tracepoint %s", name);
+       DBG("Un-registering probe \"%s:%s\" from tracepoint %p", provider_name, event_name, probe);
 
        pthread_mutex_lock(&tracepoint_mutex);
-       old = tracepoint_remove_probe(name, probe, data);
+       old = tracepoint_remove_probe(provider_name, event_name, probe, data);
        if (IS_ERR(old)) {
                ret = PTR_ERR(old);
                goto end;
        }
-       tracepoint_sync_callsites(name);
+       tracepoint_sync_callsites(provider_name, event_name);
        release_probes(old);
 end:
        pthread_mutex_unlock(&tracepoint_mutex);
@@ -698,21 +716,21 @@ end:
  * calling lttng_ust_tp_probe_unregister_queue_release() one or multiple
  * times to ensure it does not leak memory.
  */
-int lttng_ust_tp_probe_unregister_queue_release(const char *name,
+int lttng_ust_tp_probe_unregister_queue_release(const char *provider_name, const char *event_name,
                void (*probe)(void), void *data)
 {
        void *old;
        int ret = 0;
 
-       DBG("Un-registering probe from tracepoint %s. Queuing release.", name);
+       DBG("Un-registering probe from tracepoint \"%s:%s\". Queuing release.", provider_name, event_name);
 
        pthread_mutex_lock(&tracepoint_mutex);
-       old = tracepoint_remove_probe(name, probe, data);
+       old = tracepoint_remove_probe(provider_name, event_name, probe, data);
        if (IS_ERR(old)) {
                ret = PTR_ERR(old);
                goto end;
        }
-       tracepoint_sync_callsites(name);
+       tracepoint_sync_callsites(provider_name, event_name);
        tracepoint_release_queue_add_old_probes(old);
 end:
        pthread_mutex_unlock(&tracepoint_mutex);
@@ -761,14 +779,14 @@ 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),
-                                      void *data, const char *signature)
+int tracepoint_probe_register_noupdate(const char *provider_name, const char *event_name,
+                                      void (*probe)(void), void *data, const char *signature)
 {
        void *old;
        int ret = 0;
 
        pthread_mutex_lock(&tracepoint_mutex);
-       old = tracepoint_add_probe(name, probe, data, signature);
+       old = tracepoint_add_probe(provider_name, event_name, probe, data, signature);
        if (IS_ERR(old)) {
                ret = PTR_ERR(old);
                goto end;
@@ -787,16 +805,16 @@ end:
  * caller must call tracepoint_probe_update_all()
  * Called with the tracepoint mutex held.
  */
-int tracepoint_probe_unregister_noupdate(const char *name, void (*probe)(void),
-                                        void *data)
+int tracepoint_probe_unregister_noupdate(const char *provider_name, const char *event_name,
+                                        void (*probe)(void), void *data)
 {
        void *old;
        int ret = 0;
 
-       DBG("Un-registering probe from tracepoint %s", name);
+       DBG("Un-registering probe from tracepoint \"%s:%s\"", provider_name, event_name);
 
        pthread_mutex_lock(&tracepoint_mutex);
-       old = tracepoint_remove_probe(name, probe, data);
+       old = tracepoint_remove_probe(provider_name, event_name, probe, data);
        if (IS_ERR(old)) {
                ret = PTR_ERR(old);
                goto end;
@@ -903,7 +921,11 @@ lib_added:
                int i;
 
                for (i = 0; i < tracepoints_count; i++) {
-                       DBG("registered tracepoint: %s", tracepoints_start[i]->name);
+                       if (!lttng_ust_tp_validate_event_name(tracepoints_start[i]))
+                               continue;
+                       DBG("registered tracepoint: \"%s:%s\"",
+                               tracepoints_start[i]->provider_name,
+                               tracepoints_start[i]->event_name);
                }
        }
 
index ebc25441ec8e209cbaadae3d5c3f6808d51c1dc5..eeb1d7bd82de1b0ae3f2fc75ae09c95c5a9c6997 100644 (file)
@@ -18,12 +18,12 @@ struct tracepoint_lib {
        struct cds_list_head callsites;
 };
 
-int tracepoint_probe_register_noupdate(const char *name,
+int tracepoint_probe_register_noupdate(const char *provider_name, const char *event_name,
                void (*callback)(void), void *priv,
                const char *signature)
        __attribute__((visibility("hidden")));
 
-int tracepoint_probe_unregister_noupdate(const char *name,
+int tracepoint_probe_unregister_noupdate(const char *provider_name, const char *event_name,
                void (*callback)(void), void *priv)
        __attribute__((visibility("hidden")));
 
index 445a3c398b279c0271f25af7869b1acda7c2559a..33737e4d33089ff192c99c29e4c1328b018e51ad 100644 (file)
@@ -266,12 +266,11 @@ void register_event(struct lttng_ust_event_common *event)
 {
        int ret;
        const struct lttng_ust_event_desc *desc;
-       char name[LTTNG_UST_ABI_SYM_NAME_LEN];
 
        assert(event->priv->registered == 0);
        desc = event->priv->desc;
-       lttng_ust_format_event_name(desc, name);
-       ret = lttng_ust_tp_probe_register_queue_release(name,
+       ret = lttng_ust_tp_probe_register_queue_release(desc->probe_desc->provider_name,
+                       desc->event_name,
                        desc->probe_callback,
                        event, desc->signature);
        WARN_ON_ONCE(ret);
@@ -284,12 +283,11 @@ void unregister_event(struct lttng_ust_event_common *event)
 {
        int ret;
        const struct lttng_ust_event_desc *desc;
-       char name[LTTNG_UST_ABI_SYM_NAME_LEN];
 
        assert(event->priv->registered == 1);
        desc = event->priv->desc;
-       lttng_ust_format_event_name(desc, name);
-       ret = lttng_ust_tp_probe_unregister_queue_release(name,
+       ret = lttng_ust_tp_probe_unregister_queue_release(desc->probe_desc->provider_name,
+                       desc->event_name,
                        desc->probe_callback,
                        event);
        WARN_ON_ONCE(ret);
This page took 0.038031 seconds and 4 git commands to generate.