[PATCH v5 00/17] s390/dasd: ESE thin-provisioning performance improvements
Stefan Haberland <[email protected]> Fri, 31 Jul 2026 17:38:25 +0200
| Newsgroups | org.kernel.vger.linux-s390 |
|---|---|
| Message-ID | <[email protected]> |
Extent Space Efficient (ESE) volumes allocate a track on its first write.
Today the first write to an unallocated track fails with No Record Found
(or similar), the driver formats the track and retries the write.
That NRF loop dominates the write path of a freshly provisioned volume.
This series lets the driver write and allocate a track in a single
operation using WRITE_FULL_TRACK, so the common "write to a
not-yet-allocated track" case avoids the NRF penalty.
Because full-track writes are only a win while a volume is still sparse, an
adaptive heuristic (exposed through a single sysfs knob) probes
the workload and falls back to normal writes once the device is mostly
allocated. On top of that the series adds an on-disk format label so an
ESE volume can be recognised without querying the hardware, and re-enables
discard for ESE volumes so freed space can be returned to the pool.
The sysfs knob is 0..100. 0 pins normal writes, 100 pins full-track,
and the default of 50 enables the heuristic; the adaptive range
interpolates the heuristic parameters between the two ends.
Patch 16 releases whole extents only: a discard range is rounded inward to
extent boundaries and partially covered boundary tracks are dropped, so an
extent shared with a live allocation is never released. Sub-extent discards
that cover no whole extent are rejected rather than over-released and
corrupting data.
Patch 17 fixes a use-after-free: the CCW build path read the base address
and LSS directly from conf.ned, which the reload worker can free
concurrently with I/O. The values are now read from the copies kept in the
device uid / private structure, refreshed under the ccwdev lock when the
configuration is (re)read.
Fixes (pre-existing):
01 Propagate partial completion length across ERP recovery
02 Guard sysfs discipline callbacks against unallocated private data
v4->v5:
- The sysfs private-data guard (patch 02) was moved out of the callers
(the DASD_DEFINE_ATTR() macro and the individual sysfs handlers) into
each discipline callback that actually dereferences device->private
- Full-track channel-program builder (patch 09): crosses_page() and
reserve_nocross() now use offset_in_page(); reserve_nocross() fails
atomically without advancing the fill pointer; datasize simplified to
trkcount * tlf; plus minor cleanups
- full_track_bias_store() (patch 12) received the same guard-in-callee
treatment: the offline check was removed from the store, and
dasd_ese_adaptive() now verifies device->discipline before invoking the
is_ese callback. The heuristic interpolation endpoints d50/d100 were
renamed v50/v100 for clarity.
- On-disk format label (patch 13): the informational per-format string
now records the running kernel version (uname -r) instead of a fixed
driver name; the field was renamed kernel_version and enlarged to
64 bytes.
- Discard (patch 16): build_cp_discard() now uses roundup()/rounddown()
with a named inclusive last track for the extent-alignment (no
functional change)
v3->v4:
- Two pre-existing bugs surfaced during review are prepended as fixes:
- ERP recovery now carries proc_bytes back to the original request,
so a partially completed ESE read that is recovered through the ERP
chain no longer completes the whole request and returns zeroed data
for the unread remainder (patch 01).
- the ese / on_demand_formatting sysfs attributes now check
device->private before dereferencing it, closing an unprivileged
NULL-pointer read during the set_online window (patch 02).
- The dasd_alloc_device() GFP_ATOMIC->GFP_KERNEL conversion was split out
of the ESE infrastructure patch into its own patch (04): it runs in
process context and is an independent change.
- New patch (05) names the Extended Address Volume track-address shifts
used by set_ch_t()/set_chr_t() instead of open-coding the constants.
- Full-track write path: the ESE format handler's error, partial
completion and abort exits now cancel the device timer and schedule the
bottom halves (a failed request previously waited for the timeout); the
exits were consolidated behind shared out:/out_retry: labels. free_cp()
now releases the bounce buffers of an aborted (format-replaced) write
instead of leaking them. build_cp_tpm_writefulltrack() budgets
page-boundary padding in the fill buffer, and its in-loop track-end
length matches the physical track.
- Adaptive mode selection: full_track_bias no longer enables full-track
writes on non-ESE volumes by default (only an explicit ft_bias=100
forces it); the sysfs store rejects an offline device, and the
heuristic re-asserts the endpoint mode per I/O so a racing sysfs write
cannot wedge it.
- On-disk format label: a failed full format invalidates the cached label
so is_ese() falls back to the hardware field, and the fulltrack
heuristic is (re)applied after the format commits rather than before.
- Discard: discard is no longer advertised for raw-track-access (USERAW)
volumes, which would otherwise route a discard into the raw CCW
builder.
- conf.ned fix: the cached unit address is kept in a dedicated field, so
the lockless CCW-build readers cannot observe the transient zero while
create_uid() repopulates the uid.
Stefan Haberland (17):
s390/dasd: Propagate partial completion length across ERP recovery
s390/dasd: Guard sysfs discipline callbacks against unallocated
private data
s390/dasd: Optimize max blocks per request for track alignment
s390/dasd: Use GFP_KERNEL in dasd_alloc_device()
s390/dasd: Add defines for the Extended Address Volume track address
s390/dasd: Add infrastructure for ESE full-track write
s390/dasd: Add range-based format-track collision detection
s390/dasd: Extend prepare_itcw() to support WRITE_FULL_TRACK
s390/dasd: Add dasd_eckd_build_cp_tpm_writefulltrack()
s390/dasd: Use WRITE_FULL_TRACK in ESE format handler
s390/dasd: Add full_track_bias to control fulltrack write mode
s390/dasd: Derive adaptive ESE fulltrack heuristic from ft_bias
s390/dasd: Stamp a format label into newly formatted volumes
s390/dasd: Detect ESE volumes from the on-disk format label
s390/dasd: Report ESE capability and format mode at device online
s390/dasd: Re-enable discard support for ESE volumes
s390/dasd: Read cached unit address and LSS in the CCW build path
drivers/s390/block/dasd.c | 201 +++--
drivers/s390/block/dasd_devmap.c | 87 ++-
drivers/s390/block/dasd_eckd.c | 1241 ++++++++++++++++++++++++++----
drivers/s390/block/dasd_eckd.h | 68 +-
drivers/s390/block/dasd_erp.c | 11 +-
drivers/s390/block/dasd_int.h | 149 +++-
6 files changed, 1564 insertions(+), 193 deletions(-)
--
2.53.0