Alright, try this one. It should show whether this is a missing unplug
or not (which I think it is, hence the stall in qrcu sync). A process
may legitimately block with plugged requests, that sometimes happens for
bio/rq allocation etc. In that case we do want to unplug anyway though,
as I don't think we should hold requests plugged even for a merge if we
are going to block. And the below means we can move this out of
io_schedule() and eliminate the io_schedule() requirement that I'm not
too fond of, as I don't want to reintroduce all the problems we had with
missing unplugs in the 2.4 kernels.
But for now this is just a debug test, can you see if xfs with barriers
for that kernel now works as expected?
diff --git a/kernel/sched.c b/kernel/sched.c
index e209901..6a54e4d 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -3434,6 +3434,8 @@ asmlinkage void __sched schedule(void)
print_irqtrace_events(current);
dump_stack();
}
+ if (unlikely(current->io_context && current->io_context->plugged))
+ blk_replug_current_nested();
profile_hit(SCHED_PROFILING, __builtin_return_address(0));
need_resched:
--
Jens Axboe
-