extern int unwind_frame(struct stackframe *frame);
 extern void walk_stackframe(struct stackframe *frame,
-                           int (*fn)(struct stackframe *, void *), void *data);
+                           bool (*fn)(void *, unsigned long), void *data);
 extern void dump_mem(const char *lvl, const char *str, unsigned long bottom,
                     unsigned long top);
 extern void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk,
 
  * whist unwinding the stackframe and is like a subroutine return so we use
  * the PC.
  */
-static int
-callchain_trace(struct stackframe *fr,
-               void *data)
+static bool
+callchain_trace(void *data, unsigned long pc)
 {
        struct perf_callchain_entry_ctx *entry = data;
-       perf_callchain_store(entry, fr->pc);
-       return 0;
+       perf_callchain_store(entry, pc);
+       return true;
 }
 
 void
 
        void *addr;
 };
 
-static int save_return_addr(struct stackframe *frame, void *d)
+static bool save_return_addr(void *d, unsigned long pc)
 {
        struct return_address_data *data = d;
 
        if (!data->level) {
-               data->addr = (void *)frame->pc;
+               data->addr = (void *)pc;
 
-               return 1;
+               return false;
        } else {
                --data->level;
-               return 0;
+               return true;
        }
 }
 
 
 #endif
 
 void notrace walk_stackframe(struct stackframe *frame,
-                    int (*fn)(struct stackframe *, void *), void *data)
+                    bool (*fn)(void *, unsigned long), void *data)
 {
        while (1) {
                int ret;
 
-               if (fn(frame, data))
+               if (!fn(data, frame->pc))
                        break;
                ret = unwind_frame(frame);
                if (ret < 0)
        unsigned int skip;
 };
 
-static int save_trace(struct stackframe *frame, void *d)
+static bool save_trace(void *d, unsigned long addr)
 {
        struct stack_trace_data *data = d;
        struct stack_trace *trace = data->trace;
-       unsigned long addr = frame->pc;
 
        if (data->no_sched_functions && in_sched_functions(addr))
-               return 0;
+               return true;
        if (data->skip) {
                data->skip--;
-               return 0;
+               return true;
        }
 
        trace->entries[trace->nr_entries++] = addr;
-       return trace->nr_entries >= trace->max_entries;
+       return trace->nr_entries < trace->max_entries;
 }
 
 /* This must be noinline to so that our skip calculation works correctly */