mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-01 00:58:39 +02:00 
			
		
		
		
	tracing/boot Add kprobe event support
Add kprobe event support on event node to boot-time tracing.
If the group name of event is "kprobes", the boot-time tracing
defines new probe event according to "probes" values.
 - ftrace.event.kprobes.EVENT.probes = PROBE[, PROBE2...]
   Defines new kprobe event based on PROBEs. It is able to define
   multiple probes on one event, but those must have same type of
   arguments.
For example,
 ftrace.events.kprobes.myevent {
	probes = "vfs_read $arg1 $arg2";
	enable;
 }
This will add kprobes:myevent on vfs_read with the 1st and the 2nd
arguments.
Link: http://lkml.kernel.org/r/157867240104.17873.9712052065426433111.stgit@devnote2
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
			
			
This commit is contained in:
		
							parent
							
								
									81a59555ff
								
							
						
					
					
						commit
						4d655281eb
					
				
					 2 changed files with 51 additions and 0 deletions
				
			
		|  | @ -76,6 +76,48 @@ trace_boot_enable_events(struct trace_array *tr, struct xbc_node *node) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_KPROBE_EVENTS | ||||
| extern int trace_kprobe_run_command(const char *command); | ||||
| 
 | ||||
| static int __init | ||||
| trace_boot_add_kprobe_event(struct xbc_node *node, const char *event) | ||||
| { | ||||
| 	struct xbc_node *anode; | ||||
| 	char buf[MAX_BUF_LEN]; | ||||
| 	const char *val; | ||||
| 	char *p; | ||||
| 	int len; | ||||
| 
 | ||||
| 	len = snprintf(buf, ARRAY_SIZE(buf) - 1, "p:kprobes/%s ", event); | ||||
| 	if (len >= ARRAY_SIZE(buf)) { | ||||
| 		pr_err("Event name is too long: %s\n", event); | ||||
| 		return -E2BIG; | ||||
| 	} | ||||
| 	p = buf + len; | ||||
| 	len = ARRAY_SIZE(buf) - len; | ||||
| 
 | ||||
| 	xbc_node_for_each_array_value(node, "probes", anode, val) { | ||||
| 		if (strlcpy(p, val, len) >= len) { | ||||
| 			pr_err("Probe definition is too long: %s\n", val); | ||||
| 			return -E2BIG; | ||||
| 		} | ||||
| 		if (trace_kprobe_run_command(buf) < 0) { | ||||
| 			pr_err("Failed to add probe: %s\n", buf); | ||||
| 			return -EINVAL; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| #else | ||||
| static inline int __init | ||||
| trace_boot_add_kprobe_event(struct xbc_node *node, const char *event) | ||||
| { | ||||
| 	pr_err("Kprobe event is not supported.\n"); | ||||
| 	return -ENOTSUPP; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static void __init | ||||
| trace_boot_init_one_event(struct trace_array *tr, struct xbc_node *gnode, | ||||
| 			  struct xbc_node *enode) | ||||
|  | @ -88,6 +130,10 @@ trace_boot_init_one_event(struct trace_array *tr, struct xbc_node *gnode, | |||
| 	group = xbc_node_get_data(gnode); | ||||
| 	event = xbc_node_get_data(enode); | ||||
| 
 | ||||
| 	if (!strcmp(group, "kprobes")) | ||||
| 		if (trace_boot_add_kprobe_event(enode, event) < 0) | ||||
| 			return; | ||||
| 
 | ||||
| 	mutex_lock(&event_mutex); | ||||
| 	file = find_event_file(tr, group, event); | ||||
| 	if (!file) { | ||||
|  |  | |||
|  | @ -902,6 +902,11 @@ static int create_or_delete_trace_kprobe(int argc, char **argv) | |||
| 	return ret == -ECANCELED ? -EINVAL : ret; | ||||
| } | ||||
| 
 | ||||
| int trace_kprobe_run_command(const char *command) | ||||
| { | ||||
| 	return trace_run_command(command, create_or_delete_trace_kprobe); | ||||
| } | ||||
| 
 | ||||
| static int trace_kprobe_release(struct dyn_event *ev) | ||||
| { | ||||
| 	struct trace_kprobe *tk = to_trace_kprobe(ev); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Masami Hiramatsu
						Masami Hiramatsu