On Tue, Jun 30, 2020 at 3:48 PM Hao Luo haoluo@google.com wrote:
On Tue, Jun 30, 2020 at 1:37 PM Yonghong Song yhs@fb.com wrote:
On 6/30/20 11:49 AM, Hao Luo wrote:
The test_vmlinux test uses hrtimer_nanosleep as hook to test tracing programs. But it seems Clang may have done an aggressive optimization, causing fentry and kprobe to not hook on this function properly on a Clang build kernel.
Could you explain why it does not on clang built kernel? How did you build the kernel? Did you use [thin]lto?
hrtimer_nanosleep is a global function who is called in several different files. I am curious how clang optimization can make function disappear, or make its function signature change, or rename the function?
Yonghong,
We didn't enable LTO. It also puzzled me. But I can confirm those fentry/kprobe test failures via many different experiments I've done. After talking to my colleague on kernel compiling tools (Bill, cc'ed), we suspected this could be because of clang's aggressive inlining. We also noticed that all the callsites of hrtimer_nanosleep() are tail calls.
For a better explanation, I can reach out to the people who are more familiar to clang in the compiler team to see if they have any insights. This may not be of high priority for them though.
Hi Yonghong,
Clang is generally more aggressive at inlining than gcc. So even though hrtimer_nanosleep is a global function, clang goes ahead and inlines it into the "nanosleep" syscall, which is in the same file. (We're not currently using {Thin}LTO, so this won't happen in functions outside of kernel/time/hrtimer.c.) Note that if gcc were to change it's inlining heuristics so that it inlined more aggressively, you would be faced with a similar issue.
If you would like to test that it calls hrtimer_nanosleep() and not another function, it might be best to call a syscall not defined in hrtimer.c, e.g. clock_nanosleep().
-bw