[lttng-dev] [PATCH] Expose kernel tracer to user-space (version 6)

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Jul 2 18:23:40 EDT 2012


* Francis Giraldeau (francis.giraldeau at gmail.com) wrote:
> By writing to the file /proc/lttng_uevent, a user-space application creates a
> kernel event. The event's payload is by default UTF-8 text, but any data can be
> written, up to 1024 bytes. Null-character is optional and is not enforced.

The 1024 byte limit is removed now, right ?

> The
> event uses sequence for space efficiency and to store any data as payload.
> 
> The feature is enabled when the module lttng-uevent is loaded. The module can
> be removed if no tracing sessions with lttng_uevent enabled is active.
> 
> Signed-off-by: Francis Giraldeau <francis.giraldeau at gmail.com>
> ---
>  instrumentation/events/lttng-module/uevent.h |   33 +++++++++
>  probes/Makefile                              |    1 +
>  probes/lttng-uevent.c                        |   97 ++++++++++++++++++++++++++
>  3 files changed, 131 insertions(+)
>  create mode 100644 instrumentation/events/lttng-module/uevent.h
>  create mode 100644 probes/lttng-uevent.c
> 
> diff --git a/instrumentation/events/lttng-module/uevent.h b/instrumentation/events/lttng-module/uevent.h
> new file mode 100644
> index 0000000..f67d901
> --- /dev/null
> +++ b/instrumentation/events/lttng-module/uevent.h
> @@ -0,0 +1,33 @@
> +#undef TRACE_SYSTEM
> +#define TRACE_SYSTEM uevent
> +
> +#if !defined(UEVENT_H_) || defined(TRACE_HEADER_MULTI_READ)
> +#define UEVENT_H_
> +
> +#include <linux/tracepoint.h>
> +
> +TRACE_EVENT(lttng_uevent,
> +
> +	TP_PROTO(const char *str, size_t len),
> +
> +	TP_ARGS(str, len),
> +
> +	/*
> +	 * Uses sequence to hold variable size data, by default considered
> +	 * as text. Null-terminal character is optional and is not enforced.
> +	 */
> +	TP_STRUCT__entry(
> +		__dynamic_array_text(char, text, len)
> +	),
> +
> +	TP_fast_assign(
> +		tp_memcpy_dyn_from_user(text, str)
> +	),
> +
> +	TP_printk("")
> +)
> +
> +#endif /* UEVENT_H_ */
> +
> +/* This part must be outside protection */
> +#include "../../../probes/define_trace.h"
> diff --git a/probes/Makefile b/probes/Makefile
> index 698a9c9..3003535 100644
> --- a/probes/Makefile
> +++ b/probes/Makefile
> @@ -14,6 +14,7 @@ obj-m += lttng-probe-sched.o
>  obj-m += lttng-probe-irq.o
>  obj-m += lttng-probe-signal.o
>  obj-m += lttng-probe-timer.o
> +obj-m += lttng-uevent.o
>  
>  obj-m += lttng-probe-statedump.o
>  
> diff --git a/probes/lttng-uevent.c b/probes/lttng-uevent.c
> new file mode 100644
> index 0000000..96fb233
> --- /dev/null
> +++ b/probes/lttng-uevent.c
> @@ -0,0 +1,97 @@
> +/*
> + * probes/lttng-uevent.c
> + *
> + * Expose kernel tracer to user-space through /proc/lttng
> + *
> + * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>

you might want to add your own copyright in here too.

the rest looks good. I look forward to see the updated version.

Thanks,

Mathieu

> + *
> + * 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
> + */
> +
> +#include <linux/module.h>
> +#include <linux/proc_fs.h>
> +
> +/*
> + * Create lttng_uevent tracepoint probes.
> + */
> +
> +#define TP_MODULE_NOAUTOLOAD
> +#define LTTNG_PACKAGE_BUILD
> +#define CREATE_TRACE_POINTS
> +#define TRACE_INCLUDE_PATH ../instrumentation/events/lttng-module
> +#include "../instrumentation/events/lttng-module/uevent.h"
> +
> +#define LTTNG_UEVENT_FILE "lttng_uevent"
> +
> +/**
> + * lttng_uevent_write - write user-space data into kernel trace
> + * @file: file pointer
> + * @user_buf: user string
> + * @count: length to copy
> + * @ppos: unused
> + *
> + * Copy count bytes into a trace event "lttng_uevent".
> + *
> + * Returns the number of bytes copied from the source.
> + * Notice that there is no guarantee that the event is
> + * actually written in a trace. This can occur in 3
> + * situations:
> + *
> + *   * Buffer overrun
> + *   * No trace session are active
> + *   * The data size is greater than a sub-buffer
> + */
> +
> +ssize_t lttng_uevent_write(struct file *file, const char __user *ubuf,
> +		size_t count, loff_t *fpos)
> +{
> +	trace_lttng_uevent(ubuf, count);
> +	return count;
> +}
> +
> +static const struct file_operations uev_ops = {
> +	.owner = THIS_MODULE,
> +	.write = lttng_uevent_write
> +};
> +
> +static int __init lttng_uevent_init(void)
> +{
> +	struct proc_dir_entry *uev_file;
> +
> +	uev_file = create_proc_entry(LTTNG_UEVENT_FILE, 0444, NULL);
> +	if (!uev_file)
> +		return -ENOENT;
> +	uev_file->proc_fops = &uev_ops;
> +	uev_file->mode = S_IFREG | S_IWUGO;
> +	uev_file->uid = 0;
> +	uev_file->gid = 0;
> +	/* register manually the probe */
> +	__lttng_events_init__uevent();
> +	return 0;
> +}
> +
> +static void __exit lttng_uevent_exit(void)
> +{
> +	/* unregister manually the probe */
> +	__lttng_events_exit__uevent();
> +	remove_proc_entry(LTTNG_UEVENT_FILE, NULL);
> +}
> +
> +module_init(lttng_uevent_init);
> +module_exit(lttng_uevent_exit);
> +
> +MODULE_LICENSE("GPL and additional rights");
> +MODULE_AUTHOR("Francis Giraldeau <francis.giraldeau at gmail.com>");
> +MODULE_DESCRIPTION("Append custom events to kernel trace from user-space");
> -- 
> 1.7.9.5
> 
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list