Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

perf: Couldn't record kernel reference relocation symbol

Tags:

kernel

perf

I have compiled perf for my kernel (3.11.10). During the compilation, some libraries were missing, so I have installed those.

But now when I run perf, I get following message:

Couldn't record kernel reference relocation symbol Symbol resolution may be skewed if relocation was used (e.g. kexec). Check /proc/kallsyms permission or run as root.  Kernel address maps (/proc/{kallsyms,modules}) were restricted. Check /proc/sys/kernel/kptr_restrict before running 'perf record' If some relocation was applied (e.g. kexec) symbols may be misresolved. Samples in kernel modules can't be resolved as well. 

Since I am using custom build kernel, the most obvious explanation to me is, that some option is missing from my kernel. If so, how can I find out what is missing?

I am not sure what exactly perf is complaining about. How can I fix this?

EDIT:

/proc/kallsyms does not exist and /proc/sys/kernel/kptr_restrict contains 0:

$ cat /proc/sys/kernel/kptr_restrict 0 

I have compiled the kernel myself, and it is possible that it is missing some option. What is this /proc/kallsyms ? How can I enable it in my kernel?

like image 219
Martin Vegter Avatar asked Jan 22 '14 13:01

Martin Vegter


1 Answers

What is your kernel? Is it from the linux distributive you use or is it compiled by you (how did you install it)?

First part of warning says about /proc/kallsyms - can you show output of the command (started from the same user you used to run perf)

ls -l  /proc/kallsyms cat /proc/kallsyms | head 

Second part of the perf message says about kptr_restrict sysctl setting. Can you do

cat /proc/sys/kernel/kptr_restrict 

to check the setting. Basically, to profile the kernel symbols you should either disable kptr_restrict by setting it to zero (as described in https://lwn.net/Articles/420403/ or https://code.google.com/p/dart/wiki/Profiling):

# Run as root user - e.g. after doing "sudo bash" echo 0 > /proc/sys/kernel/kptr_restrict 

or (https://stackoverflow.com/a/20391360/196561)

sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict" 

or

echo 0 | sudo tee /proc/sys/kernel/kptr_restrict 

or you can always run the perf from root user.

After setting kptr_restrict to zero or when running perf from root you should get no warning about kallsyms and will be able to profile kernel functions.

Update: seems that perf record always want access to kallsyms/restricted kptrs, even with userspace-only event (-e cycles:u)

like image 162
osgx Avatar answered Sep 23 '22 02:09

osgx