From: Kyrylo Biryuk <illofspeed@gmail.com>
To: dm-devel@lists.linux.dev
Cc: mpatocka@redhat.com, snitzer@kernel.org, agk@redhat.com,
bmarzins@redhat.com, dlemoal@kernel.org, hare@kernel.org,
hare@suse.de, linux-kernel@vger.kernel.org
Subject: [PATCH v7 0/2] dm zoned: fix idle reclaim busy loops
Date: Tue, 3 Nov 2026 23:04:36 +0100 [thread overview]
Message-ID: <20261103220438.510609-1-illofspeed@gmail.com> (raw)
Two dm-zoned reclaim fixes for the 7.4 cycle and stable, split from the
earlier series as Mikulas asked after reverting v4 from dm-7.4: these
two carry Fixes and Cc: stable; the third change, "dm zoned: keep
polling for idle reclaim after a reclaim pass", will follow separately
for 7.5 and depends on patch 1 of this series.
1/2 stops dmz_reclaim_work() from rescheduling itself at once when a
pass cannot make progress (-ENOSPC: no zone to copy into; -EBUSY: no
zone to reclaim). On an idle target that retry ran without pause and
called dmz_check_dev() on every pass. 2/2 stops idle reclaim from
copying a random zone into another random zone, which frees nothing;
its -ENOSPC result relies on the back-off from 1/2, so the order
matters for backports too.
v5: https://lore.kernel.org/r/20261013145522.17499-1-illofspeed@gmail.com
Mikulas's request:
https://lore.kernel.org/r/b7e35437-de42-d078-e75a-1f08541eb725@redhat.com
Damien on v5 4/4:
https://lore.kernel.org/r/bf59b38e-635d-48b8-861f-e50961472e92@kernel.org
Changes since v5 (posted on 2026-10-13; a v6 was prepared but never
sent):
- Rebased on 7.4-rc1 without conflicts; its dm-zoned sources are
identical to those of 7.3-rc7, on which v5 was based.
- 1/2 (was "dm zoned: back off when reclaim finds no destination zone")
also takes the -EBUSY back-off from v5 4/4, as Damien asked ("This is
undoing what patch 1 does"), but not v5 4/4's dmz_should_reclaim()
change (idle reclaim only when a zone holds data). Without the
polling patch that change stopped the idle poll after a complete idle
drain, so later data was not reclaimed until the next allocation;
the back-off alone stops both loops. Hannes's and Damien's
Reviewed-by from v5 1/4 are dropped because the patch changed, as is
Hannes's later one on v3 1/3 (2026-10-21).
- 2/2: code unchanged since v3; Damien's Reviewed-by kept, Hannes's
added from his reply to v3 2/3 (2026-10-21).
- The polling patch is no longer part of this series (see above).
Hannes, your comment on v3 3/3 concerns code that v4 moved into
dmz_schedule_reclaim(), as Damien asked. The polling patch keeps that
form, which avoids one extra run of the work after a pass that leaves
reclaim not needed; if you prefer the unconditional reschedule,
please say so and I will change it.
- The Assisted-by tags are gone, following commit 1e035297ffda ("docs:
remove Assisted-by references"); tool use is described below.
- Commit messages: test results for exactly these patches on 7.4-rc1;
measured rates are SCSI request counts, not commands reaching the
drives.
Tested on 7.4-rc1 with emulated host-managed drives (scsi_debug),
RAM-backed: idle request rate and reclaim passes against the stock
module (1/2), the random-to-random case on a two-device target (2/2),
and checksums of all written data; details are in the commit messages.
md/dm-zoned reassembly after target removal was also clean, and a target
suspend and a "reclaim" message each landed during a copy with no hang
or kernel warning.
Also tested on three 27 TB host-managed SATA drives, each a
single-device dm-zoned target (998 random zones of 256 MiB) used as an
md RAID5 member under dm-crypt and XFS, with the stock module and with
both patches built out of tree for 7.2.10 (whose dm-zoned sources differ
from 7.4-rc1 only in three places where 7.2.10 open-codes
clear_and_wake_up_bit()). One run per module, kprobes attached
throughout; the drives sit behind a SATA port multiplier on a Marvell
88SE9235, and two other drives on the same controller were being
zero-filled at about 218 MB/s each, which affects the absolute numbers:
- idle for 300 s with all random zones free: stock, about 32.5 million
reclaim passes per worker, each with a TEST UNIT READY that libata
completes in software (about 108,000 SCSI requests per second per
member) and about 915 s of system CPU time across all CPUs; patched,
29-30 passes per worker, no dmz_check_dev() call, 58 requests per
member and about 46 s of system CPU time. Those passes issue no I/O:
the requests come with the target's periodic metadata flush;
- 300 s of single-threaded random 4 KiB O_DIRECT overwrites spread over
1,100 chunks (more chunks than random zones), with dm-zoned's free
random zone percentage at or below 30 (at most 309 of 998 free) in
72-79% of the samples: 2,457 (stock) and 2,395 (patched) writes,
99th percentile latency 0.49 s and 0.48 s;
- a target suspend with the array running, and removal of one
member's dm-zoned target after the array was stopped, each while
reclaim was copying a full zone (patched): each waited about 11 s
for the copy to end, with no hang or kernel warning (with stock,
reclaim on the member to be suspended had stopped after a busy pass,
so there was no copy to overlap; the stock removal also waited for
its copy);
- sha256 of all written data, read back at the end of each run: no
mismatch; md parity checks of every stripe of the suspend/removal
test and of a random sample (about 4%) of the other written stripes:
no mismatch.
2/2's case does not arise on these single-device targets. As with the
stock module, reclaim still stops after a pass that ends while the
target is busy and reclaim is not needed (here: after a busy pass at
31% free, no pass for 600 s); the polling patch addresses that.
Not tested:
- the back-off while the target is busy: in the overwrite test every
reclaim pass copied a zone, so no pass ended with -ENOSPC or -EBUSY;
- the -ENOSPC back-off on a single-device target without cache zones
(found by code inspection) and recovery after a sequential zone is
freed (neither test setup could establish those states);
- the effect of the cache-to-random fallback that 2/2 keeps: 6 such
copies completed while the two-device target was being filled, but
the test of its effect could not establish its starting state;
- system reboot and shutdown; only stopping and reassembling the md
array and the dm-zoned targets was exercised;
- stable kernels at run time, other than the 7.2.10 runs above. Both
patches apply with at most a 2-line offset to 7.3.1, 7.2.15, 6.18.60,
6.12.115, 6.6.161, 6.1.191, 5.15.224 and 5.10.273, and the dm-zoned
objects build there without warnings (x86-64 defconfig plus dm-zoned,
W=1).
I used LLM coding assistants for root-cause analysis, drafts of the
code and changelogs, the test harnesses and reviews. I reviewed the code
and changed it where needed, and I am responsible for these patches.
Kyrylo Biryuk (2):
dm zoned: back off when reclaim cannot make progress
dm zoned: do not reclaim a random zone into another random zone
drivers/md/dm-zoned-reclaim.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
--
2.43.0
next reply other threads:[~2026-11-03 22:04 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 22:04 Kyrylo Biryuk [this message]
2026-11-03 22:04 ` [PATCH v7 1/2] dm zoned: back off when reclaim cannot make progress Kyrylo Biryuk
2026-11-03 22:22 ` Damien Le Moal
2026-11-03 22:04 ` [PATCH v7 2/2] dm zoned: do not reclaim a random zone into another random zone Kyrylo Biryuk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261103220438.510609-1-illofspeed@gmail.com \
--to=illofspeed@gmail.com \
--cc=agk@redhat.com \
--cc=bmarzins@redhat.com \
--cc=dlemoal@kernel.org \
--cc=dm-devel@lists.linux.dev \
--cc=hare@kernel.org \
--cc=hare@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mpatocka@redhat.com \
--cc=snitzer@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®