Re: [PATCH 2/3] mm: support fallible mempool_alloc_bulk()
From: Eric Biggers
Date: Mon Aug 10 2026 - 14:23:35 EST
On Mon, Aug 10, 2026 at 10:21:15AM -0700, Christoph Hellwig wrote:
> On Mon, Aug 10, 2026 at 09:14:04AM -0700, Eric Biggers wrote:
> > On Mon, Aug 10, 2026 at 09:00:11AM -0700, Christoph Hellwig wrote:
> > > On Thu, Aug 06, 2026 at 03:10:30PM -0700, Eric Biggers wrote:
> > > > To fix a deadlock, blk-crypto-fallback needs to be able to make fallible
> > > > mempool_alloc_bulk() allocations.
> > >
> > > It doesn't. fallible mempool allocations are a concept that doesn't
> > > make much sense. Please just go straight to the backing page allocator
> > > instead for callers that do not need the mempool guarantees.
> >
> > It does make sense. When alloc_pages_bulk() doesn't completely succeed,
> > there still might be pages available in the mempool.
>
> But they should not go to a caller that does not need the mempool.
The caller does need the mempool.
> > blk_crypto_alloc_enc_bio() should try to take them before falling back
> > to scheduling the rescuer kworker. The rescuer encounters scheduling
> > overhead and is single-threaded, so it's slow and should be used only
> > when absolutely necessary.
>
> No, it should just try a regular non-bulk alloc_pages (and eventually
> alloc_pages_bulk should do that fallback for the callers, but that's
> a separate discussion).
It already does that. blk_crypto_alloc_enc_bio() first calls
alloc_pages_bulk(). If it doesn't completely succeed, it calls
mempool_alloc_bulk() to get the rest. That itself tries regular
allocations again before actually using the mempool. It needs a
guaranteed allocation, so it needs the mempool.
Now, as I explained in this patchset, whether this code can wait forever
for the mempool actually depends on whether it's a recursive bio
submission or not. If it is, then it cannot wait, but ultimately it
does still need to use the mempool to get a guaranteed allocation.
Falling back to the rescuer kthread (which can wait on the mempool)
solves that. But before taking that slow fallback, it's much more
efficient to check the mempool directly first, since pages may be
available there (and in fact it's fairly likely that they will be, since
regular allocations are always used first). The whole point of the
mempool is that it can be used when the regular allocation fails.
This is also the only caller of mempool_alloc_bulk(). So I'm kind of
confused why it would not be allowed to implement the behavior that is
desired here, especially when the non-bulk API offers it already.
- Eric