mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 10:13:56 -06:00
hw/nvme: add support for zoned random write area
Add support for TP 4076 ("Zoned Random Write Area"), v2021.08.23 ("Ratified"). This adds three new namespace parameters: "zoned.numzrwa" (number of zrwa resources, i.e. number of zones that can have a zrwa), "zoned.zrwas" (zrwa size in LBAs), "zoned.zrwafg" (granularity in LBAs for flushes). Reviewed-by: Keith Busch <kbusch@kernel.org> Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
This commit is contained in:
parent
25872031e1
commit
e321b4cdc2
5 changed files with 237 additions and 20 deletions
58
hw/nvme/ns.c
58
hw/nvme/ns.c
|
@ -275,6 +275,23 @@ static void nvme_ns_init_zoned(NvmeNamespace *ns)
|
|||
ns->params.zd_extension_size >> 6; /* Units of 64B */
|
||||
}
|
||||
|
||||
if (ns->params.zrwas) {
|
||||
ns->zns.numzrwa = ns->params.numzrwa ?
|
||||
ns->params.numzrwa : ns->num_zones;
|
||||
|
||||
ns->zns.zrwas = ns->params.zrwas >> ns->lbaf.ds;
|
||||
ns->zns.zrwafg = ns->params.zrwafg >> ns->lbaf.ds;
|
||||
|
||||
id_ns_z->ozcs |= NVME_ID_NS_ZONED_OZCS_ZRWASUP;
|
||||
id_ns_z->zrwacap = NVME_ID_NS_ZONED_ZRWACAP_EXPFLUSHSUP;
|
||||
|
||||
id_ns_z->numzrwa = cpu_to_le32(ns->params.numzrwa);
|
||||
id_ns_z->zrwas = cpu_to_le16(ns->zns.zrwas);
|
||||
id_ns_z->zrwafg = cpu_to_le16(ns->zns.zrwafg);
|
||||
}
|
||||
|
||||
id_ns_z->ozcs = cpu_to_le16(id_ns_z->ozcs);
|
||||
|
||||
ns->csi = NVME_CSI_ZONED;
|
||||
ns->id_ns.nsze = cpu_to_le64(ns->num_zones * ns->zone_size);
|
||||
ns->id_ns.ncap = ns->id_ns.nsze;
|
||||
|
@ -315,6 +332,10 @@ static void nvme_clear_zone(NvmeNamespace *ns, NvmeZone *zone)
|
|||
QTAILQ_INSERT_HEAD(&ns->closed_zones, zone, entry);
|
||||
} else {
|
||||
trace_pci_nvme_clear_ns_reset(state, zone->d.zslba);
|
||||
if (zone->d.za & NVME_ZA_ZRWA_VALID) {
|
||||
zone->d.za &= ~NVME_ZA_ZRWA_VALID;
|
||||
ns->zns.numzrwa++;
|
||||
}
|
||||
nvme_set_zone_state(zone, NVME_ZONE_STATE_EMPTY);
|
||||
}
|
||||
}
|
||||
|
@ -392,6 +413,40 @@ static int nvme_ns_check_constraints(NvmeNamespace *ns, Error **errp)
|
|||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (ns->params.zrwas) {
|
||||
if (ns->params.zrwas % ns->blkconf.logical_block_size) {
|
||||
error_setg(errp, "zone random write area size (zoned.zrwas "
|
||||
"%"PRIu64") must be a multiple of the logical "
|
||||
"block size (logical_block_size %"PRIu32")",
|
||||
ns->params.zrwas, ns->blkconf.logical_block_size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ns->params.zrwafg == -1) {
|
||||
ns->params.zrwafg = ns->blkconf.logical_block_size;
|
||||
}
|
||||
|
||||
if (ns->params.zrwas % ns->params.zrwafg) {
|
||||
error_setg(errp, "zone random write area size (zoned.zrwas "
|
||||
"%"PRIu64") must be a multiple of the zone random "
|
||||
"write area flush granularity (zoned.zrwafg, "
|
||||
"%"PRIu64")", ns->params.zrwas, ns->params.zrwafg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ns->params.max_active_zones) {
|
||||
if (ns->params.numzrwa > ns->params.max_active_zones) {
|
||||
error_setg(errp, "number of zone random write area "
|
||||
"resources (zoned.numzrwa, %d) must be less "
|
||||
"than or equal to maximum active resources "
|
||||
"(zoned.max_active_zones, %d)",
|
||||
ns->params.numzrwa,
|
||||
ns->params.max_active_zones);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -551,6 +606,9 @@ static Property nvme_ns_props[] = {
|
|||
params.max_open_zones, 0),
|
||||
DEFINE_PROP_UINT32("zoned.descr_ext_size", NvmeNamespace,
|
||||
params.zd_extension_size, 0),
|
||||
DEFINE_PROP_UINT32("zoned.numzrwa", NvmeNamespace, params.numzrwa, 0),
|
||||
DEFINE_PROP_SIZE("zoned.zrwas", NvmeNamespace, params.zrwas, 0),
|
||||
DEFINE_PROP_SIZE("zoned.zrwafg", NvmeNamespace, params.zrwafg, -1),
|
||||
DEFINE_PROP_BOOL("eui64-default", NvmeNamespace, params.eui64_default,
|
||||
true),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue