Re: -mprofile-kernel vs. notrace in ppc64(le) Linux kernels
From: Anton Blanchard <hidden>
Date: 2015-09-26 23:04:05
Subsystem:
the rest · Maintainer:
Linus Torvalds
Hi,
On Sat, Sep 26, 2015 at 04:30:08PM +0200, Torsten Duwe wrote:quoted
As I mentioned earlier this year, it's a bad idea to call _mcount from MMU helper functions (e.g. hash_page...), when the profiling/tracing/ live-patching/whatever framewok might in turn cause another such fault. Jikos suggested to use fine-grained control of these functions with the "notrace" keyword in the Linux kernel. It is mapped to GCC's (4.8, FWIW) __attribute__((no_instrument_function)), which, to my surprise, works for -p and -pg nicely, but does not affect -mprofile-kernel at all!That is surprising; please file a GCC bug.
This sounds like the issue below, fixed by Pat.
Anton
--
commit ccebc2aad32917f3371ae6d5774f689c86ace0b2
Author: pthaugen <pthaugen@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed Jan 15 23:48:12 2014 +0000
* config/rs6000/rs6000.c (rs6000_output_function_prologue): Check if
current procedure should be profiled.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@206650 138bc75d-0d04-0410-961f-82ee72b054a4
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2781bd0..0788036 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog@@ -1,3 +1,8 @@ +2014-01-15 Pat Haugen <pthaugen@us.ibm.com> + + * config/rs6000/rs6000.c (rs6000_output_function_prologue): Check if + current procedure should be profiled. + 2014-01-15 Andrew Pinski <apinski@cavium.com> * config/aarch64/aarch64.c (aarch64_register_move_cost): Correct cost
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 289b52c..a479219 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c@@ -23198,7 +23198,7 @@ rs6000_output_function_prologue (FILE *file, /* Output -mprofile-kernel code. This needs to be done here instead of in output_function_profile since it must go after the ELFv2 ABI local entry point. */ - if (TARGET_PROFILE_KERNEL) + if (TARGET_PROFILE_KERNEL && crtl->profile) { gcc_assert (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2); gcc_assert (!TARGET_32BIT);