extern struct perf_callchain_entry *perf_callchain(struct perf_event *event, struct pt_regs *regs);
 extern int get_callchain_buffers(int max_stack);
 extern void put_callchain_buffers(void);
+extern struct perf_callchain_entry *get_callchain_entry(int *rctx);
+extern void put_callchain_entry(int rctx);
 
 extern int sysctl_perf_event_max_stack;
 extern int sysctl_perf_event_max_contexts_per_stack;
 
        }
 }
 
-static struct perf_callchain_entry *get_callchain_entry(int *rctx)
+struct perf_callchain_entry *get_callchain_entry(int *rctx)
 {
        int cpu;
        struct callchain_cpus_entries *entries;
                return NULL;
 
        entries = rcu_dereference(callchain_cpus_entries);
-       if (!entries)
+       if (!entries) {
+               put_recursion_context(this_cpu_ptr(callchain_recursion), *rctx);
                return NULL;
+       }
 
        cpu = smp_processor_id();
 
                (*rctx * perf_callchain_entry__sizeof()));
 }
 
-static void
+void
 put_callchain_entry(int rctx)
 {
        put_recursion_context(this_cpu_ptr(callchain_recursion), rctx);
        int rctx;
 
        entry = get_callchain_entry(&rctx);
-       if (rctx == -1)
-               return NULL;
-
        if (!entry)
-               goto exit_put;
+               return NULL;
 
        ctx.entry     = entry;
        ctx.max_stack = max_stack;