X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Flib%2Flttng-ust%2Flttng-probes.c;h=8809dac7929b85003398c9d747824951808e8c08;hb=f617346971f89d15bdbe7bb5b9464f6472fdbbc1;hp=2dff30f43800e9edf77f4cc3b0d94adccae692d5;hpb=36c52fffa1beb46c7c15bb6ac4a4179cae373b98;p=lttng-ust.git diff --git a/src/lib/lttng-ust/lttng-probes.c b/src/lib/lttng-ust/lttng-probes.c index 2dff30f4..8809dac7 100644 --- a/src/lib/lttng-ust/lttng-probes.c +++ b/src/lib/lttng-ust/lttng-probes.c @@ -13,14 +13,13 @@ #include #include #include -#include "tracepoint-internal.h" +#include "common/tracepoint.h" #include #include "common/macros.h" #include #include "lttng-tracer-core.h" -#include "jhash.h" -#include "error.h" +#include "common/jhash.h" #include "lib/lttng-ust/events.h" /* @@ -40,9 +39,40 @@ static CDS_LIST_HEAD(lazy_probe_init); */ static int lazy_nesting; +static +int check_provider_version(const struct lttng_ust_probe_desc *desc) +{ + /* + * Check tracepoint provider version compatibility. + */ + if (desc->major <= LTTNG_UST_PROVIDER_MAJOR && + desc->major >= LTTNG_UST_PROVIDER_MAJOR_OLDEST_COMPATIBLE) { + DBG("Provider \"%s\" accepted, version %u.%u is compatible " + "with LTTng UST provider version %u.%u.", + desc->provider_name, desc->major, desc->minor, + LTTNG_UST_PROVIDER_MAJOR, + LTTNG_UST_PROVIDER_MINOR); + if (desc->major < LTTNG_UST_PROVIDER_MAJOR) { + DBG("However, some LTTng UST features might not be " + "available for this provider unless it is " + "recompiled against a more recent LTTng UST."); + } + return 1; /* accept */ + } else { + ERR("Provider \"%s\" rejected, version %u.%u is incompatible " + "with LTTng UST provider version %u.%u. Please upgrade " + "LTTng UST.", + desc->provider_name, desc->major, desc->minor, + LTTNG_UST_PROVIDER_MAJOR, + LTTNG_UST_PROVIDER_MINOR); + return 0; /* reject */ + } +} + /* * Validate that each event within the probe provider refers to the - * right probe, and that the resulting name is not too long. + * right probe, that the resulting name is not too long, and that the + * event class belongs to a provider with compatible version. */ static bool check_event_provider(const struct lttng_ust_probe_desc *probe_desc) @@ -62,6 +92,11 @@ bool check_event_provider(const struct lttng_ust_probe_desc *probe_desc) probe_desc->provider_name, probe_desc->provider_name, event_desc->event_name); return false; /* provider mismatch */ } + if (!check_provider_version(event_desc->tp_class->probe_desc)) { + ERR("Error registering probe provider '%s'. Event '%s:%s' refers to an event class in a provider with incompatible version.", + probe_desc->provider_name, probe_desc->provider_name, event_desc->event_name); + return false; + } } return true; } @@ -77,7 +112,7 @@ void lttng_lazy_probe_register(struct lttng_ust_registered_probe *reg_probe) /* * The provider ensures there are no duplicate event names. - * Duplicated TRACEPOINT_EVENT event names would generate a + * Duplicated LTTNG_UST_TRACEPOINT_EVENT event names would generate a * compile-time error due to duplicated symbol names. */ @@ -132,40 +167,12 @@ struct cds_list_head *lttng_get_probe_list_head(void) return &_probe_list; } -static -int check_provider_version(const struct lttng_ust_probe_desc *desc) -{ - /* - * Check tracepoint provider version compatibility. - */ - if (desc->major <= LTTNG_UST_PROVIDER_MAJOR) { - DBG("Provider \"%s\" accepted, version %u.%u is compatible " - "with LTTng UST provider version %u.%u.", - desc->provider_name, desc->major, desc->minor, - LTTNG_UST_PROVIDER_MAJOR, - LTTNG_UST_PROVIDER_MINOR); - if (desc->major < LTTNG_UST_PROVIDER_MAJOR) { - DBG("However, some LTTng UST features might not be " - "available for this provider unless it is " - "recompiled against a more recent LTTng UST."); - } - return 1; /* accept */ - } else { - ERR("Provider \"%s\" rejected, version %u.%u is incompatible " - "with LTTng UST provider version %u.%u. Please upgrade " - "LTTng UST.", - desc->provider_name, desc->major, desc->minor, - LTTNG_UST_PROVIDER_MAJOR, - LTTNG_UST_PROVIDER_MINOR); - return 0; /* reject */ - } -} struct lttng_ust_registered_probe *lttng_ust_probe_register(const struct lttng_ust_probe_desc *desc) { struct lttng_ust_registered_probe *reg_probe = NULL; - lttng_ust_fixup_tls(); + lttng_ust_alloc_tls(); /* * If version mismatch, don't register, but don't trigger assert @@ -203,7 +210,7 @@ end: void lttng_ust_probe_unregister(struct lttng_ust_registered_probe *reg_probe) { - lttng_ust_fixup_tls(); + lttng_ust_alloc_tls(); if (!reg_probe) return; @@ -260,7 +267,7 @@ int lttng_probes_get_event_list(struct lttng_ust_tracepoint_list *list) cds_list_add(&list_entry->head, &list->head); lttng_ust_format_event_name(event_desc, list_entry->tp.name); if (!event_desc->loglevel) { - list_entry->tp.loglevel = TRACE_DEFAULT; + list_entry->tp.loglevel = LTTNG_UST_TRACEPOINT_LOGLEVEL_DEFAULT; } else { list_entry->tp.loglevel = *(*event_desc->loglevel); } @@ -327,7 +334,7 @@ int lttng_probes_get_field_list(struct lttng_ust_field_list *list) probe_desc->event_desc[i]; int j; - if (event_desc->nr_fields == 0) { + if (event_desc->tp_class->nr_fields == 0) { /* Events without fields. */ struct tp_field_list_entry *list_entry; @@ -342,16 +349,16 @@ int lttng_probes_get_field_list(struct lttng_ust_field_list *list) list_entry->field.field_name[0] = '\0'; list_entry->field.type = LTTNG_UST_ABI_FIELD_OTHER; if (!event_desc->loglevel) { - list_entry->field.loglevel = TRACE_DEFAULT; + list_entry->field.loglevel = LTTNG_UST_TRACEPOINT_LOGLEVEL_DEFAULT; } else { list_entry->field.loglevel = *(*event_desc->loglevel); } list_entry->field.nowrite = 1; } - for (j = 0; j < event_desc->nr_fields; j++) { + for (j = 0; j < event_desc->tp_class->nr_fields; j++) { const struct lttng_ust_event_field *event_field = - event_desc->fields[j]; + event_desc->tp_class->fields[j]; struct tp_field_list_entry *list_entry; /* Skip event if name is too long. */ @@ -395,7 +402,7 @@ int lttng_probes_get_field_list(struct lttng_ust_field_list *list) list_entry->field.type = LTTNG_UST_ABI_FIELD_OTHER; } if (!event_desc->loglevel) { - list_entry->field.loglevel = TRACE_DEFAULT; + list_entry->field.loglevel = LTTNG_UST_TRACEPOINT_LOGLEVEL_DEFAULT; } else { list_entry->field.loglevel = *(*event_desc->loglevel); }