md: add cond_resched() to md_do_sync()'s skip path

When sync_request() reports a skipped region (*skipped == 1),
md_do_sync()'s main loop advances the cursor and takes an early
continue:

	j += sectors;
	...
	if (last_check + window > io_sectors || j == max_sectors)
		continue;

If the personality returns a small span per call (raid10 recovery
returns only 128 sectors), syncing a large, mostly clean array iterates
this branch an enormous number of times without ever yielding the CPU.
On a non-preemptive kernel the resync thread then trips the soft-lockup
watchdog:

  watchdog: BUG: soft lockup - CPU#149 stuck for 313s! [mdX_resync]
   md_bitmap_start_sync+0x6f/0xe0
   raid10_sync_request+0x2c9/0x1530 [raid10]
   md_do_sync+0x810/0x1030
   md_thread+0xa7/0x150

Add a cond_resched().  This does not reduce the wasted iterations; the
excessive iteration count is a raid10 problem addressed separately.

Signed-off-by: Yunye Zhao <yunye.zhao@linux.alibaba.com>
Link: https://patch.msgid.link/20260723135535.101995-3-yunye.zhao@linux.alibaba.com
Signed-off-by: Yu Kuai <yukuai@fygo.io>
This commit is contained in:
Yunye Zhao
2026-07-23 21:55:34 +08:00
committed by Yu Kuai
parent 47f1441b28
commit 162eb5ba79

View File

@@ -9958,8 +9958,10 @@ void md_do_sync(struct md_thread *thread)
*/
md_new_event();
if (last_check + window > io_sectors || j == max_sectors)
if (last_check + window > io_sectors || j == max_sectors) {
cond_resched();
continue;
}
last_check = io_sectors;
repeat: