diff options
Diffstat (limited to 'kernel/trace')
| -rw-r--r-- | kernel/trace/blktrace.c | 2 | ||||
| -rw-r--r-- | kernel/trace/trace_event_perf.c | 19 | ||||
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_syscalls.c | 4 | 
4 files changed, 21 insertions, 8 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 36ea2b65dcd..638711c1750 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -842,6 +842,7 @@ static void blk_add_trace_split(void *ignore,  /**   * blk_add_trace_remap - Add a trace for a remap operation + * @ignore:	trace callback data parameter (not used)   * @q:		queue the io is for   * @bio:	the source bio   * @dev:	target device @@ -873,6 +874,7 @@ static void blk_add_trace_remap(void *ignore,  /**   * blk_add_trace_rq_remap - Add a trace for a request-remap operation + * @ignore:	trace callback data parameter (not used)   * @q:		queue the io is for   * @rq:		the source request   * @dev:	target device diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c index cb6f365016e..8a2b73f7c06 100644 --- a/kernel/trace/trace_event_perf.c +++ b/kernel/trace/trace_event_perf.c @@ -96,7 +96,9 @@ int perf_trace_init(struct perf_event *p_event)  	mutex_lock(&event_mutex);  	list_for_each_entry(tp_event, &ftrace_events, list) {  		if (tp_event->event.type == event_id && -		    tp_event->class && tp_event->class->perf_probe && +		    tp_event->class && +		    (tp_event->class->perf_probe || +		     tp_event->class->reg) &&  		    try_module_get(tp_event->mod)) {  			ret = perf_trace_event_init(tp_event, p_event);  			break; @@ -116,7 +118,7 @@ int perf_trace_enable(struct perf_event *p_event)  	if (WARN_ON_ONCE(!list))  		return -EINVAL; -	list = per_cpu_ptr(list, smp_processor_id()); +	list = this_cpu_ptr(list);  	hlist_add_head_rcu(&p_event->hlist_entry, list);  	return 0; @@ -132,8 +134,9 @@ void perf_trace_destroy(struct perf_event *p_event)  	struct ftrace_event_call *tp_event = p_event->tp_event;  	int i; +	mutex_lock(&event_mutex);  	if (--tp_event->perf_refcount > 0) -		return; +		goto out;  	if (tp_event->class->reg)  		tp_event->class->reg(tp_event, TRACE_REG_PERF_UNREGISTER); @@ -142,6 +145,12 @@ void perf_trace_destroy(struct perf_event *p_event)  					    tp_event->class->perf_probe,  					    tp_event); +	/* +	 * Ensure our callback won't be called anymore. See +	 * tracepoint_probe_unregister() and __DO_TRACE(). +	 */ +	synchronize_sched(); +  	free_percpu(tp_event->perf_events);  	tp_event->perf_events = NULL; @@ -151,6 +160,8 @@ void perf_trace_destroy(struct perf_event *p_event)  			perf_trace_buf[i] = NULL;  		}  	} +out: +	mutex_unlock(&event_mutex);  }  __kprobes void *perf_trace_buf_prepare(int size, unsigned short type, @@ -169,7 +180,7 @@ __kprobes void *perf_trace_buf_prepare(int size, unsigned short type,  	if (*rctxp < 0)  		return NULL; -	raw_data = per_cpu_ptr(perf_trace_buf[*rctxp], smp_processor_id()); +	raw_data = this_cpu_ptr(perf_trace_buf[*rctxp]);  	/* zero the dead bytes from align to not leak stack to user */  	memset(&raw_data[size - sizeof(u64)], 0, sizeof(u64)); diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index faf7cefd15d..f52b5f50299 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -1359,7 +1359,7 @@ static __kprobes void kprobe_perf_func(struct kprobe *kp,  	for (i = 0; i < tp->nr_args; i++)  		call_fetch(&tp->args[i].fetch, regs, data + tp->args[i].offset); -	head = per_cpu_ptr(call->perf_events, smp_processor_id()); +	head = this_cpu_ptr(call->perf_events);  	perf_trace_buf_submit(entry, size, rctx, entry->ip, 1, regs, head);  } @@ -1392,7 +1392,7 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri,  	for (i = 0; i < tp->nr_args; i++)  		call_fetch(&tp->args[i].fetch, regs, data + tp->args[i].offset); -	head = per_cpu_ptr(call->perf_events, smp_processor_id()); +	head = this_cpu_ptr(call->perf_events);  	perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, regs, head);  } diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index d2c859cec9e..34e35804304 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c @@ -519,7 +519,7 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id)  	syscall_get_arguments(current, regs, 0, sys_data->nb_args,  			       (unsigned long *)&rec->args); -	head = per_cpu_ptr(sys_data->enter_event->perf_events, smp_processor_id()); +	head = this_cpu_ptr(sys_data->enter_event->perf_events);  	perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head);  } @@ -595,7 +595,7 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret)  	rec->nr = syscall_nr;  	rec->ret = syscall_get_return_value(current, regs); -	head = per_cpu_ptr(sys_data->exit_event->perf_events, smp_processor_id()); +	head = this_cpu_ptr(sys_data->exit_event->perf_events);  	perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head);  }  |