Thread (44 messages) 44 messages, 2 authors, 2021-01-15

Re: [PATCH v5 09/21] powerpc/64: context tracking remove _TIF_NOHZ

From: Christophe Leroy <hidden>
Date: 2021-01-13 14:53:37


Le 13/01/2021 à 08:32, Nicholas Piggin a écrit :
Add context tracking to the system call handler explicitly, and remove
_TIF_NOHZ.

This saves 35 cycles on gettid system call cost on POWER9 with a
CONFIG_NOHZ_FULL kernel.
35 cycles among 100 cycles, or among 5000 cycles ? I meant what pourcentage to you win ?

Christophe
quoted hunk ↗ jump to hunk
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
  arch/powerpc/Kconfig                   |  1 -
  arch/powerpc/include/asm/thread_info.h |  4 +---
  arch/powerpc/kernel/ptrace/ptrace.c    |  4 ----
  arch/powerpc/kernel/signal.c           |  4 ----
  arch/powerpc/kernel/syscall_64.c       | 10 ++++++++++
  5 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 107bb4319e0e..28d5a1b1510f 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -196,7 +196,6 @@ config PPC
  	select HAVE_STACKPROTECTOR		if PPC64 && $(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r13)
  	select HAVE_STACKPROTECTOR		if PPC32 && $(cc-option,-mstack-protector-guard=tls -mstack-protector-guard-reg=r2)
  	select HAVE_CONTEXT_TRACKING		if PPC64
-	select HAVE_TIF_NOHZ			if PPC64
  	select HAVE_DEBUG_KMEMLEAK
  	select HAVE_DEBUG_STACKOVERFLOW
  	select HAVE_DYNAMIC_FTRACE
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h
index 3d8a47af7a25..386d576673a1 100644
--- a/arch/powerpc/include/asm/thread_info.h
+++ b/arch/powerpc/include/asm/thread_info.h
@@ -94,7 +94,6 @@ void arch_setup_new_exec(void);
  #define TIF_PATCH_PENDING	6	/* pending live patching update */
  #define TIF_SYSCALL_AUDIT	7	/* syscall auditing active */
  #define TIF_SINGLESTEP		8	/* singlestepping active */
-#define TIF_NOHZ		9	/* in adaptive nohz mode */
  #define TIF_SECCOMP		10	/* secure computing */
  #define TIF_RESTOREALL		11	/* Restore all regs (implies NOERROR) */
  #define TIF_NOERROR		12	/* Force successful syscall return */
@@ -128,11 +127,10 @@ void arch_setup_new_exec(void);
  #define _TIF_UPROBE		(1<<TIF_UPROBE)
  #define _TIF_SYSCALL_TRACEPOINT	(1<<TIF_SYSCALL_TRACEPOINT)
  #define _TIF_EMULATE_STACK_STORE	(1<<TIF_EMULATE_STACK_STORE)
-#define _TIF_NOHZ		(1<<TIF_NOHZ)
  #define _TIF_SYSCALL_EMU	(1<<TIF_SYSCALL_EMU)
  #define _TIF_SYSCALL_DOTRACE	(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
  				 _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \
-				 _TIF_NOHZ | _TIF_SYSCALL_EMU)
+				 _TIF_SYSCALL_EMU)
  
  #define _TIF_USER_WORK_MASK	(_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
  				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
diff --git a/arch/powerpc/kernel/ptrace/ptrace.c b/arch/powerpc/kernel/ptrace/ptrace.c
index 3d44b73adb83..4f3d4ff3728c 100644
--- a/arch/powerpc/kernel/ptrace/ptrace.c
+++ b/arch/powerpc/kernel/ptrace/ptrace.c
@@ -262,8 +262,6 @@ long do_syscall_trace_enter(struct pt_regs *regs)
  {
  	u32 flags;
  
-	user_exit();
-
  	flags = READ_ONCE(current_thread_info()->flags) &
  		(_TIF_SYSCALL_EMU | _TIF_SYSCALL_TRACE);
  
@@ -340,8 +338,6 @@ void do_syscall_trace_leave(struct pt_regs *regs)
  	step = test_thread_flag(TIF_SINGLESTEP);
  	if (step || test_thread_flag(TIF_SYSCALL_TRACE))
  		tracehook_report_syscall_exit(regs, step);
-
-	user_enter();
  }
  
  void __init pt_regs_check(void);
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
index 53782aa60ade..9ded046edb0e 100644
--- a/arch/powerpc/kernel/signal.c
+++ b/arch/powerpc/kernel/signal.c
@@ -282,8 +282,6 @@ static void do_signal(struct task_struct *tsk)
  
  void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
  {
-	user_exit();
-
  	if (thread_info_flags & _TIF_UPROBE)
  		uprobe_notify_resume(regs);
  
@@ -299,8 +297,6 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
  		tracehook_notify_resume(regs);
  		rseq_handle_notify_resume(NULL, regs);
  	}
-
-	user_enter();
  }
  
  static unsigned long get_tm_stackpointer(struct task_struct *tsk)
diff --git a/arch/powerpc/kernel/syscall_64.c b/arch/powerpc/kernel/syscall_64.c
index dd87b2118620..d7d256a7a41f 100644
--- a/arch/powerpc/kernel/syscall_64.c
+++ b/arch/powerpc/kernel/syscall_64.c
@@ -1,9 +1,11 @@
  // SPDX-License-Identifier: GPL-2.0-or-later
  
+#include <linux/context_tracking.h>
  #include <linux/err.h>
  #include <asm/asm-prototypes.h>
  #include <asm/kup.h>
  #include <asm/cputime.h>
+#include <asm/interrupt.h>
  #include <asm/hw_irq.h>
  #include <asm/interrupt.h>
  #include <asm/kprobes.h>
@@ -28,6 +30,9 @@ notrace long system_call_exception(long r3, long r4, long r5,
  	if (IS_ENABLED(CONFIG_PPC_IRQ_SOFT_MASK_DEBUG))
  		BUG_ON(irq_soft_mask_return() != IRQS_ALL_DISABLED);
  
+	CT_WARN_ON(ct_state() == CONTEXT_KERNEL);
+	user_exit_irqoff();
+
  	trace_hardirqs_off(); /* finish reconciling */
  
  	if (IS_ENABLED(CONFIG_PPC_BOOK3S))
@@ -182,6 +187,8 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
  	unsigned long ti_flags;
  	unsigned long ret = 0;
  
+	CT_WARN_ON(ct_state() == CONTEXT_USER);
+
  	kuap_check_amr();
  
  	regs->result = r3;
@@ -258,8 +265,11 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3,
  		}
  	}
  
+	user_enter_irqoff();
+
  	/* scv need not set RI=0 because SRRs are not used */
  	if (unlikely(!prep_irq_for_enabled_exit(!scv))) {
+		user_exit_irqoff();
  		local_irq_enable();
  		goto again;
  	}
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help