From: Oleg Nesterov Date: Thu, 24 Aug 2023 14:32:01 +0000 (+0200) Subject: change next_thread() to use __next_thread() ?: group_leader X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=d639cf4abb4d171ab2456904da5668c42b5c1937;p=linux.git change next_thread() to use __next_thread() ?: group_leader This relies on fact that group leader is always the 1st entry in the signal->thread_head list. With or without this change, if the lockless next_thread(last_thread) races with exec it can return the old or the new leader. We are almost ready to kill task->thread_group, after this change its only user is thread_group_empty(). Link: https://lkml.kernel.org/r/20230824143201.GB31222@redhat.com Signed-off-by: Oleg Nesterov Cc: Eric W. Biederman Cc: Peter Zijlstra Signed-off-by: Andrew Morton --- diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h index 7fb34b8cda54f..cffc882d367f5 100644 --- a/include/linux/sched/signal.h +++ b/include/linux/sched/signal.h @@ -726,10 +726,9 @@ static inline struct task_struct *__next_thread(struct task_struct *p) thread_node); } -static inline struct task_struct *next_thread(const struct task_struct *p) +static inline struct task_struct *next_thread(struct task_struct *p) { - return list_entry_rcu(p->thread_group.next, - struct task_struct, thread_group); + return __next_thread(p) ?: p->group_leader; } static inline int thread_group_empty(struct task_struct *p)