diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-12-16 12:33:35 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-12-16 12:33:35 -0800 | 
| commit | 005b2a9dc819a1265a8c765595f8f6d88d6173d9 (patch) | |
| tree | 688107572f6b3e017fc7ccf54f552c6a30441a79 /arch/powerpc | |
| parent | 5ee863bec794f30bdf7fdf57ce0d9f579b0d1aa3 (diff) | |
| parent | 355fb9e2b78e78b38ec00f5cd9b05c6aceb98335 (diff) | |
| download | linux-005b2a9dc819a1265a8c765595f8f6d88d6173d9.tar.bz2 | |
Merge tag 'tif-task_work.arch-2020-12-14' of git://git.kernel.dk/linux-block
Pull TIF_NOTIFY_SIGNAL updates from Jens Axboe:
 "This sits on top of of the core entry/exit and x86 entry branch from
  the tip tree, which contains the generic and x86 parts of this work.
  Here we convert the rest of the archs to support TIF_NOTIFY_SIGNAL.
  With that done, we can get rid of JOBCTL_TASK_WORK from task_work and
  signal.c, and also remove a deadlock work-around in io_uring around
  knowing that signal based task_work waking is invoked with the sighand
  wait queue head lock.
  The motivation for this work is to decouple signal notify based
  task_work, of which io_uring is a heavy user of, from sighand. The
  sighand lock becomes a huge contention point, particularly for
  threaded workloads where it's shared between threads. Even outside of
  threaded applications it's slower than it needs to be.
  Roman Gershman <romger@amazon.com> reported that his networked
  workload dropped from 1.6M QPS at 80% CPU to 1.0M QPS at 100% CPU
  after io_uring was changed to use TIF_NOTIFY_SIGNAL. The time was all
  spent hammering on the sighand lock, showing 57% of the CPU time there
  [1].
  There are further cleanups possible on top of this. One example is
  TIF_PATCH_PENDING, where a patch already exists to use
  TIF_NOTIFY_SIGNAL instead. Hopefully this will also lead to more
  consolidation, but the work stands on its own as well"
[1] https://github.com/axboe/liburing/issues/215
* tag 'tif-task_work.arch-2020-12-14' of git://git.kernel.dk/linux-block: (28 commits)
  io_uring: remove 'twa_signal_ok' deadlock work-around
  kernel: remove checking for TIF_NOTIFY_SIGNAL
  signal: kill JOBCTL_TASK_WORK
  io_uring: JOBCTL_TASK_WORK is no longer used by task_work
  task_work: remove legacy TWA_SIGNAL path
  sparc: add support for TIF_NOTIFY_SIGNAL
  riscv: add support for TIF_NOTIFY_SIGNAL
  nds32: add support for TIF_NOTIFY_SIGNAL
  ia64: add support for TIF_NOTIFY_SIGNAL
  h8300: add support for TIF_NOTIFY_SIGNAL
  c6x: add support for TIF_NOTIFY_SIGNAL
  alpha: add support for TIF_NOTIFY_SIGNAL
  xtensa: add support for TIF_NOTIFY_SIGNAL
  arm: add support for TIF_NOTIFY_SIGNAL
  microblaze: add support for TIF_NOTIFY_SIGNAL
  hexagon: add support for TIF_NOTIFY_SIGNAL
  csky: add support for TIF_NOTIFY_SIGNAL
  openrisc: add support for TIF_NOTIFY_SIGNAL
  sh: add support for TIF_NOTIFY_SIGNAL
  um: add support for TIF_NOTIFY_SIGNAL
  ...
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/include/asm/thread_info.h | 5 | ||||
| -rw-r--r-- | arch/powerpc/kernel/signal.c | 2 | 
2 files changed, 5 insertions, 2 deletions
| diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index 46a210b03d2b..53115ae61495 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h @@ -90,6 +90,7 @@ void arch_setup_new_exec(void);  #define TIF_SYSCALL_TRACE	0	/* syscall trace active */  #define TIF_SIGPENDING		1	/* signal pending */  #define TIF_NEED_RESCHED	2	/* rescheduling necessary */ +#define TIF_NOTIFY_SIGNAL	3	/* signal notifications exist */  #define TIF_SYSCALL_EMU		4	/* syscall emulation active */  #define TIF_RESTORE_TM		5	/* need to restore TM FP/VEC/VSX */  #define TIF_PATCH_PENDING	6	/* pending live patching update */ @@ -115,6 +116,7 @@ void arch_setup_new_exec(void);  #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)  #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)  #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED) +#define _TIF_NOTIFY_SIGNAL	(1<<TIF_NOTIFY_SIGNAL)  #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)  #define _TIF_32BIT		(1<<TIF_32BIT)  #define _TIF_RESTORE_TM		(1<<TIF_RESTORE_TM) @@ -136,7 +138,8 @@ void arch_setup_new_exec(void);  #define _TIF_USER_WORK_MASK	(_TIF_SIGPENDING | _TIF_NEED_RESCHED | \  				 _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ -				 _TIF_RESTORE_TM | _TIF_PATCH_PENDING) +				 _TIF_RESTORE_TM | _TIF_PATCH_PENDING | \ +				 _TIF_NOTIFY_SIGNAL)  #define _TIF_PERSYSCALL_MASK	(_TIF_RESTOREALL|_TIF_NOERROR)  /* Bits in local_flags */ diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index d2c356f37077..a8bb0aca1d02 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c @@ -318,7 +318,7 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)  	if (thread_info_flags & _TIF_PATCH_PENDING)  		klp_update_patch_state(current); -	if (thread_info_flags & _TIF_SIGPENDING) { +	if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) {  		BUG_ON(regs != current->thread.regs);  		do_signal(current);  	} |