{
struct lttng_probe_desc *iter;
struct cds_list_head *probe_list;
- int i;
/*
* Each provider enforce that every event name begins with the
desc_added:
DBG("just registered probe %s containing %u events",
desc->provider, desc->nr_events);
- /*
- * fix the events awaiting probe load.
- */
- for (i = 0; i < desc->nr_events; i++) {
- const struct lttng_event_desc *ed;
- int ret;
-
- ed = desc->event_desc[i];
- DBG("Registered event probe \"%s\" with signature \"%s\"",
- ed->name, ed->signature);
- ret = lttng_fix_pending_event_desc(ed);
- assert(!ret);
- }
}
/*
void fixup_lazy_probes(void)
{
struct lttng_probe_desc *iter, *tmp;
+ int ret;
lazy_nesting++;
cds_list_for_each_entry_safe(iter, tmp,
iter->lazy = 0;
cds_list_del(&iter->lazy_init_head);
}
+ ret = lttng_fix_pending_events();
+ assert(!ret);
lazy_nesting--;
}
return NULL;
}
+static
+int check_provider_version(struct lttng_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, 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, desc->major, desc->minor,
+ LTTNG_UST_PROVIDER_MAJOR,
+ LTTNG_UST_PROVIDER_MINOR);
+ return 0; /* reject */
+ }
+}
+
+
int lttng_probe_register(struct lttng_probe_desc *desc)
{
int ret = 0;
- ust_lock();
+ /*
+ * If version mismatch, don't register, but don't trigger assert
+ * on caller. The version check just prints an error.
+ */
+ if (!check_provider_version(desc))
+ return 0;
+
+ ust_lock_nocheck();
/*
* Check if the provider has already been registered.
void lttng_probe_unregister(struct lttng_probe_desc *desc)
{
- ust_lock();
+ if (!check_provider_version(desc))
+ return;
+
+ ust_lock_nocheck();
if (!desc->lazy)
cds_list_del(&desc->head);
else