By writing to the file /proc/lttng, 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 event uses sequence for space efficiency and to store any
data as payload.

Signed-off-by: Francis Giraldeau <[email protected]>
---
 instrumentation/events/lttng-module/lttng.h |   21 +++++++++++++++++++++
 lttng-abi.c                                 |   20 ++++++++++++++++++++
 lttng-abi.h                                 |    1 +
 3 files changed, 42 insertions(+)

diff --git a/instrumentation/events/lttng-module/lttng.h 
b/instrumentation/events/lttng-module/lttng.h
index 6f3d6d1..cc36a8b 100644
--- a/instrumentation/events/lttng-module/lttng.h
+++ b/instrumentation/events/lttng-module/lttng.h
@@ -28,6 +28,27 @@ TRACE_EVENT(lttng_metadata,
        TP_printk("")
 )
 
+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 /*  _TRACE_LTTNG_H */
 
 /* This part must be outside protection */
diff --git a/lttng-abi.c b/lttng-abi.c
index 26a02ed..fa29e53 100644
--- a/lttng-abi.c
+++ b/lttng-abi.c
@@ -50,6 +50,10 @@
 #include "lttng-events.h"
 #include "lttng-tracer.h"
 
+/* include our own uevent tracepoint */
+#include "instrumentation/events/lttng-module/lttng.h"
+DEFINE_TRACE(lttng_uevent);
+
 /*
  * This is LTTng's own personal way to create a system call as an external
  * module. We use ioctl() on /proc/lttng.
@@ -252,9 +256,25 @@ long lttng_ioctl(struct file *file, unsigned int cmd, 
unsigned long arg)
        }
 }
 
+/*
+ * lttng_write_uevent - expose kernel tracer to user-space
+ */
+
+static
+ssize_t lttng_write_uevent(struct file *file, const char __user *user_buf,
+                   size_t count, loff_t *fpos)
+{
+       if (count > LTTNG_UEVENT_SIZE)
+               count = LTTNG_UEVENT_SIZE;
+
+       trace_lttng_uevent(user_buf, count);
+       return count;
+}
+
 static const struct file_operations lttng_fops = {
        .owner = THIS_MODULE,
        .unlocked_ioctl = lttng_ioctl,
+       .write = lttng_write_uevent,
 #ifdef CONFIG_COMPAT
        .compat_ioctl = lttng_ioctl,
 #endif
diff --git a/lttng-abi.h b/lttng-abi.h
index dc230d8..f99b037 100644
--- a/lttng-abi.h
+++ b/lttng-abi.h
@@ -26,6 +26,7 @@
 #include <linux/fs.h>
 
 #define LTTNG_KERNEL_SYM_NAME_LEN      256
+#define LTTNG_UEVENT_SIZE              1024
 
 enum lttng_kernel_instrumentation {
        LTTNG_KERNEL_TRACEPOINT = 0,
-- 
1.7.9.5


_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to