[PATCH v4 1/8] zbd: fix zone selection of random writes
Shin'ichiro Kawasaki <[email protected]> Tue, 3 Mar 2026 10:31:52 +0900
| Newsgroups | org.kernel.vger.fio |
|---|---|
| Message-ID | <[email protected]> |
In zonemode=zbd, random write workloads targeting zoned block devices with max write zones limits such as max_open_zones can not do write operations to randomly chosen offset because of the zoned block device constraint of writing at write pointers. To adjust the offsets to valid positions, fio calls the function zbd_convert_to_write_zone(). This function checks the current write target zones as the next offset candidates but may fail depending on the conditions of those zones. In such cases, the function waits for zone condition changes before retrying. However, the retry logic begins with the zone where the previous attempt ended, and selects the zones that were previously write target. Consequently, the same zones are repeatedly chosen for writing, resulting in writes concentrating on certain zones despite the workload specifying random write. To ensure proper zone selection for random writes, modify zbd_convert_to_write_zone() to retry the zone selection based on the original offset provided to the function. The local variable 'zb' keeps the reference to the zone corresponding to the original offset. Use 'zb' at the retry attempt start. Reviewed-by: Damien Le Moal <[email protected]> Signed-off-by: Shin'ichiro Kawasaki <[email protected]> --- zbd.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/zbd.c b/zbd.c index 08c537d7..cf825601 100644 --- a/zbd.c +++ b/zbd.c @@ -1643,6 +1643,19 @@ choose_other_zone: } retry: + /* + * For random writes, retry from the zone chosen at the beginning using + * the initial io_u random offset. + */ + if (td_random(td)) { + zone_unlock(z); + zone_lock(td, f, zb); + if (zbd_write_zone_get(td, f, zb)) + return zb; + z = zb; + zone_idx = zbd_zone_idx(f, z); + } + /* Zone 'z' is full, so try to choose a new zone. */ for (i = f->io_size / zbdi->zone_size; i > 0; i--) { zone_idx++; -- 2.49.0