Commit 24a9c541 authored by Frederic Weisbecker's avatar Frederic Weisbecker Committed by Paul E. McKenney

context_tracking: Split user tracking Kconfig

Context tracking is going to be used not only to track user transitions
but also idle/IRQs/NMIs. The user tracking part will then become a
separate feature. Prepare Kconfig for that.

[ frederic: Apply Max Filippov feedback. ]
Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com>
Cc: Uladzislau Rezki <uladzislau.rezki@sony.com>
Cc: Joel Fernandes <joel@joelfernandes.org>
Cc: Boqun Feng <boqun.feng@gmail.com>
Cc: Nicolas Saenz Julienne <nsaenz@kernel.org>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Xiongfeng Wang <wangxiongfeng2@huawei.com>
Cc: Yu Liao <liaoyu15@huawei.com>
Cc: Phil Auld <pauld@redhat.com>
Cc: Paul Gortmaker<paul.gortmaker@windriver.com>
Cc: Alex Belits <abelits@marvell.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
Reviewed-by: default avatarNicolas Saenz Julienne <nsaenzju@redhat.com>
Tested-by: default avatarNicolas Saenz Julienne <nsaenzju@redhat.com>
parent 2a0aafce
# #
# Feature name: context-tracking # Feature name: user-context-tracking
# Kconfig: HAVE_CONTEXT_TRACKING # Kconfig: HAVE_CONTEXT_TRACKING_USER
# description: arch supports context tracking for NO_HZ_FULL # description: arch supports user context tracking for NO_HZ_FULL
# #
----------------------- -----------------------
| arch |status| | arch |status|
......
...@@ -774,7 +774,7 @@ config HAVE_ARCH_WITHIN_STACK_FRAMES ...@@ -774,7 +774,7 @@ config HAVE_ARCH_WITHIN_STACK_FRAMES
and similar) by implementing an inline arch_within_stack_frames(), and similar) by implementing an inline arch_within_stack_frames(),
which is used by CONFIG_HARDENED_USERCOPY. which is used by CONFIG_HARDENED_USERCOPY.
config HAVE_CONTEXT_TRACKING config HAVE_CONTEXT_TRACKING_USER
bool bool
help help
Provide kernel/user boundaries probes necessary for subsystems Provide kernel/user boundaries probes necessary for subsystems
...@@ -785,7 +785,7 @@ config HAVE_CONTEXT_TRACKING ...@@ -785,7 +785,7 @@ config HAVE_CONTEXT_TRACKING
protected inside rcu_irq_enter/rcu_irq_exit() but preemption or signal protected inside rcu_irq_enter/rcu_irq_exit() but preemption or signal
handling on irq exit still need to be protected. handling on irq exit still need to be protected.
config HAVE_CONTEXT_TRACKING_OFFSTACK config HAVE_CONTEXT_TRACKING_USER_OFFSTACK
bool bool
help help
Architecture neither relies on exception_enter()/exception_exit() Architecture neither relies on exception_enter()/exception_exit()
......
...@@ -84,7 +84,7 @@ config ARM ...@@ -84,7 +84,7 @@ config ARM
select HAVE_ARCH_TRANSPARENT_HUGEPAGE if ARM_LPAE select HAVE_ARCH_TRANSPARENT_HUGEPAGE if ARM_LPAE
select HAVE_ARM_SMCCC if CPU_V7 select HAVE_ARM_SMCCC if CPU_V7
select HAVE_EBPF_JIT if !CPU_ENDIAN_BE32 select HAVE_EBPF_JIT if !CPU_ENDIAN_BE32
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER
select HAVE_C_RECORDMCOUNT select HAVE_C_RECORDMCOUNT
select HAVE_BUILDTIME_MCOUNT_SORT select HAVE_BUILDTIME_MCOUNT_SORT
select HAVE_DEBUG_KMEMLEAK if !XIP_KERNEL select HAVE_DEBUG_KMEMLEAK if !XIP_KERNEL
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include "entry-header.S" #include "entry-header.S"
saved_psr .req r8 saved_psr .req r8
#if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING_USER)
saved_pc .req r9 saved_pc .req r9
#define TRACE(x...) x #define TRACE(x...) x
#else #else
...@@ -38,7 +38,7 @@ saved_pc .req lr ...@@ -38,7 +38,7 @@ saved_pc .req lr
.section .entry.text,"ax",%progbits .section .entry.text,"ax",%progbits
.align 5 .align 5
#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING) || \ #if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING_USER) || \
IS_ENABLED(CONFIG_DEBUG_RSEQ)) IS_ENABLED(CONFIG_DEBUG_RSEQ))
/* /*
* This is the fast syscall return path. We do as little as possible here, * This is the fast syscall return path. We do as little as possible here,
......
...@@ -366,7 +366,7 @@ ALT_UP_B(.L1_\@) ...@@ -366,7 +366,7 @@ ALT_UP_B(.L1_\@)
* between user and kernel mode. * between user and kernel mode.
*/ */
.macro ct_user_exit, save = 1 .macro ct_user_exit, save = 1
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
.if \save .if \save
stmdb sp!, {r0-r3, ip, lr} stmdb sp!, {r0-r3, ip, lr}
bl user_exit_callable bl user_exit_callable
...@@ -378,7 +378,7 @@ ALT_UP_B(.L1_\@) ...@@ -378,7 +378,7 @@ ALT_UP_B(.L1_\@)
.endm .endm
.macro ct_user_enter, save = 1 .macro ct_user_enter, save = 1
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
.if \save .if \save
stmdb sp!, {r0-r3, ip, lr} stmdb sp!, {r0-r3, ip, lr}
bl user_enter_callable bl user_enter_callable
......
...@@ -174,7 +174,7 @@ config ARM64 ...@@ -174,7 +174,7 @@ config ARM64
select HAVE_C_RECORDMCOUNT select HAVE_C_RECORDMCOUNT
select HAVE_CMPXCHG_DOUBLE select HAVE_CMPXCHG_DOUBLE
select HAVE_CMPXCHG_LOCAL select HAVE_CMPXCHG_LOCAL
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER
select HAVE_DEBUG_KMEMLEAK select HAVE_DEBUG_KMEMLEAK
select HAVE_DMA_CONTIGUOUS select HAVE_DMA_CONTIGUOUS
select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE
......
...@@ -42,7 +42,7 @@ config CSKY ...@@ -42,7 +42,7 @@ config CSKY
select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_AUDITSYSCALL
select HAVE_ARCH_MMAP_RND_BITS select HAVE_ARCH_MMAP_RND_BITS
select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_SECCOMP_FILTER
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER
select HAVE_VIRT_CPU_ACCOUNTING_GEN select HAVE_VIRT_CPU_ACCOUNTING_GEN
select HAVE_DEBUG_BUGVERBOSE select HAVE_DEBUG_BUGVERBOSE
select HAVE_DEBUG_KMEMLEAK select HAVE_DEBUG_KMEMLEAK
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
.endm .endm
.macro context_tracking .macro context_tracking
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
mfcr a0, epsr mfcr a0, epsr
btsti a0, 31 btsti a0, 31
bt 1f bt 1f
...@@ -159,7 +159,7 @@ ret_from_exception: ...@@ -159,7 +159,7 @@ ret_from_exception:
and r10, r9 and r10, r9
cmpnei r10, 0 cmpnei r10, 0
bt exit_work bt exit_work
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
jbsr user_enter_callable jbsr user_enter_callable
#endif #endif
1: 1:
......
...@@ -76,7 +76,7 @@ config LOONGARCH ...@@ -76,7 +76,7 @@ config LOONGARCH
select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRACEHOOK
select HAVE_ARCH_TRANSPARENT_HUGEPAGE select HAVE_ARCH_TRANSPARENT_HUGEPAGE
select HAVE_ASM_MODVERSIONS select HAVE_ASM_MODVERSIONS
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER
select HAVE_COPY_THREAD_TLS select HAVE_COPY_THREAD_TLS
select HAVE_DEBUG_STACKOVERFLOW select HAVE_DEBUG_STACKOVERFLOW
select HAVE_DMA_CONTIGUOUS select HAVE_DMA_CONTIGUOUS
......
...@@ -56,7 +56,7 @@ config MIPS ...@@ -56,7 +56,7 @@ config MIPS
select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRACEHOOK
select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES
select HAVE_ASM_MODVERSIONS select HAVE_ASM_MODVERSIONS
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER
select HAVE_TIF_NOHZ select HAVE_TIF_NOHZ
select HAVE_C_RECORDMCOUNT select HAVE_C_RECORDMCOUNT
select HAVE_DEBUG_KMEMLEAK select HAVE_DEBUG_KMEMLEAK
......
...@@ -202,7 +202,7 @@ config PPC ...@@ -202,7 +202,7 @@ config PPC
select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_SECCOMP_FILTER
select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRACEHOOK
select HAVE_ASM_MODVERSIONS select HAVE_ASM_MODVERSIONS
select HAVE_CONTEXT_TRACKING if PPC64 select HAVE_CONTEXT_TRACKING_USER if PPC64
select HAVE_C_RECORDMCOUNT select HAVE_C_RECORDMCOUNT
select HAVE_DEBUG_KMEMLEAK select HAVE_DEBUG_KMEMLEAK
select HAVE_DEBUG_STACKOVERFLOW select HAVE_DEBUG_STACKOVERFLOW
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#ifndef _ASM_POWERPC_CONTEXT_TRACKING_H #ifndef _ASM_POWERPC_CONTEXT_TRACKING_H
#define _ASM_POWERPC_CONTEXT_TRACKING_H #define _ASM_POWERPC_CONTEXT_TRACKING_H
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
#define SCHEDULE_USER bl schedule_user #define SCHEDULE_USER bl schedule_user
#else #else
#define SCHEDULE_USER bl schedule #define SCHEDULE_USER bl schedule
......
...@@ -86,7 +86,7 @@ config RISCV ...@@ -86,7 +86,7 @@ config RISCV
select HAVE_ARCH_THREAD_STRUCT_WHITELIST select HAVE_ARCH_THREAD_STRUCT_WHITELIST
select HAVE_ARCH_VMAP_STACK if MMU && 64BIT select HAVE_ARCH_VMAP_STACK if MMU && 64BIT
select HAVE_ASM_MODVERSIONS select HAVE_ASM_MODVERSIONS
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER
select HAVE_DEBUG_KMEMLEAK select HAVE_DEBUG_KMEMLEAK
select HAVE_DMA_CONTIGUOUS if MMU select HAVE_DMA_CONTIGUOUS if MMU
select HAVE_EBPF_JIT if MMU select HAVE_EBPF_JIT if MMU
......
...@@ -111,7 +111,7 @@ _save_context: ...@@ -111,7 +111,7 @@ _save_context:
call __trace_hardirqs_off call __trace_hardirqs_off
#endif #endif
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
/* If previous state is in user mode, call user_exit_callable(). */ /* If previous state is in user mode, call user_exit_callable(). */
li a0, SR_PP li a0, SR_PP
and a0, s1, a0 and a0, s1, a0
...@@ -176,7 +176,7 @@ handle_syscall: ...@@ -176,7 +176,7 @@ handle_syscall:
*/ */
csrs CSR_STATUS, SR_IE csrs CSR_STATUS, SR_IE
#endif #endif
#if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING_USER)
/* Recover a0 - a7 for system calls */ /* Recover a0 - a7 for system calls */
REG_L a0, PT_A0(sp) REG_L a0, PT_A0(sp)
REG_L a1, PT_A1(sp) REG_L a1, PT_A1(sp)
...@@ -269,7 +269,7 @@ resume_userspace: ...@@ -269,7 +269,7 @@ resume_userspace:
andi s1, s0, _TIF_WORK_MASK andi s1, s0, _TIF_WORK_MASK
bnez s1, work_pending bnez s1, work_pending
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
call user_enter_callable call user_enter_callable
#endif #endif
......
...@@ -71,7 +71,7 @@ config SPARC64 ...@@ -71,7 +71,7 @@ config SPARC64
select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE
select HAVE_FTRACE_MCOUNT_RECORD select HAVE_FTRACE_MCOUNT_RECORD
select HAVE_SYSCALL_TRACEPOINTS select HAVE_SYSCALL_TRACEPOINTS
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER
select HAVE_TIF_NOHZ select HAVE_TIF_NOHZ
select HAVE_DEBUG_KMEMLEAK select HAVE_DEBUG_KMEMLEAK
select IOMMU_HELPER select IOMMU_HELPER
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <asm/visasm.h> #include <asm/visasm.h>
#include <asm/processor.h> #include <asm/processor.h>
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
# define SCHEDULE_USER schedule_user # define SCHEDULE_USER schedule_user
#else #else
# define SCHEDULE_USER schedule # define SCHEDULE_USER schedule
......
...@@ -186,8 +186,8 @@ config X86 ...@@ -186,8 +186,8 @@ config X86
select HAVE_ASM_MODVERSIONS select HAVE_ASM_MODVERSIONS
select HAVE_CMPXCHG_DOUBLE select HAVE_CMPXCHG_DOUBLE
select HAVE_CMPXCHG_LOCAL select HAVE_CMPXCHG_LOCAL
select HAVE_CONTEXT_TRACKING if X86_64 select HAVE_CONTEXT_TRACKING_USER if X86_64
select HAVE_CONTEXT_TRACKING_OFFSTACK if HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER_OFFSTACK if HAVE_CONTEXT_TRACKING_USER
select HAVE_C_RECORDMCOUNT select HAVE_C_RECORDMCOUNT
select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL
select HAVE_BUILDTIME_MCOUNT_SORT select HAVE_BUILDTIME_MCOUNT_SORT
......
...@@ -33,7 +33,7 @@ config XTENSA ...@@ -33,7 +33,7 @@ config XTENSA
select HAVE_ARCH_KCSAN select HAVE_ARCH_KCSAN
select HAVE_ARCH_SECCOMP_FILTER select HAVE_ARCH_SECCOMP_FILTER
select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_TRACEHOOK
select HAVE_CONTEXT_TRACKING select HAVE_CONTEXT_TRACKING_USER
select HAVE_DEBUG_KMEMLEAK select HAVE_DEBUG_KMEMLEAK
select HAVE_DMA_CONTIGUOUS select HAVE_DMA_CONTIGUOUS
select HAVE_EXIT_THREAD select HAVE_EXIT_THREAD
......
...@@ -455,7 +455,7 @@ KABI_W or a3, a3, a2 ...@@ -455,7 +455,7 @@ KABI_W or a3, a3, a2
abi_call trace_hardirqs_off abi_call trace_hardirqs_off
1: 1:
#endif #endif
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
l32i abi_tmp0, a1, PT_PS l32i abi_tmp0, a1, PT_PS
bbci.l abi_tmp0, PS_UM_BIT, 1f bbci.l abi_tmp0, PS_UM_BIT, 1f
abi_call user_exit_callable abi_call user_exit_callable
...@@ -544,7 +544,7 @@ common_exception_return: ...@@ -544,7 +544,7 @@ common_exception_return:
j .Lrestore_state j .Lrestore_state
.Lexit_tif_loop_user: .Lexit_tif_loop_user:
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
abi_call user_enter_callable abi_call user_enter_callable
#endif #endif
#ifdef CONFIG_HAVE_HW_BREAKPOINT #ifdef CONFIG_HAVE_HW_BREAKPOINT
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
#include <asm/ptrace.h> #include <asm/ptrace.h>
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
extern void ct_cpu_track_user(int cpu); extern void ct_cpu_track_user(int cpu);
/* Called with interrupts disabled. */ /* Called with interrupts disabled. */
...@@ -52,7 +52,7 @@ static inline enum ctx_state exception_enter(void) ...@@ -52,7 +52,7 @@ static inline enum ctx_state exception_enter(void)
{ {
enum ctx_state prev_ctx; enum ctx_state prev_ctx;
if (IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK) || if (IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK) ||
!context_tracking_enabled()) !context_tracking_enabled())
return 0; return 0;
...@@ -65,7 +65,7 @@ static inline enum ctx_state exception_enter(void) ...@@ -65,7 +65,7 @@ static inline enum ctx_state exception_enter(void)
static inline void exception_exit(enum ctx_state prev_ctx) static inline void exception_exit(enum ctx_state prev_ctx)
{ {
if (!IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK) && if (!IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK) &&
context_tracking_enabled()) { context_tracking_enabled()) {
if (prev_ctx != CONTEXT_KERNEL) if (prev_ctx != CONTEXT_KERNEL)
ct_user_enter(prev_ctx); ct_user_enter(prev_ctx);
...@@ -109,14 +109,14 @@ static inline enum ctx_state ct_state(void) { return CONTEXT_DISABLED; } ...@@ -109,14 +109,14 @@ static inline enum ctx_state ct_state(void) { return CONTEXT_DISABLED; }
static __always_inline bool context_tracking_guest_enter(void) { return false; } static __always_inline bool context_tracking_guest_enter(void) { return false; }
static inline void context_tracking_guest_exit(void) { } static inline void context_tracking_guest_exit(void) { }
#endif /* !CONFIG_CONTEXT_TRACKING */ #endif /* !CONFIG_CONTEXT_TRACKING_USER */
#define CT_WARN_ON(cond) WARN_ON(context_tracking_enabled() && (cond)) #define CT_WARN_ON(cond) WARN_ON(context_tracking_enabled() && (cond))
#ifdef CONFIG_CONTEXT_TRACKING_FORCE #ifdef CONFIG_CONTEXT_TRACKING_USER_FORCE
extern void context_tracking_init(void); extern void context_tracking_init(void);
#else #else
static inline void context_tracking_init(void) { } static inline void context_tracking_init(void) { }
#endif /* CONFIG_CONTEXT_TRACKING_FORCE */ #endif /* CONFIG_CONTEXT_TRACKING_USER_FORCE */
#endif #endif
...@@ -22,7 +22,7 @@ struct context_tracking { ...@@ -22,7 +22,7 @@ struct context_tracking {
} state; } state;
}; };
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING_USER
extern struct static_key_false context_tracking_key; extern struct static_key_false context_tracking_key;
DECLARE_PER_CPU(struct context_tracking, context_tracking); DECLARE_PER_CPU(struct context_tracking, context_tracking);
...@@ -45,6 +45,6 @@ static inline bool context_tracking_enabled_this_cpu(void) ...@@ -45,6 +45,6 @@ static inline bool context_tracking_enabled_this_cpu(void)
static __always_inline bool context_tracking_enabled(void) { return false; } static __always_inline bool context_tracking_enabled(void) { return false; }
static __always_inline bool context_tracking_enabled_cpu(int cpu) { return false; } static __always_inline bool context_tracking_enabled_cpu(int cpu) { return false; }
static __always_inline bool context_tracking_enabled_this_cpu(void) { return false; } static __always_inline bool context_tracking_enabled_this_cpu(void) { return false; }
#endif /* CONFIG_CONTEXT_TRACKING */ #endif /* CONFIG_CONTEXT_TRACKING_USER */
#endif #endif
...@@ -494,11 +494,11 @@ config VIRT_CPU_ACCOUNTING_NATIVE ...@@ -494,11 +494,11 @@ config VIRT_CPU_ACCOUNTING_NATIVE
config VIRT_CPU_ACCOUNTING_GEN config VIRT_CPU_ACCOUNTING_GEN
bool "Full dynticks CPU time accounting" bool "Full dynticks CPU time accounting"
depends on HAVE_CONTEXT_TRACKING depends on HAVE_CONTEXT_TRACKING_USER
depends on HAVE_VIRT_CPU_ACCOUNTING_GEN depends on HAVE_VIRT_CPU_ACCOUNTING_GEN
depends on GENERIC_CLOCKEVENTS depends on GENERIC_CLOCKEVENTS
select VIRT_CPU_ACCOUNTING select VIRT_CPU_ACCOUNTING
select CONTEXT_TRACKING select CONTEXT_TRACKING_USER
help help
Select this option to enable task and CPU time accounting on full Select this option to enable task and CPU time accounting on full
dynticks systems. This accounting is implemented by watching every dynticks systems. This accounting is implemented by watching every
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include <linux/export.h> #include <linux/export.h>
#include <linux/kprobes.h> #include <linux/kprobes.h>
#ifdef CONFIG_CONTEXT_TRACKING_USER
#define CREATE_TRACE_POINTS #define CREATE_TRACE_POINTS
#include <trace/events/context_tracking.h> #include <trace/events/context_tracking.h>
...@@ -252,7 +254,7 @@ void __init ct_cpu_track_user(int cpu) ...@@ -252,7 +254,7 @@ void __init ct_cpu_track_user(int cpu)
initialized = true; initialized = true;
} }
#ifdef CONFIG_CONTEXT_TRACKING_FORCE #ifdef CONFIG_CONTEXT_TRACKING_USER_FORCE
void __init context_tracking_init(void) void __init context_tracking_init(void)
{ {
int cpu; int cpu;
...@@ -261,3 +263,5 @@ void __init context_tracking_init(void) ...@@ -261,3 +263,5 @@ void __init context_tracking_init(void)
ct_cpu_track_user(cpu); ct_cpu_track_user(cpu);
} }
#endif #endif
#endif /* #ifdef CONFIG_CONTEXT_TRACKING_USER */
...@@ -6559,7 +6559,7 @@ void __sched schedule_idle(void) ...@@ -6559,7 +6559,7 @@ void __sched schedule_idle(void)
} while (need_resched()); } while (need_resched());
} }
#if defined(CONFIG_CONTEXT_TRACKING) && !defined(CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK) #if defined(CONFIG_CONTEXT_TRACKING_USER) && !defined(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK)
asmlinkage __visible void __sched schedule_user(void) asmlinkage __visible void __sched schedule_user(void)
{ {
/* /*
......
...@@ -73,6 +73,9 @@ config TIME_KUNIT_TEST ...@@ -73,6 +73,9 @@ config TIME_KUNIT_TEST
If unsure, say N. If unsure, say N.
config CONTEXT_TRACKING
bool
if GENERIC_CLOCKEVENTS if GENERIC_CLOCKEVENTS
menu "Timers subsystem" menu "Timers subsystem"
...@@ -111,7 +114,7 @@ config NO_HZ_FULL ...@@ -111,7 +114,7 @@ config NO_HZ_FULL
# NO_HZ_COMMON dependency # NO_HZ_COMMON dependency
# We need at least one periodic CPU for timekeeping # We need at least one periodic CPU for timekeeping
depends on SMP depends on SMP
depends on HAVE_CONTEXT_TRACKING depends on HAVE_CONTEXT_TRACKING_USER
# VIRT_CPU_ACCOUNTING_GEN dependency # VIRT_CPU_ACCOUNTING_GEN dependency
depends on HAVE_VIRT_CPU_ACCOUNTING_GEN depends on HAVE_VIRT_CPU_ACCOUNTING_GEN
select NO_HZ_COMMON select NO_HZ_COMMON
...@@ -137,31 +140,37 @@ config NO_HZ_FULL ...@@ -137,31 +140,37 @@ config NO_HZ_FULL
endchoice endchoice
config CONTEXT_TRACKING config CONTEXT_TRACKING_USER
bool bool
depends on HAVE_CONTEXT_TRACKING_USER
select CONTEXT_TRACKING
help
Track transitions between kernel and user on behalf of RCU and
tickless cputime accounting. The former case relies on context
tracking to enter/exit RCU extended quiescent states.
config CONTEXT_TRACKING_FORCE config CONTEXT_TRACKING_USER_FORCE
bool "Force context tracking" bool "Force user context tracking"
depends on CONTEXT_TRACKING depends on CONTEXT_TRACKING_USER
default y if !NO_HZ_FULL default y if !NO_HZ_FULL
help help
The major pre-requirement for full dynticks to work is to The major pre-requirement for full dynticks to work is to
support the context tracking subsystem. But there are also support the user context tracking subsystem. But there are also
other dependencies to provide in order to make the full other dependencies to provide in order to make the full
dynticks working. dynticks working.
This option stands for testing when an arch implements the This option stands for testing when an arch implements the
context tracking backend but doesn't yet fulfill all the user context tracking backend but doesn't yet fulfill all the
requirements to make the full dynticks feature working. requirements to make the full dynticks feature working.
Without the full dynticks, there is no way to test the support Without the full dynticks, there is no way to test the support
for context tracking and the subsystems that rely on it: RCU for user context tracking and the subsystems that rely on it: RCU
userspace extended quiescent state and tickless cputime userspace extended quiescent state and tickless cputime
accounting. This option copes with the absence of the full accounting. This option copes with the absence of the full
dynticks subsystem by forcing the context tracking on all dynticks subsystem by forcing the user context tracking on all
CPUs in the system. CPUs in the system.
Say Y only if you're working on the development of an Say Y only if you're working on the development of an
architecture backend for the context tracking. architecture backend for the user context tracking.
Say N otherwise, this option brings an overhead that you Say N otherwise, this option brings an overhead that you
don't want in production. don't want in production.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment