diff options
author | Minwoo Im | 2021-01-17 15:53:32 +0100 |
---|---|---|
committer | Klaus Jensen | 2021-02-08 21:15:53 +0100 |
commit | aa5e55e3b07ede87a8fd7aa3e67583dfc464dd52 (patch) | |
tree | cba8d40eb1cdd430e41e3283fb86c002f8e054fc /hw/block | |
parent | hw/block/nvme: remove unused argument in nvme_ns_init_zoned (diff) | |
download | qemu-aa5e55e3b07ede87a8fd7aa3e67583dfc464dd52.tar.gz qemu-aa5e55e3b07ede87a8fd7aa3e67583dfc464dd52.tar.xz qemu-aa5e55e3b07ede87a8fd7aa3e67583dfc464dd52.zip |
hw/block/nvme: open code for volatile write cache
Volatile Write Cache(VWC) feature is set in nvme_ns_setup() in the
initial time. This feature is related to block device backed, but this
feature is controlled in controller level via Set/Get Features command.
This patch removed dependency between nvme and nvme-ns to manage the VWC
flag value. Also, it open coded the Get Features for VWC to check all
namespaces attached to the controller, and if false detected, return
directly false.
Signed-off-by: Minwoo Im <minwoo.im.dev@gmail.com>
[k.jensen: report write cache preset if present on ANY namespace]
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
Diffstat (limited to 'hw/block')
-rw-r--r-- | hw/block/nvme-ns.c | 4 | ||||
-rw-r--r-- | hw/block/nvme.c | 15 | ||||
-rw-r--r-- | hw/block/nvme.h | 1 |
3 files changed, 12 insertions, 8 deletions
diff --git a/hw/block/nvme-ns.c b/hw/block/nvme-ns.c index d35c2925ec..7a5a779837 100644 --- a/hw/block/nvme-ns.c +++ b/hw/block/nvme-ns.c @@ -90,10 +90,6 @@ static int nvme_ns_init_blk(NvmeCtrl *n, NvmeNamespace *ns, Error **errp) return -1; } - if (blk_enable_write_cache(ns->blkconf.blk)) { - n->features.vwc = 0x1; - } - return 0; } diff --git a/hw/block/nvme.c b/hw/block/nvme.c index 35f39ecd95..0b002cb2be 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -3097,6 +3097,7 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRequest *req) NvmeGetFeatureSelect sel = NVME_GETFEAT_SELECT(dw10); uint16_t iv; NvmeNamespace *ns; + int i; static const uint32_t nvme_feature_default[NVME_FID_MAX] = { [NVME_ARBITRATION] = NVME_ARB_AB_NOLIMIT, @@ -3172,7 +3173,17 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRequest *req) result = ns->features.err_rec; goto out; case NVME_VOLATILE_WRITE_CACHE: - result = n->features.vwc; + for (i = 1; i <= n->num_namespaces; i++) { + ns = nvme_ns(n, i); + if (!ns) { + continue; + } + + result = blk_enable_write_cache(ns->blkconf.blk); + if (result) { + break; + } + } trace_pci_nvme_getfeat_vwcache(result ? "enabled" : "disabled"); goto out; case NVME_ASYNCHRONOUS_EVENT_CONF: @@ -3335,8 +3346,6 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeRequest *req) ns->features.err_rec = dw11; break; case NVME_VOLATILE_WRITE_CACHE: - n->features.vwc = dw11 & 0x1; - for (i = 1; i <= n->num_namespaces; i++) { ns = nvme_ns(n, i); if (!ns) { diff --git a/hw/block/nvme.h b/hw/block/nvme.h index 65540b650e..347c149e79 100644 --- a/hw/block/nvme.h +++ b/hw/block/nvme.h @@ -121,7 +121,6 @@ typedef struct NvmeFeatureVal { uint16_t temp_thresh_low; }; uint32_t async_config; - uint32_t vwc; } NvmeFeatureVal; typedef struct NvmeCtrl { |