blob: df4a74efd50cf02db2166e83be7d45abcbfb0dd1 [file] [log] [blame]
Peter Zijlstraac199db2009-03-19 20:26:15 +01001/*
2 * trace event based perf counter profiling
3 *
4 * Copyright (C) 2009 Red Hat Inc, Peter Zijlstra <pzijlstr@redhat.com>
5 *
6 */
7
Li Zefan558e6542009-08-24 12:19:47 +08008#include <linux/module.h>
Peter Zijlstraac199db2009-03-19 20:26:15 +01009#include "trace.h"
10
Frederic Weisbeckere5e25cf2009-09-18 00:54:43 +020011static int ftrace_profile_enable_event(struct ftrace_event_call *event)
12{
13 if (atomic_inc_return(&event->profile_count))
14 return 0;
15
16 return event->profile_enable();
17}
18
Peter Zijlstraac199db2009-03-19 20:26:15 +010019int ftrace_profile_enable(int event_id)
20{
21 struct ftrace_event_call *event;
Li Zefan20c89282009-05-06 10:33:45 +080022 int ret = -EINVAL;
Peter Zijlstraac199db2009-03-19 20:26:15 +010023
Li Zefan20c89282009-05-06 10:33:45 +080024 mutex_lock(&event_mutex);
Steven Rostedta59fd602009-04-10 13:52:20 -040025 list_for_each_entry(event, &ftrace_events, list) {
Li Zefan558e6542009-08-24 12:19:47 +080026 if (event->id == event_id && event->profile_enable &&
27 try_module_get(event->mod)) {
Frederic Weisbeckere5e25cf2009-09-18 00:54:43 +020028 ret = ftrace_profile_enable_event(event);
Li Zefan20c89282009-05-06 10:33:45 +080029 break;
30 }
Peter Zijlstraac199db2009-03-19 20:26:15 +010031 }
Li Zefan20c89282009-05-06 10:33:45 +080032 mutex_unlock(&event_mutex);
Peter Zijlstraac199db2009-03-19 20:26:15 +010033
Li Zefan20c89282009-05-06 10:33:45 +080034 return ret;
Peter Zijlstraac199db2009-03-19 20:26:15 +010035}
36
Frederic Weisbeckere5e25cf2009-09-18 00:54:43 +020037static void ftrace_profile_disable_event(struct ftrace_event_call *event)
38{
39 if (!atomic_add_negative(-1, &event->profile_count))
40 return;
41
42 event->profile_disable();
43}
44
Peter Zijlstraac199db2009-03-19 20:26:15 +010045void ftrace_profile_disable(int event_id)
46{
47 struct ftrace_event_call *event;
48
Li Zefan20c89282009-05-06 10:33:45 +080049 mutex_lock(&event_mutex);
Steven Rostedta59fd602009-04-10 13:52:20 -040050 list_for_each_entry(event, &ftrace_events, list) {
Li Zefan20c89282009-05-06 10:33:45 +080051 if (event->id == event_id) {
Frederic Weisbeckere5e25cf2009-09-18 00:54:43 +020052 ftrace_profile_disable_event(event);
Li Zefan558e6542009-08-24 12:19:47 +080053 module_put(event->mod);
Li Zefan20c89282009-05-06 10:33:45 +080054 break;
55 }
Peter Zijlstraac199db2009-03-19 20:26:15 +010056 }
Li Zefan20c89282009-05-06 10:33:45 +080057 mutex_unlock(&event_mutex);
Peter Zijlstraac199db2009-03-19 20:26:15 +010058}