-/*
+/* SPDX-License-Identifier: (GPL-2.0 or LGPL-2.1)
+ *
* lttng-events.c
*
* Holds LTTng per-session event registry.
*
* Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; only
- * version 2.1 of the License.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
break;
case LTTNG_KERNEL_KPROBE:
case LTTNG_KERNEL_FUNCTION:
+ case LTTNG_KERNEL_UPROBE:
case LTTNG_KERNEL_NOOP:
WRITE_ONCE(event->enabled, 1);
break;
break;
case LTTNG_KERNEL_KPROBE:
case LTTNG_KERNEL_FUNCTION:
+ case LTTNG_KERNEL_UPROBE:
case LTTNG_KERNEL_NOOP:
WRITE_ONCE(event->enabled, 0);
break;
event_name = event_desc->name;
break;
case LTTNG_KERNEL_KPROBE:
+ case LTTNG_KERNEL_UPROBE:
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
goto register_error;
}
break;
+ case LTTNG_KERNEL_UPROBE:
+ /*
+ * Needs to be explicitly enabled after creation, since
+ * we may want to apply filters.
+ */
+ event->enabled = 0;
+ event->registered = 1;
+ /*
+ * Populate lttng_event structure before event
+ * registration.
+ */
+ smp_wmb();
+
+ ret = lttng_uprobes_register(event_param->name,
+ event_param->u.uprobe.fd,
+ event_param->u.uprobe.offset,
+ event);
+ if (ret)
+ goto register_error;
+ ret = try_module_get(event->desc->owner);
+ WARN_ON_ONCE(!ret);
+ break;
default:
WARN_ON_ONCE(1);
ret = -EINVAL;
desc->name);
break;
case LTTNG_KERNEL_KPROBE:
+ case LTTNG_KERNEL_UPROBE:
case LTTNG_KERNEL_KRETPROBE:
case LTTNG_KERNEL_FUNCTION:
case LTTNG_KERNEL_NOOP:
case LTTNG_KERNEL_NOOP:
ret = 0;
break;
+ case LTTNG_KERNEL_UPROBE:
+ lttng_uprobes_unregister(event);
+ ret = 0;
+ break;
default:
WARN_ON_ONCE(1);
}
case LTTNG_KERNEL_NOOP:
case LTTNG_KERNEL_SYSCALL:
break;
+ case LTTNG_KERNEL_UPROBE:
+ module_put(event->desc->owner);
+ lttng_uprobes_destroy_private(event);
+ break;
default:
WARN_ON_ONCE(1);
}
ret = _lttng_enum_statedump(session, field, nesting);
break;
case atype_array:
+ case atype_array_bitfield:
{
const struct lttng_basic_type *elem_type;
break;
}
case atype_sequence:
+ case atype_sequence_bitfield:
{
const struct lttng_basic_type *elem_type;
const struct lttng_basic_type *length_type;
ret = lttng_init_cpu_hotplug();
if (ret)
goto error_hotplug;
- printk(KERN_NOTICE "LTTng: Loaded modules v%s.%s.%s%s (%s)\n",
+ printk(KERN_NOTICE "LTTng: Loaded modules v%s.%s.%s%s (%s)%s%s\n",
__stringify(LTTNG_MODULES_MAJOR_VERSION),
__stringify(LTTNG_MODULES_MINOR_VERSION),
__stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
LTTNG_MODULES_EXTRAVERSION,
- LTTNG_VERSION_NAME);
+ LTTNG_VERSION_NAME,
+#ifdef LTTNG_EXTRA_VERSION_GIT
+ LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
+#else
+ "",
+#endif
+#ifdef LTTNG_EXTRA_VERSION_NAME
+ LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
+#else
+ "");
+#endif
return 0;
error_hotplug:
lttng_tracepoint_exit();
error_tp:
lttng_context_exit();
- printk(KERN_NOTICE "LTTng: Failed to load modules v%s.%s.%s%s (%s)\n",
+ printk(KERN_NOTICE "LTTng: Failed to load modules v%s.%s.%s%s (%s)%s%s\n",
__stringify(LTTNG_MODULES_MAJOR_VERSION),
__stringify(LTTNG_MODULES_MINOR_VERSION),
__stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
LTTNG_MODULES_EXTRAVERSION,
- LTTNG_VERSION_NAME);
+ LTTNG_VERSION_NAME,
+#ifdef LTTNG_EXTRA_VERSION_GIT
+ LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
+#else
+ "",
+#endif
+#ifdef LTTNG_EXTRA_VERSION_NAME
+ LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
+#else
+ "");
+#endif
return ret;
}
kmem_cache_destroy(event_cache);
lttng_tracepoint_exit();
lttng_context_exit();
- printk(KERN_NOTICE "LTTng: Unloaded modules v%s.%s.%s%s (%s)\n",
+ printk(KERN_NOTICE "LTTng: Unloaded modules v%s.%s.%s%s (%s)%s%s\n",
__stringify(LTTNG_MODULES_MAJOR_VERSION),
__stringify(LTTNG_MODULES_MINOR_VERSION),
__stringify(LTTNG_MODULES_PATCHLEVEL_VERSION),
LTTNG_MODULES_EXTRAVERSION,
- LTTNG_VERSION_NAME);
+ LTTNG_VERSION_NAME,
+#ifdef LTTNG_EXTRA_VERSION_GIT
+ LTTNG_EXTRA_VERSION_GIT[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_GIT,
+#else
+ "",
+#endif
+#ifdef LTTNG_EXTRA_VERSION_NAME
+ LTTNG_EXTRA_VERSION_NAME[0] == '\0' ? "" : " - " LTTNG_EXTRA_VERSION_NAME);
+#else
+ "");
+#endif
}
module_exit(lttng_events_exit);
+#include "extra_version/patches.i"
+#ifdef LTTNG_EXTRA_VERSION_GIT
+MODULE_INFO(extra_version_git, LTTNG_EXTRA_VERSION_GIT);
+#endif
+#ifdef LTTNG_EXTRA_VERSION_NAME
+MODULE_INFO(extra_version_name, LTTNG_EXTRA_VERSION_NAME);
+#endif
MODULE_LICENSE("GPL and additional rights");
MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
-MODULE_DESCRIPTION("LTTng Events");
+MODULE_DESCRIPTION("LTTng tracer");
MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
__stringify(LTTNG_MODULES_MINOR_VERSION) "."
__stringify(LTTNG_MODULES_PATCHLEVEL_VERSION)