6 * Copyright (C) 2008-2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; only
11 * version 2.1 of the License.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include <linux/module.h>
24 #include <linux/tracepoint.h>
25 #include <linux/uaccess.h>
26 #include <linux/gfp.h>
28 #include <linux/proc_fs.h>
29 #include <linux/slab.h>
31 #include <linux/miscdevice.h>
32 #include <wrapper/vmalloc.h>
33 #include <lttng-events.h>
35 #define TP_MODULE_NOAUTOLOAD
36 #define LTTNG_PACKAGE_BUILD
37 #define CREATE_TRACE_POINTS
38 #define TRACE_INCLUDE_PATH instrumentation/events/lttng-module
39 #define TRACE_INCLUDE_FILE lttng
40 #define LTTNG_INSTRUMENTATION
42 #include <instrumentation/events/lttng-module/lttng.h>
44 /* Events written through logger are truncated at 1024 bytes */
45 #define LTTNG_LOGGER_COUNT_MAX 1024
46 #define LTTNG_LOGGER_FILE "lttng-logger"
48 DEFINE_TRACE(lttng_logger
);
50 static struct proc_dir_entry
*lttng_logger_dentry
;
53 * lttng_logger_write - write a userspace string into the trace system
55 * @user_buf: user string
56 * @count: length to copy
57 * @ppos: file position
59 * Copy a userspace string into a trace event named "lttng:logger".
60 * Copies at most @count bytes into the event "msg" dynamic array.
61 * Truncates the count at LTTNG_LOGGER_COUNT_MAX. Returns the number of
62 * bytes copied from the source.
63 * Return -1 on error, with EFAULT errno.
66 ssize_t
lttng_logger_write(struct file
*file
, const char __user
*user_buf
,
67 size_t count
, loff_t
*ppos
)
70 unsigned long uaddr
= (unsigned long) user_buf
;
71 struct page
*pages
[2];
76 if (unlikely(count
> LTTNG_LOGGER_COUNT_MAX
))
77 count
= LTTNG_LOGGER_COUNT_MAX
;
79 /* How many pages are we dealing with ? */
80 if (unlikely((uaddr
& PAGE_MASK
) != ((uaddr
+ count
) & PAGE_MASK
)))
83 /* Pin userspace pages */
84 ret
= get_user_pages_fast(uaddr
, nr_pages
, 0, pages
);
85 if (unlikely(ret
< nr_pages
)) {
95 trace_lttng_logger(user_buf
, count
);
99 for (i
= 0; i
< nr_pages
; i
++)
105 static const struct file_operations lttng_logger_operations
= {
106 .write
= lttng_logger_write
,
109 static struct miscdevice logger_dev
= {
110 .minor
= MISC_DYNAMIC_MINOR
,
111 .name
= "lttng-logger",
113 .fops
= <tng_logger_operations
116 int __init
lttng_logger_init(void)
120 wrapper_vmalloc_sync_all();
122 /* /dev/lttng-logger */
123 ret
= misc_register(&logger_dev
);
125 printk(KERN_ERR
"Error creating LTTng logger device\n");
129 /* /proc/lttng-logger */
130 lttng_logger_dentry
= proc_create_data(LTTNG_LOGGER_FILE
,
131 S_IRUGO
| S_IWUGO
, NULL
,
132 <tng_logger_operations
, NULL
);
133 if (!lttng_logger_dentry
) {
134 printk(KERN_ERR
"Error creating LTTng logger proc file\n");
140 ret
= __lttng_events_init__lttng();
146 remove_proc_entry("lttng-logger", NULL
);
148 misc_deregister(&logger_dev
);
153 void lttng_logger_exit(void)
155 __lttng_events_exit__lttng();
156 if (lttng_logger_dentry
)
157 remove_proc_entry("lttng-logger", NULL
);
158 misc_deregister(&logger_dev
);