12 #include <linux/perf_event.h>
13 #include <linux/slab.h>
37 static void release_callchain_buffers_rcu(
struct rcu_head *
head)
39 struct callchain_cpus_entries *
entries;
50 static
void release_callchain_buffers(
void)
52 struct callchain_cpus_entries *
entries;
54 entries = callchain_cpus_entries;
59 static int alloc_callchain_buffers(
void)
63 struct callchain_cpus_entries *
entries;
91 kfree(entries->cpu_entries[cpu]);
112 if (!callchain_cpus_entries)
117 err = alloc_callchain_buffers();
127 release_callchain_buffers();
135 struct callchain_cpus_entries *
entries;
137 *rctx = get_recursion_context(
__get_cpu_var(callchain_recursion));
151 put_callchain_entry(
int rctx)
153 put_recursion_context(
__get_cpu_var(callchain_recursion), rctx);
162 int kernel = !
event->attr.exclude_callchain_kernel;
163 int user = !
event->attr.exclude_callchain_user;
165 if (!kernel && !user)
168 entry = get_callchain_entry(&rctx);
194 if (event->ctx->task && event->ctx->task !=
current)
203 put_callchain_entry(rctx);