int ret;
 
        /* perf_sample_data doesn't have callchain, use bpf_get_stackid */
-       if (!(event->attr.sample_type & __PERF_SAMPLE_CALLCHAIN_EARLY))
+       if (!(event->attr.sample_type & PERF_SAMPLE_CALLCHAIN))
                return bpf_get_stackid((unsigned long)(ctx->regs),
                                       (unsigned long) map, flags, 0, 0);
 
        int err = -EINVAL;
        __u64 nr_kernel;
 
-       if (!(event->attr.sample_type & __PERF_SAMPLE_CALLCHAIN_EARLY))
+       if (!(event->attr.sample_type & PERF_SAMPLE_CALLCHAIN))
                return __bpf_get_stack(regs, NULL, NULL, buf, size, flags);
 
        if (unlikely(flags & ~(BPF_F_SKIP_FIELD_MASK | BPF_F_USER_STACK |
 
                goto out;
        rcu_read_lock();
        prog = READ_ONCE(event->prog);
-       if (prog)
+       if (prog) {
+               if (prog->call_get_stack &&
+                   (event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) &&
+                   !(data->sample_flags & PERF_SAMPLE_CALLCHAIN)) {
+                       data->callchain = perf_callchain(event, regs);
+                       data->sample_flags |= PERF_SAMPLE_CALLCHAIN;
+               }
+
                ret = bpf_prog_run(prog, &ctx);
+       }
        rcu_read_unlock();
 out:
        __this_cpu_dec(bpf_prog_active);
 
        if (event->attr.precise_ip &&
            prog->call_get_stack &&
-           (!(event->attr.sample_type & __PERF_SAMPLE_CALLCHAIN_EARLY) ||
+           (!(event->attr.sample_type & PERF_SAMPLE_CALLCHAIN) ||
             event->attr.exclude_callchain_kernel ||
             event->attr.exclude_callchain_user)) {
                /*