mirror of
https://github.com/torvalds/linux
synced 2024-10-06 19:34:19 +00:00
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>
This commit is contained in:
parent
2a0aafce96
commit
24a9c54182
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# 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
|
||||||
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
|
||||||
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
|
||||||
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 @@
|
||||||
#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
|
||||||
|
|
||||||
.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_\@)
|
||||||
* 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_\@)
|
||||||
.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
|
||||||
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
|
||||||
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 @@
|
||||||
.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:
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
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 @@
|
||||||
#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
|
||||||
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:
|
||||||
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:
|
||||||
*/
|
*/
|
||||||
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:
|
||||||
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
|
||||||
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 @@
|
||||||
#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
|
||||||
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
|
||||||
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
|
||||||
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:
|
||||||
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 @@
|
||||||
#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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
|
|
||||||
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; }
|
||||||
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 {
|
||||||
} 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)
|
||||||
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
|
||||||
|
|
||||||
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 @@
|
||||||
#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)
|
||||||
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)
|
||||||
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)
|
||||||
} 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
|
||||||
|
|
||||||
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
|
||||||
# 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
|
||||||
|
|
||||||
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.
|
||||||
|
|
Loading…
Reference in a new issue