Re: [PATCH v2 0/4] allocate extent_buffer GFP_NOFAIL with unlocked retry

David Sterba <[email protected]> Thu, 23 Jul 2026 04:58:57 +0200
Newsgroups org.kernel.vger.linux-btrfs
Message-ID <[email protected]>
On Tue, Jul 21, 2026 at 03:42:11PM -0700, Boris Burkov wrote:
> >From sampled fleet data measuring lock holders that go into direct
> reclaim with a waiter present when they eventually unlock, we have
> observed ~15% of those are btrfs extent_buffer allocations in
> btrfs_search_slot() done while holding btree locks. This is the single
> largest category. Additionally, a large source of hung_task timeouts is
> both btree waiters and direct reclaiming btree allocations, which
> further motivates the desire to drive down this source of stalls and
> contention.
> 
> The aim of this series is to allow us to allocate the extent_buffer,
> btrfs_folio_state, and the extent_buffer folios with GFP_NOWAIT then
> fallback with EAGAIN to outside the critical section to retry with
> GFP_NOFS | GFP_NOFAIL without any locks held.
> 
> This is analogous to how we must drop locks to read an extent_buffer and
> then EAGAIN.
> 
> The series does not manage to completely eliminate allocations from this
> lock holding path, as we also allocate inside xarray functions for the
> extent_buffer xarray and the btree_inode mapping xarray, the latter of
> which is done via filemap_add_folio() with no reserve type API. Luckily,
> those particular allocations are small cached slab allocations and have
> nearly no contribution to the production reclaim fueled contention.
> 
> Changelog:
> v2: 
> - rebase
> - dropped the inhibit array allocation patch

Reviewed-by: David Sterba <[email protected]>

The logic makes sense to avoid the stalls. There's no sashiko review
because the patches did not apply. You may want to resend a rebased
version to see if I have missed something, there are minor typos or
style things but that can be fixed during merge.