Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Frederic 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: Paul E. McKenney <paulmck@kernel.org>
Reviewed-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>
Tested-by: Nicolas Saenz Julienne <nsaenzju@redhat.com>

authored by

Frederic Weisbecker and committed by
Paul E. McKenney
24a9c541 2a0aafce

+65 -52
+3 -3
Documentation/features/time/context-tracking/arch-support.txt
··· 1 1 # 2 - # Feature name: context-tracking 3 - # Kconfig: HAVE_CONTEXT_TRACKING 4 - # description: arch supports context tracking for NO_HZ_FULL 2 + # Feature name: user-context-tracking 3 + # Kconfig: HAVE_CONTEXT_TRACKING_USER 4 + # description: arch supports user context tracking for NO_HZ_FULL 5 5 # 6 6 ----------------------- 7 7 | arch |status|
+2 -2
arch/Kconfig
··· 774 774 and similar) by implementing an inline arch_within_stack_frames(), 775 775 which is used by CONFIG_HARDENED_USERCOPY. 776 776 777 - config HAVE_CONTEXT_TRACKING 777 + config HAVE_CONTEXT_TRACKING_USER 778 778 bool 779 779 help 780 780 Provide kernel/user boundaries probes necessary for subsystems ··· 785 785 protected inside rcu_irq_enter/rcu_irq_exit() but preemption or signal 786 786 handling on irq exit still need to be protected. 787 787 788 - config HAVE_CONTEXT_TRACKING_OFFSTACK 788 + config HAVE_CONTEXT_TRACKING_USER_OFFSTACK 789 789 bool 790 790 help 791 791 Architecture neither relies on exception_enter()/exception_exit()
+1 -1
arch/arm/Kconfig
··· 84 84 select HAVE_ARCH_TRANSPARENT_HUGEPAGE if ARM_LPAE 85 85 select HAVE_ARM_SMCCC if CPU_V7 86 86 select HAVE_EBPF_JIT if !CPU_ENDIAN_BE32 87 - select HAVE_CONTEXT_TRACKING 87 + select HAVE_CONTEXT_TRACKING_USER 88 88 select HAVE_C_RECORDMCOUNT 89 89 select HAVE_BUILDTIME_MCOUNT_SORT 90 90 select HAVE_DEBUG_KMEMLEAK if !XIP_KERNEL
+2 -2
arch/arm/kernel/entry-common.S
··· 28 28 #include "entry-header.S" 29 29 30 30 saved_psr .req r8 31 - #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) 31 + #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING_USER) 32 32 saved_pc .req r9 33 33 #define TRACE(x...) x 34 34 #else ··· 38 38 39 39 .section .entry.text,"ax",%progbits 40 40 .align 5 41 - #if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING) || \ 41 + #if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACKING_USER) || \ 42 42 IS_ENABLED(CONFIG_DEBUG_RSEQ)) 43 43 /* 44 44 * This is the fast syscall return path. We do as little as possible here,
+2 -2
arch/arm/kernel/entry-header.S
··· 366 366 * between user and kernel mode. 367 367 */ 368 368 .macro ct_user_exit, save = 1 369 - #ifdef CONFIG_CONTEXT_TRACKING 369 + #ifdef CONFIG_CONTEXT_TRACKING_USER 370 370 .if \save 371 371 stmdb sp!, {r0-r3, ip, lr} 372 372 bl user_exit_callable ··· 378 378 .endm 379 379 380 380 .macro ct_user_enter, save = 1 381 - #ifdef CONFIG_CONTEXT_TRACKING 381 + #ifdef CONFIG_CONTEXT_TRACKING_USER 382 382 .if \save 383 383 stmdb sp!, {r0-r3, ip, lr} 384 384 bl user_enter_callable
+1 -1
arch/arm64/Kconfig
··· 174 174 select HAVE_C_RECORDMCOUNT 175 175 select HAVE_CMPXCHG_DOUBLE 176 176 select HAVE_CMPXCHG_LOCAL 177 - select HAVE_CONTEXT_TRACKING 177 + select HAVE_CONTEXT_TRACKING_USER 178 178 select HAVE_DEBUG_KMEMLEAK 179 179 select HAVE_DMA_CONTIGUOUS 180 180 select HAVE_DYNAMIC_FTRACE
+1 -1
arch/csky/Kconfig
··· 42 42 select HAVE_ARCH_AUDITSYSCALL 43 43 select HAVE_ARCH_MMAP_RND_BITS 44 44 select HAVE_ARCH_SECCOMP_FILTER 45 - select HAVE_CONTEXT_TRACKING 45 + select HAVE_CONTEXT_TRACKING_USER 46 46 select HAVE_VIRT_CPU_ACCOUNTING_GEN 47 47 select HAVE_DEBUG_BUGVERBOSE 48 48 select HAVE_DEBUG_KMEMLEAK
+2 -2
arch/csky/kernel/entry.S
··· 19 19 .endm 20 20 21 21 .macro context_tracking 22 - #ifdef CONFIG_CONTEXT_TRACKING 22 + #ifdef CONFIG_CONTEXT_TRACKING_USER 23 23 mfcr a0, epsr 24 24 btsti a0, 31 25 25 bt 1f ··· 159 159 and r10, r9 160 160 cmpnei r10, 0 161 161 bt exit_work 162 - #ifdef CONFIG_CONTEXT_TRACKING 162 + #ifdef CONFIG_CONTEXT_TRACKING_USER 163 163 jbsr user_enter_callable 164 164 #endif 165 165 1:
+1 -1
arch/loongarch/Kconfig
··· 76 76 select HAVE_ARCH_TRACEHOOK 77 77 select HAVE_ARCH_TRANSPARENT_HUGEPAGE 78 78 select HAVE_ASM_MODVERSIONS 79 - select HAVE_CONTEXT_TRACKING 79 + select HAVE_CONTEXT_TRACKING_USER 80 80 select HAVE_COPY_THREAD_TLS 81 81 select HAVE_DEBUG_STACKOVERFLOW 82 82 select HAVE_DMA_CONTIGUOUS
+1 -1
arch/mips/Kconfig
··· 56 56 select HAVE_ARCH_TRACEHOOK 57 57 select HAVE_ARCH_TRANSPARENT_HUGEPAGE if CPU_SUPPORTS_HUGEPAGES 58 58 select HAVE_ASM_MODVERSIONS 59 - select HAVE_CONTEXT_TRACKING 59 + select HAVE_CONTEXT_TRACKING_USER 60 60 select HAVE_TIF_NOHZ 61 61 select HAVE_C_RECORDMCOUNT 62 62 select HAVE_DEBUG_KMEMLEAK
+1 -1
arch/powerpc/Kconfig
··· 202 202 select HAVE_ARCH_SECCOMP_FILTER 203 203 select HAVE_ARCH_TRACEHOOK 204 204 select HAVE_ASM_MODVERSIONS 205 - select HAVE_CONTEXT_TRACKING if PPC64 205 + select HAVE_CONTEXT_TRACKING_USER if PPC64 206 206 select HAVE_C_RECORDMCOUNT 207 207 select HAVE_DEBUG_KMEMLEAK 208 208 select HAVE_DEBUG_STACKOVERFLOW
+1 -1
arch/powerpc/include/asm/context_tracking.h
··· 2 2 #ifndef _ASM_POWERPC_CONTEXT_TRACKING_H 3 3 #define _ASM_POWERPC_CONTEXT_TRACKING_H 4 4 5 - #ifdef CONFIG_CONTEXT_TRACKING 5 + #ifdef CONFIG_CONTEXT_TRACKING_USER 6 6 #define SCHEDULE_USER bl schedule_user 7 7 #else 8 8 #define SCHEDULE_USER bl schedule
+1 -1
arch/riscv/Kconfig
··· 86 86 select HAVE_ARCH_THREAD_STRUCT_WHITELIST 87 87 select HAVE_ARCH_VMAP_STACK if MMU && 64BIT 88 88 select HAVE_ASM_MODVERSIONS 89 - select HAVE_CONTEXT_TRACKING 89 + select HAVE_CONTEXT_TRACKING_USER 90 90 select HAVE_DEBUG_KMEMLEAK 91 91 select HAVE_DMA_CONTIGUOUS if MMU 92 92 select HAVE_EBPF_JIT if MMU
+3 -3
arch/riscv/kernel/entry.S
··· 111 111 call __trace_hardirqs_off 112 112 #endif 113 113 114 - #ifdef CONFIG_CONTEXT_TRACKING 114 + #ifdef CONFIG_CONTEXT_TRACKING_USER 115 115 /* If previous state is in user mode, call user_exit_callable(). */ 116 116 li a0, SR_PP 117 117 and a0, s1, a0 ··· 176 176 */ 177 177 csrs CSR_STATUS, SR_IE 178 178 #endif 179 - #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING) 179 + #if defined(CONFIG_TRACE_IRQFLAGS) || defined(CONFIG_CONTEXT_TRACKING_USER) 180 180 /* Recover a0 - a7 for system calls */ 181 181 REG_L a0, PT_A0(sp) 182 182 REG_L a1, PT_A1(sp) ··· 269 269 andi s1, s0, _TIF_WORK_MASK 270 270 bnez s1, work_pending 271 271 272 - #ifdef CONFIG_CONTEXT_TRACKING 272 + #ifdef CONFIG_CONTEXT_TRACKING_USER 273 273 call user_enter_callable 274 274 #endif 275 275
+1 -1
arch/sparc/Kconfig
··· 71 71 select HAVE_DYNAMIC_FTRACE 72 72 select HAVE_FTRACE_MCOUNT_RECORD 73 73 select HAVE_SYSCALL_TRACEPOINTS 74 - select HAVE_CONTEXT_TRACKING 74 + select HAVE_CONTEXT_TRACKING_USER 75 75 select HAVE_TIF_NOHZ 76 76 select HAVE_DEBUG_KMEMLEAK 77 77 select IOMMU_HELPER
+1 -1
arch/sparc/kernel/rtrap_64.S
··· 15 15 #include <asm/visasm.h> 16 16 #include <asm/processor.h> 17 17 18 - #ifdef CONFIG_CONTEXT_TRACKING 18 + #ifdef CONFIG_CONTEXT_TRACKING_USER 19 19 # define SCHEDULE_USER schedule_user 20 20 #else 21 21 # define SCHEDULE_USER schedule
+2 -2
arch/x86/Kconfig
··· 186 186 select HAVE_ASM_MODVERSIONS 187 187 select HAVE_CMPXCHG_DOUBLE 188 188 select HAVE_CMPXCHG_LOCAL 189 - select HAVE_CONTEXT_TRACKING if X86_64 190 - select HAVE_CONTEXT_TRACKING_OFFSTACK if HAVE_CONTEXT_TRACKING 189 + select HAVE_CONTEXT_TRACKING_USER if X86_64 190 + select HAVE_CONTEXT_TRACKING_USER_OFFSTACK if HAVE_CONTEXT_TRACKING_USER 191 191 select HAVE_C_RECORDMCOUNT 192 192 select HAVE_OBJTOOL_MCOUNT if HAVE_OBJTOOL 193 193 select HAVE_BUILDTIME_MCOUNT_SORT
+1 -1
arch/xtensa/Kconfig
··· 33 33 select HAVE_ARCH_KCSAN 34 34 select HAVE_ARCH_SECCOMP_FILTER 35 35 select HAVE_ARCH_TRACEHOOK 36 - select HAVE_CONTEXT_TRACKING 36 + select HAVE_CONTEXT_TRACKING_USER 37 37 select HAVE_DEBUG_KMEMLEAK 38 38 select HAVE_DMA_CONTIGUOUS 39 39 select HAVE_EXIT_THREAD
+2 -2
arch/xtensa/kernel/entry.S
··· 455 455 abi_call trace_hardirqs_off 456 456 1: 457 457 #endif 458 - #ifdef CONFIG_CONTEXT_TRACKING 458 + #ifdef CONFIG_CONTEXT_TRACKING_USER 459 459 l32i abi_tmp0, a1, PT_PS 460 460 bbci.l abi_tmp0, PS_UM_BIT, 1f 461 461 abi_call user_exit_callable ··· 544 544 j .Lrestore_state 545 545 546 546 .Lexit_tif_loop_user: 547 - #ifdef CONFIG_CONTEXT_TRACKING 547 + #ifdef CONFIG_CONTEXT_TRACKING_USER 548 548 abi_call user_enter_callable 549 549 #endif 550 550 #ifdef CONFIG_HAVE_HW_BREAKPOINT
+6 -6
include/linux/context_tracking.h
··· 10 10 #include <asm/ptrace.h> 11 11 12 12 13 - #ifdef CONFIG_CONTEXT_TRACKING 13 + #ifdef CONFIG_CONTEXT_TRACKING_USER 14 14 extern void ct_cpu_track_user(int cpu); 15 15 16 16 /* Called with interrupts disabled. */ ··· 52 52 { 53 53 enum ctx_state prev_ctx; 54 54 55 - if (IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK) || 55 + if (IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK) || 56 56 !context_tracking_enabled()) 57 57 return 0; 58 58 ··· 65 65 66 66 static inline void exception_exit(enum ctx_state prev_ctx) 67 67 { 68 - if (!IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK) && 68 + if (!IS_ENABLED(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK) && 69 69 context_tracking_enabled()) { 70 70 if (prev_ctx != CONTEXT_KERNEL) 71 71 ct_user_enter(prev_ctx); ··· 109 109 static __always_inline bool context_tracking_guest_enter(void) { return false; } 110 110 static inline void context_tracking_guest_exit(void) { } 111 111 112 - #endif /* !CONFIG_CONTEXT_TRACKING */ 112 + #endif /* !CONFIG_CONTEXT_TRACKING_USER */ 113 113 114 114 #define CT_WARN_ON(cond) WARN_ON(context_tracking_enabled() && (cond)) 115 115 116 - #ifdef CONFIG_CONTEXT_TRACKING_FORCE 116 + #ifdef CONFIG_CONTEXT_TRACKING_USER_FORCE 117 117 extern void context_tracking_init(void); 118 118 #else 119 119 static inline void context_tracking_init(void) { } 120 - #endif /* CONFIG_CONTEXT_TRACKING_FORCE */ 120 + #endif /* CONFIG_CONTEXT_TRACKING_USER_FORCE */ 121 121 122 122 #endif
+2 -2
include/linux/context_tracking_state.h
··· 22 22 } state; 23 23 }; 24 24 25 - #ifdef CONFIG_CONTEXT_TRACKING 25 + #ifdef CONFIG_CONTEXT_TRACKING_USER 26 26 extern struct static_key_false context_tracking_key; 27 27 DECLARE_PER_CPU(struct context_tracking, context_tracking); 28 28 ··· 45 45 static __always_inline bool context_tracking_enabled(void) { return false; } 46 46 static __always_inline bool context_tracking_enabled_cpu(int cpu) { return false; } 47 47 static __always_inline bool context_tracking_enabled_this_cpu(void) { return false; } 48 - #endif /* CONFIG_CONTEXT_TRACKING */ 48 + #endif /* CONFIG_CONTEXT_TRACKING_USER */ 49 49 50 50 #endif
+2 -2
init/Kconfig
··· 494 494 495 495 config VIRT_CPU_ACCOUNTING_GEN 496 496 bool "Full dynticks CPU time accounting" 497 - depends on HAVE_CONTEXT_TRACKING 497 + depends on HAVE_CONTEXT_TRACKING_USER 498 498 depends on HAVE_VIRT_CPU_ACCOUNTING_GEN 499 499 depends on GENERIC_CLOCKEVENTS 500 500 select VIRT_CPU_ACCOUNTING 501 - select CONTEXT_TRACKING 501 + select CONTEXT_TRACKING_USER 502 502 help 503 503 Select this option to enable task and CPU time accounting on full 504 504 dynticks systems. This accounting is implemented by watching every
+5 -1
kernel/context_tracking.c
··· 22 22 #include <linux/export.h> 23 23 #include <linux/kprobes.h> 24 24 25 + #ifdef CONFIG_CONTEXT_TRACKING_USER 26 + 25 27 #define CREATE_TRACE_POINTS 26 28 #include <trace/events/context_tracking.h> 27 29 ··· 254 252 initialized = true; 255 253 } 256 254 257 - #ifdef CONFIG_CONTEXT_TRACKING_FORCE 255 + #ifdef CONFIG_CONTEXT_TRACKING_USER_FORCE 258 256 void __init context_tracking_init(void) 259 257 { 260 258 int cpu; ··· 263 261 ct_cpu_track_user(cpu); 264 262 } 265 263 #endif 264 + 265 + #endif /* #ifdef CONFIG_CONTEXT_TRACKING_USER */
+1 -1
kernel/sched/core.c
··· 6559 6559 } while (need_resched()); 6560 6560 } 6561 6561 6562 - #if defined(CONFIG_CONTEXT_TRACKING) && !defined(CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK) 6562 + #if defined(CONFIG_CONTEXT_TRACKING_USER) && !defined(CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK) 6563 6563 asmlinkage __visible void __sched schedule_user(void) 6564 6564 { 6565 6565 /*
+20 -11
kernel/time/Kconfig
··· 73 73 74 74 If unsure, say N. 75 75 76 + config CONTEXT_TRACKING 77 + bool 78 + 76 79 if GENERIC_CLOCKEVENTS 77 80 menu "Timers subsystem" 78 81 ··· 114 111 # NO_HZ_COMMON dependency 115 112 # We need at least one periodic CPU for timekeeping 116 113 depends on SMP 117 - depends on HAVE_CONTEXT_TRACKING 114 + depends on HAVE_CONTEXT_TRACKING_USER 118 115 # VIRT_CPU_ACCOUNTING_GEN dependency 119 116 depends on HAVE_VIRT_CPU_ACCOUNTING_GEN 120 117 select NO_HZ_COMMON ··· 140 137 141 138 endchoice 142 139 143 - config CONTEXT_TRACKING 144 - bool 140 + config CONTEXT_TRACKING_USER 141 + bool 142 + depends on HAVE_CONTEXT_TRACKING_USER 143 + select CONTEXT_TRACKING 144 + help 145 + Track transitions between kernel and user on behalf of RCU and 146 + tickless cputime accounting. The former case relies on context 147 + tracking to enter/exit RCU extended quiescent states. 145 148 146 - config CONTEXT_TRACKING_FORCE 147 - bool "Force context tracking" 148 - depends on CONTEXT_TRACKING 149 + config CONTEXT_TRACKING_USER_FORCE 150 + bool "Force user context tracking" 151 + depends on CONTEXT_TRACKING_USER 149 152 default y if !NO_HZ_FULL 150 153 help 151 154 The major pre-requirement for full dynticks to work is to 152 - support the context tracking subsystem. But there are also 155 + support the user context tracking subsystem. But there are also 153 156 other dependencies to provide in order to make the full 154 157 dynticks working. 155 158 156 159 This option stands for testing when an arch implements the 157 - context tracking backend but doesn't yet fulfill all the 160 + user context tracking backend but doesn't yet fulfill all the 158 161 requirements to make the full dynticks feature working. 159 162 Without the full dynticks, there is no way to test the support 160 - for context tracking and the subsystems that rely on it: RCU 163 + for user context tracking and the subsystems that rely on it: RCU 161 164 userspace extended quiescent state and tickless cputime 162 165 accounting. This option copes with the absence of the full 163 - dynticks subsystem by forcing the context tracking on all 166 + dynticks subsystem by forcing the user context tracking on all 164 167 CPUs in the system. 165 168 166 169 Say Y only if you're working on the development of an 167 - architecture backend for the context tracking. 170 + architecture backend for the user context tracking. 168 171 169 172 Say N otherwise, this option brings an overhead that you 170 173 don't want in production.