lost some call trace for sleep function

From: yuzhoujian
Date: Thu Oct 26 2017 - 06:25:39 EST


Hi, all.
I find a strange problem. Perf cannot record call stack which contains sleep functions.
The last function of the call trace is always "__GI___libc_nanosleep" for each sample.
one of the sample for perf script is below:

test_sleep 12275 185233.961287: 1 cycles:ppp:
ffffffff8100add0 intel_bts_enable_local ([kernel.kallsyms])
ffffffff81008f20 intel_pmu_enable_all ([kernel.kallsyms])
ffffffff810057ec x86_pmu_enable ([kernel.kallsyms])
ffffffff81173e57 perf_pmu_enable ([kernel.kallsyms])
ffffffff81175404 __perf_event_task_sched_in ([kernel.kallsyms])
ffffffff810c1aa8 finish_task_switch ([kernel.kallsyms])
ffffffff81690e00 __schedule ([kernel.kallsyms])
ffffffff81691409 schedule ([kernel.kallsyms])
ffffffff816902d6 do_nanosleep ([kernel.kallsyms])
ffffffff810b747b hrtimer_nanosleep ([kernel.kallsyms])
ffffffff810b75be sys_nanosleep ([kernel.kallsyms])
ffffffff8169c749 system_call_fastpath ([kernel.kallsyms])
bf190 __GI___libc_nanosleep (/usr/lib64/libc-2.17.so)

Below is the source code of test_sleep:

void f2()
{
sleep(1);
}
void f1()
{
f2();
}
int main()
{
while(1)
f1();
return 0;
}

I think the right call stack should contain the __sleep function in glibc, just as follow

test_sleep 12275 185233.961287: 1 cycles:ppp:
ffffffff8100add0 intel_bts_enable_local ([kernel.kallsyms])
ffffffff81008f20 intel_pmu_enable_all ([kernel.kallsyms])
ffffffff810057ec x86_pmu_enable ([kernel.kallsyms])
ffffffff81173e57 perf_pmu_enable ([kernel.kallsyms])
ffffffff81175404 __perf_event_task_sched_in ([kernel.kallsyms])
ffffffff810c1aa8 finish_task_switch ([kernel.kallsyms])
ffffffff81690e00 __schedule ([kernel.kallsyms])
ffffffff81691409 schedule ([kernel.kallsyms])
ffffffff816902d6 do_nanosleep ([kernel.kallsyms])
ffffffff810b747b hrtimer_nanosleep ([kernel.kallsyms])
ffffffff810b75be sys_nanosleep ([kernel.kallsyms])
ffffffff8169c749 system_call_fastpath ([kernel.kallsyms])
bf190 __GI___libc_nanosleep (/usr/lib64/libc-2.17.so)
bef70 __sleep (/usr/lib64/libc-2.17.so)
5a1 f2 (/home/test_sleep)
5c1 f1 (/home/test_sleep)
5d1 main (/home/test_sleep)
21c05 __libc_start_main (/usr/lib64/libc-2.17.so)

Is it a bug for perf record ??