On Mon, Aug 21, 2023 at 10:25:34AM +0800, Tong Tiangen wrote: > +++ b/mm/memory-failure.c > @@ -546,24 +546,26 @@ static void kill_procs(struct list_head *to_kill, int forcekill, bool fail, > * Find a dedicated thread which is supposed to handle SIGBUS(BUS_MCEERR_AO) > * on behalf of the thread group. Return task_struct of the (first found) > * dedicated thread if found, and return NULL otherwise. > - * > - * We already hold read_lock(&tasklist_lock) in the caller, so we don't > - * have to call rcu_read_lock/unlock() in this function. > */ > static struct task_struct *find_early_kill_thread(struct task_struct *tsk) > { > struct task_struct *t; > > + rcu_read_lock(); > for_each_thread(tsk, t) { > if (t->flags & PF_MCE_PROCESS) { > if (t->flags & PF_MCE_EARLY) > - return t; > + goto found; > } else { > if (sysctl_memory_failure_early_kill) > - return t; > + goto found; > } > } > - return NULL; > + > + t = NULL; > +found: > + rcu_read_unlock(); > + return t; > } I don't understand why you need to modify find_early_kill_thread() at all. It's still true that the caller holds _a_ lock protecting it; the comment needs to be updated to reflect that it might be the RCU lock or the tasklist_lock (or did you change all callers?), but there's no need for this function to take the RCU lock itself, afaics?