Commit bba90e09 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'core-core-2022-03-21' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull core process handling RT latency updates from Thomas Gleixner:

 - Reduce the amount of work to release a task stack in context switch.
   There is no real reason to do cgroup accounting and memory freeing in
   this performance sensitive context.

   Aside of this the invoked functions cannot be called from this
   preemption disabled context on PREEMPT_RT enabled kernels. Solve this
   by moving the accounting into do_exit() and delaying the freeing of
   the stack unless the vmap stack can be cached.

 - Provide a mechanism to delay raising signals from atomic context on
   PREEMPT_RT enabled kernels as sighand::lock cannot be acquired. Store
   the information in the task struct and raise it in the exit path.

* tag 'core-core-2022-03-21' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  signal, x86: Delay calling signals in atomic on RT enabled kernels
  fork: Use IS_ENABLED() in account_kernel_stack()
  fork: Only cache the VMAP stack in finish_task_switch()
  fork: Move task stack accounting to do_exit()
  fork: Move memcg_charge_kernel_stack() into CONFIG_VMAP_STACK
  fork: Don't assign the stack pointer in dup_task_struct()
  fork, IA64: Provide alloc_thread_stack_node() for IA64
  fork: Duplicate task_struct before stack allocation
  fork: Redo ifdefs around task stack handling
parents 3fd33273 bf9ad37d
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -55,15 +55,15 @@ struct thread_info {
#ifndef ASM_OFFSETS_C
/* how to get the thread information struct from C */
#define current_thread_info()	((struct thread_info *) ((char *) current + IA64_TASK_SIZE))
#define alloc_thread_stack_node(tsk, node)	\
#define arch_alloc_thread_stack_node(tsk, node)	\
		((unsigned long *) ((char *) (tsk) + IA64_TASK_SIZE))
#define task_thread_info(tsk)	((struct thread_info *) ((char *) (tsk) + IA64_TASK_SIZE))
#else
#define current_thread_info()	((struct thread_info *) 0)
#define alloc_thread_stack_node(tsk, node)	((unsigned long *) 0)
#define arch_alloc_thread_stack_node(tsk, node)	((unsigned long *) 0)
#define task_thread_info(tsk)	((struct thread_info *) 0)
#endif
#define free_thread_stack(tsk)	/* nothing */
#define arch_free_thread_stack(tsk)	/* nothing */
#define task_stack_page(tsk)	((void *)(tsk))

#define __HAVE_THREAD_FUNCTIONS
+1 −0
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ config X86
	select ARCH_WANTS_NO_INSTR
	select ARCH_WANT_HUGE_PMD_SHARE
	select ARCH_WANT_LD_ORPHAN_WARN
	select ARCH_WANTS_RT_DELAYED_SIGNALS
	select ARCH_WANTS_THP_SWAP		if X86_64
	select ARCH_HAS_PARANOID_L1D_FLUSH
	select BUILDTIME_TABLE_SORT
+3 −0
Original line number Diff line number Diff line
@@ -1090,6 +1090,9 @@ struct task_struct {
	/* Restored if set_restore_sigmask() was used: */
	sigset_t			saved_sigmask;
	struct sigpending		pending;
#ifdef CONFIG_RT_DELAYED_SIGNALS
	struct kernel_siginfo		forced_info;
#endif
	unsigned long			sas_ss_sp;
	size_t				sas_ss_size;
	unsigned int			sas_ss_flags;
+2 −0
Original line number Diff line number Diff line
@@ -79,6 +79,8 @@ static inline void *try_get_task_stack(struct task_struct *tsk)
static inline void put_task_stack(struct task_struct *tsk) {}
#endif

void exit_task_stack_account(struct task_struct *tsk);

#define task_stack_end_corrupted(task) \
		(*(end_of_stack(task)) != STACK_END_MAGIC)

+11 −1
Original line number Diff line number Diff line
@@ -132,4 +132,14 @@ config SCHED_CORE
	  which is the likely usage by Linux distributions, there should
	  be no measurable impact on performance.

config ARCH_WANTS_RT_DELAYED_SIGNALS
	bool
	help
	  This option is selected by architectures where raising signals
	  can happen in atomic contexts on PREEMPT_RT enabled kernels. This
	  option delays raising the signal until the return to user space
	  loop where it is also delivered. X86 requires this to deliver
	  signals from trap handlers which run on IST stacks.

config RT_DELAYED_SIGNALS
	def_bool PREEMPT_RT && ARCH_WANTS_RT_DELAYED_SIGNALS
Loading