Re: [BUG] RCU hang with io_uring nvme polling
Keith Busch <[email protected]>
| Newsgroups | org.kernel.vger.io-uring,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <akLmZDexipAtsex_@kbusch-mbp> |
On Mon, Jun 29, 2026 at 04:47:00PM -0400, Ben Carey wrote: > On Fri, Jun 26, 2026 at 12:33 PM Keith Busch <[email protected]> wrote: > > The test has 1 polling queue with 2 jobs dispatching. One of the job's > > polled the completions for both. The other job is polling for no reason > > at all with nothing outstanding. The only thing that can break us out of > > that loop now is need_resched(), but that appears to never return true. > > Inspired by this I tried to find a place where one thread polls on a job that's > already finished. I found that a race to io_check_iopoll causes one thread to > enter the polling loop when another has already finished on it. Putting > io_check_iopoll behind a spinlock seems to fix it, though I imagine a more > elegant fix is out there (reusing a different lock, not using expensive locks, > a smarter place to check for racing, etc.) I can see why that resolves your observation, but I don't think we can do this. We're ultimately polling for a hardware event, and this layer is too high a level for serializing these things. This could be a multi-device or multi-queue backing storage where the completion pollings should occur concurrently.