mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-04-13 09:59:31 +00:00
tracing: Disable branch profiling in noinstr code
CONFIG_TRACE_BRANCH_PROFILING inserts a call to ftrace_likely_update() for each use of likely() or unlikely(). That breaks noinstr rules if the affected function is annotated as noinstr. Disable branch profiling for files with noinstr functions. In addition to some individual files, this also includes the entire arch/x86 subtree, as well as the kernel/entry, drivers/cpuidle, and drivers/idle directories, all of which are noinstr-heavy. Due to the nature of how sched binaries are built by combining multiple .c files into one, branch profiling is disabled more broadly across the sched code than would otherwise be needed. This fixes many warnings like the following: vmlinux.o: warning: objtool: do_syscall_64+0x40: call to ftrace_likely_update() leaves .noinstr.text section vmlinux.o: warning: objtool: __rdgsbase_inactive+0x33: call to ftrace_likely_update() leaves .noinstr.text section vmlinux.o: warning: objtool: handle_bug.isra.0+0x198: call to ftrace_likely_update() leaves .noinstr.text section ... Reported-by: Ingo Molnar <mingo@kernel.org> Suggested-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Thomas Gleixner <tglx@linutronix.de> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: https://lore.kernel.org/r/fb94fc9303d48a5ed370498f54500cc4c338eb6d.1742586676.git.jpoimboe@kernel.org
This commit is contained in:
parent
73070466ed
commit
2cbb20b008
14 changed files with 39 additions and 10 deletions
|
@ -1,4 +1,8 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
# Branch profiling isn't noinstr-safe. Disable it for arch/x86/*
|
||||
subdir-ccflags-$(CONFIG_TRACE_BRANCH_PROFILING) += -DDISABLE_BRANCH_PROFILING
|
||||
|
||||
obj-$(CONFIG_ARCH_HAS_CC_PLATFORM) += coco/
|
||||
|
||||
obj-y += entry/
|
||||
|
|
|
@ -9,8 +9,6 @@
|
|||
|
||||
#define pr_fmt(fmt) "SEV: " fmt
|
||||
|
||||
#define DISABLE_BRANCH_PROFILING
|
||||
|
||||
#include <linux/sched/debug.h> /* For show_regs() */
|
||||
#include <linux/percpu-defs.h>
|
||||
#include <linux/cc_platform.h>
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
* Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
|
||||
*/
|
||||
|
||||
#define DISABLE_BRANCH_PROFILING
|
||||
|
||||
/* cpu_feature_enabled() cannot be used this early */
|
||||
#define USE_EARLY_PGTABLE_L5
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#define DISABLE_BRANCH_PROFILING
|
||||
#define pr_fmt(fmt) "kasan: " fmt
|
||||
|
||||
/* cpu_feature_enabled() cannot be used this early */
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
* Author: Tom Lendacky <thomas.lendacky@amd.com>
|
||||
*/
|
||||
|
||||
#define DISABLE_BRANCH_PROFILING
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
* Author: Tom Lendacky <thomas.lendacky@amd.com>
|
||||
*/
|
||||
|
||||
#define DISABLE_BRANCH_PROFILING
|
||||
|
||||
/*
|
||||
* Since we're dealing with identity mappings, physical and virtual
|
||||
* addresses are the same, so override these defines which are ultimately
|
||||
|
|
|
@ -5,6 +5,10 @@
|
|||
|
||||
ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
||||
|
||||
ifdef CONFIG_TRACE_BRANCH_PROFILING
|
||||
CFLAGS_processor_idle.o += -DDISABLE_BRANCH_PROFILING
|
||||
endif
|
||||
|
||||
#
|
||||
# ACPI Boot-Time Table Parsing
|
||||
#
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
# Makefile for cpuidle.
|
||||
#
|
||||
|
||||
# Branch profiling isn't noinstr-safe
|
||||
ccflags-$(CONFIG_TRACE_BRANCH_PROFILING) += -DDISABLE_BRANCH_PROFILING
|
||||
|
||||
obj-y += cpuidle.o driver.o governor.o sysfs.o governors/
|
||||
obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o
|
||||
obj-$(CONFIG_DT_IDLE_STATES) += dt_idle_states.o
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-$(CONFIG_INTEL_IDLE) += intel_idle.o
|
||||
|
||||
# Branch profiling isn't noinstr-safe
|
||||
ccflags-$(CONFIG_TRACE_BRANCH_PROFILING) += -DDISABLE_BRANCH_PROFILING
|
||||
|
||||
obj-$(CONFIG_INTEL_IDLE) += intel_idle.o
|
||||
|
|
|
@ -21,6 +21,11 @@ ifdef CONFIG_FUNCTION_TRACER
|
|||
CFLAGS_REMOVE_irq_work.o = $(CC_FLAGS_FTRACE)
|
||||
endif
|
||||
|
||||
# Branch profiling isn't noinstr-safe
|
||||
ifdef CONFIG_TRACE_BRANCH_PROFILING
|
||||
CFLAGS_context_tracking.o += -DDISABLE_BRANCH_PROFILING
|
||||
endif
|
||||
|
||||
# Prevents flicker of uninteresting __do_softirq()/__local_bh_disable_ip()
|
||||
# in coverage traces.
|
||||
KCOV_INSTRUMENT_softirq.o := n
|
||||
|
|
|
@ -6,6 +6,9 @@ KASAN_SANITIZE := n
|
|||
UBSAN_SANITIZE := n
|
||||
KCOV_INSTRUMENT := n
|
||||
|
||||
# Branch profiling isn't noinstr-safe
|
||||
ccflags-$(CONFIG_TRACE_BRANCH_PROFILING) += -DDISABLE_BRANCH_PROFILING
|
||||
|
||||
CFLAGS_REMOVE_common.o = -fstack-protector -fstack-protector-strong
|
||||
CFLAGS_common.o += -fno-stack-protector
|
||||
|
||||
|
|
|
@ -22,6 +22,11 @@ ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y)
|
|||
CFLAGS_core.o := $(PROFILING) -fno-omit-frame-pointer
|
||||
endif
|
||||
|
||||
# Branch profiling isn't noinstr-safe
|
||||
ifdef CONFIG_TRACE_BRANCH_PROFILING
|
||||
CFLAGS_build_policy.o += -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_build_utility.o += -DDISABLE_BRANCH_PROFILING
|
||||
endif
|
||||
#
|
||||
# Build efficiency:
|
||||
#
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
# Branch profiling isn't noinstr-safe
|
||||
ifdef CONFIG_TRACE_BRANCH_PROFILING
|
||||
CFLAGS_sched_clock.o += -DDISABLE_BRANCH_PROFILING
|
||||
endif
|
||||
|
||||
obj-y += time.o timer.o hrtimer.o sleep_timeout.o
|
||||
obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o
|
||||
obj-y += timeconv.o timecounter.o alarmtimer.o
|
||||
|
|
|
@ -5,6 +5,11 @@
|
|||
|
||||
ccflags-remove-$(CONFIG_FUNCTION_TRACER) += $(CC_FLAGS_FTRACE)
|
||||
|
||||
# Branch profiling isn't noinstr-safe
|
||||
ifdef CONFIG_TRACE_BRANCH_PROFILING
|
||||
CFLAGS_smp_processor_id.o += -DDISABLE_BRANCH_PROFILING
|
||||
endif
|
||||
|
||||
# These files are disabled because they produce lots of non-interesting and/or
|
||||
# flaky coverage that is not a function of syscall inputs. For example,
|
||||
# rbtree can be global and individual rotations don't correlate with inputs.
|
||||
|
|
Loading…
Add table
Reference in a new issue