Re: block: fix blk_queue_split() resource exhaustion
From: Lars Ellenberg
Date: Tue Jun 28 2016 - 04:25:01 EST
On Fri, Jun 24, 2016 at 11:15:47AM -0400, Mike Snitzer wrote:
> On Fri, Jun 24 2016 at 10:27am -0400,
> Lars Ellenberg <lars.ellenberg@xxxxxxxxxx> wrote:
>
> > On Fri, Jun 24, 2016 at 07:36:57PM +0800, Ming Lei wrote:
> > > >
> > > > This is not a theoretical problem.
> > > > At least int DRBD, and an unfortunately high IO concurrency wrt. the
> > > > "max-buffers" setting, without this patch we have a reproducible deadlock.
> > >
> > > Is there any log about the deadlock? And is there any lockdep warning
> > > if it is enabled?
> >
> > In DRBD, to avoid potentially very long internal queues as we wait for
> > our replication peer device and local backend, we limit the number of
> > in-flight bios we accept, and block in our ->make_request_fn() if that
> > number exceeds a configured watermark ("max-buffers").
> >
> > Works fine, as long as we could assume that once our make_request_fn()
> > returns, any bios we "recursively" submitted against the local backend
> > would be dispatched. Which used to be the case.
>
> It'd be useful to know whether this patch fixes your issue:
> https://patchwork.kernel.org/patch/7398411/
I would assume so.
because if current is blocked for any reason,
it will dispatch all bios that are still on current->bio_list
to be processed from other contexts.
Which means we will not deadlock, but make progress,
if the unblock of current depends on processing of those bios.
Also see my other mail on the issue,
where I try to better explain the mechanics of "my" deadlock.
Lars