Re: [PATCH] md: fix hang in stop_sync_thread by setting THREAD_WAKEUP in md_wakeup_thread_directly

"Yu Kuai" <[email protected]>
Newsgroups gmane.linux.kernel,gmane.linux.raid
Message-ID <[email protected]>
Hi,

在 2026/1/11 6:12, Jiasheng Jiang 写道:
> Analysis of md.c shows that the md_thread() loop relies on the
> THREAD_WAKEUP bit being set to progress beyond wait_event(). However,
> md_wakeup_thread_directly() currently only calls wake_up_process()
> without setting this bit.
>
> As a result, a thread woken by md_wakeup_thread_directly() will find the
> wait condition remains False and immediately return to sleep without
> executing its run() handler. In the case of stop_sync_thread(), this
> causes the sync thread to ignore the interruption request, leading to
> a permanent hang.

This doesn't look correct, md_wakeup_thread_directly() is not used in the
case to start a new md_do_sync() as you described. It's used in the case
that md_do_sync() is already running and stuck somewhere and could be
interrupted by setting MD_RECOVERY_INTR.

>
> Fix this by ensuring the THREAD_WAKEUP bit is set before waking the
> process in md_wakeup_thread_directly().
>
> Signed-off-by: Jiasheng Jiang <[email protected]>
> ---
>   drivers/md/md.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 6d73f6e196a9..8709e9fd7f39 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -8512,8 +8512,10 @@ static void md_wakeup_thread_directly(struct md_thread __rcu **thread)
>   
>   	rcu_read_lock();
>   	t = rcu_dereference(*thread);
> -	if (t)
> +	if (t) {
> +		set_bit(THREAD_WAKEUP, &t->flags);
>   		wake_up_process(t->tsk);
> +	}
>   	rcu_read_unlock();
>   }
>   

-- 
Thansk,
Kuai
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.