ZNS emulation follows NVMe ZNS spec but the state of namespace
zones does not persist accross restarts of QEMU. This patch makes the
metadata of ZNS emulation persistent by using new block layer APIs and
the qcow2 img as backing file. It is the second part after the patches
- adding full zoned storage emulation to qcow2 driver.
https://patchwork.kernel.org/project/qemu-devel/cover/20231127043703.49489-1-faithilikerun@gmail.com/
The metadata of ZNS emulation divides into two parts, zone metadata and
zone descriptor extension data. The zone metadata is composed of zone
states, zone type, wp and zone attributes. The zone information can be
stored at an uint64_t wp to save space and easy access. The structure of
wp of each zone is as follows:
|0000(4)| zone type (1)| zone attr (8)| wp (51) ||
The zone descriptor extension data is relatively small comparing to the
overall size therefore we adopt the option that store zded of all zones
in an array regardless of the valid bit set.
Creating a zns format qcow2 image file adds one more option zd_extension_size
to zoned device configurations.
To attach this file as emulated zns drive in the command line of QEMU, use:
-drive file=${znsimg},id=nvmezns0,format=qcow2,if=none \
-device nvme-ns,drive=nvmezns0,bus=nvme0,nsid=1,uuid=xxx \
v1->v2:
- split [v1 2/5] patch to three (doc, config, block layer API)
- adapt qcow2 v6
Sam Li (7):
docs/qcow2: add zd_extension_size option to the zoned format feature
qcow2: add zd_extension configurations to zoned metadata
hw/nvme: use blk_get_*() to access zone info in the block layer
hw/nvme: add blk_get_zone_extension to access zd_extensions
hw/nvme: make the metadata of ZNS emulation persistent
hw/nvme: refactor zone append write using block layer APIs
hw/nvme: make ZDED persistent
block/block-backend.c | 88 ++
block/qcow2.c | 119 ++-
block/qcow2.h | 2 +
docs/interop/qcow2.txt | 3 +
hw/nvme/ctrl.c | 1247 ++++++++---------------------
hw/nvme/ns.c | 162 +---
hw/nvme/nvme.h | 95 +--
include/block/block-common.h | 9 +
include/block/block_int-common.h | 8 +
include/sysemu/block-backend-io.h | 11 +
include/sysemu/dma.h | 3 +
qapi/block-core.json | 4 +
system/dma-helpers.c | 17 +
13 files changed, 647 insertions(+), 1121 deletions(-)
--
2.40.1