[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20211021134530.206216-2-leo.yan@linaro.org>
Date: Thu, 21 Oct 2021 21:45:27 +0800
From: Leo Yan <leo.yan@...aro.org>
To: Catalin Marinas <catalin.marinas@....com>,
Will Deacon <will@...nel.org>,
Mark Rutland <mark.rutland@....com>,
Kees Cook <keescook@...omium.org>,
Ard Biesheuvel <ardb@...nel.org>,
Sami Tolvanen <samitolvanen@...gle.com>,
Nicholas Piggin <npiggin@...il.com>,
James Morse <james.morse@....com>,
Marc Zyngier <maz@...nel.org>, Joey Gouly <joey.gouly@....com>,
Peter Collingbourne <pcc@...gle.com>,
Vincenzo Frascino <vincenzo.frascino@....com>,
"Peter Zijlstra (Intel)" <peterz@...radead.org>,
Stephane Eranian <eranian@...gle.com>,
James Clark <james.clark@....com>,
linux-arm-kernel@...ts.infradead.org, linux-kernel@...r.kernel.org
Cc: Leo Yan <leo.yan@...aro.org>
Subject: [RFCv1 1/4] arm64: Use static key for tracing PID in CONTEXTIDR
The kernel provides CONFIG_PID_IN_CONTEXTIDR for tracing PID into system
register CONTEXTIDR; we need to statically enable this configuration
when build kernel image to use this feature.
On the other hand, hardware tracing modules (e.g. Arm CoreSight, SPE,
etc) rely on this feature to provide context info in their tracing data.
If kernel has not enabled configuration CONFIG_PID_IN_CONTEXTIDR, then
tracing modules have no chance to capture PID related info.
This patch introduces static key for tracing PID in CONTEXTIDR, it
provides a possibility for device driver to dynamically enable and
disable tracing PID into CONTEXTIDR as needed.
As the first step, the kernel increases the static key if
CONFIG_PID_IN_CONTEXTIDR is enabled when booting kernel, in this case
kernel will always trace PID into CONTEXTIDR at the runtime. This means
before and after applying this patch, the semantics for
CONFIG_PID_IN_CONTEXTIDR are consistent.
Signed-off-by: Leo Yan <leo.yan@...aro.org>
---
arch/arm64/include/asm/mmu_context.h | 4 +++-
arch/arm64/kernel/process.c | 11 +++++++++++
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/mmu_context.h b/arch/arm64/include/asm/mmu_context.h
index f4ba93d4ffeb..e1f33616f83a 100644
--- a/arch/arm64/include/asm/mmu_context.h
+++ b/arch/arm64/include/asm/mmu_context.h
@@ -26,9 +26,11 @@
extern bool rodata_full;
+DECLARE_STATIC_KEY_FALSE(contextidr_in_use);
+
static inline void contextidr_thread_switch(struct task_struct *next)
{
- if (!IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR))
+ if (!static_branch_unlikely(&contextidr_in_use))
return;
write_sysreg(task_pid_nr(next), contextidr_el1);
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 40adb8cdbf5a..d744c0c7e4c4 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -61,6 +61,9 @@ unsigned long __stack_chk_guard __ro_after_init;
EXPORT_SYMBOL(__stack_chk_guard);
#endif
+DEFINE_STATIC_KEY_FALSE(contextidr_in_use);
+EXPORT_SYMBOL_GPL(contextidr_in_use);
+
/*
* Function pointers to optional machine specific functions
*/
@@ -721,3 +724,11 @@ int arch_elf_adjust_prot(int prot, const struct arch_elf_state *state,
return prot;
}
#endif
+
+static int __init contextidr_init(void)
+{
+ if (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR))
+ static_branch_inc(&contextidr_in_use);
+ return 0;
+}
+early_initcall(contextidr_init);
--
2.25.1
Powered by blists - more mailing lists