Re: [RESEND PATCH v2] btrfs: prevent direct reclaim during compressed readahead

From: JP Kobryn (Meta)

Date: Mon Mar 30 2026 - 12:52:35 EST


Hi Qu,
Can you give v2 a look?

On 3/28/26 2:46 PM, JP Kobryn (Meta) wrote:
Under memory pressure, direct reclaim can kick in during compressed
readahead. This puts the associated task into D-state. Then shrink_lruvec()
disables interrupts when acquiring the LRU lock. Under heavy pressure,
we've observed reclaim can run long enough that the CPU becomes prone to
CSD lock stalls since it cannot service incoming IPIs. Although the CSD
lock stalls are the worst case scenario, we have found many more subtle
occurrences of this latency on the order of seconds, over a minute in some
cases.

Prevent direct reclaim during compressed readahead. This is achieved by
using different GFP flags at key points when the bio is marked for
readahead.

There are two functions that allocate during compressed readahead:
btrfs_alloc_compr_folio() and add_ra_bio_pages(). Both currently use
GFP_NOFS which includes __GFP_DIRECT_RECLAIM.

For the internal API call btrfs_alloc_compr_folio(), the signature changes
to accept an additional gfp_t parameter. At the readahead call site, it
gets flags similar to GFP_NOFS but stripped of __GFP_DIRECT_RECLAIM.
__GFP_NOWARN is added since these allocations are allowed to fail. Demand
reads still use full GFP_NOFS and will enter reclaim if needed. All other
existing call sites of btrfs_alloc_compr_folio() now explicitly pass
GFP_NOFS to retain their current behavior.

add_ra_bio_pages() gains a bool parameter which allows callers to specify
if they want to allow direct reclaim or not. In either case, the
__GFP_NOWARN flag was added unconditionally since the allocations are
speculative.

There has been some previous work done on calling add_ra_bio_pages() [0].
This patch is complementary: where that patch reduces call frequency, this
patch reduces the latency associated with those calls.

[0] https://lore.kernel.org/linux-btrfs/656838ec1232314a2657716e59f4f15a8eadba64.1751492111.git.boris@xxxxxx/

Signed-off-by: JP Kobryn (Meta) <jp.kobryn@xxxxxxxxx>
Reviewed-by: Mark Harmstone <mark@xxxxxxxxxxxxx>
---
v2:
- dropped patch 1/2, squashed into single patch based on David's feedback
- changed btrfs_alloc_compr_folio() signature instead of new _gfp variant
- update other existing callers to pass GFP_NOFS explicitly

v1: https://lore.kernel.org/linux-btrfs/20260320073445.80218-1-jp.kobryn@xxxxxxxxx/

[...]