From: Klaus Jensen <k.jen...@samsung.com> Signed-off-by: Klaus Jensen <k.jen...@samsung.com> --- hw/nvme/ctrl.c | 66 +++++++++++++++++++++++++------------------------- hw/nvme/dif.c | 14 +++++------ hw/nvme/nvme.h | 6 +++++ 3 files changed, 46 insertions(+), 40 deletions(-)
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 7f41181aafa1..f05d85075f08 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -1465,7 +1465,7 @@ static int nvme_block_status_all(NvmeNamespace *ns, uint64_t slba, uint32_t nlb, int flags) { NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); - BlockDriverState *bs = blk_bs(ns->blkconf.blk); + BlockDriverState *bs = blk_bs(nvme_blk(ns)); int64_t pnum = 0, bytes = nvme_l2b(nvm, nlb); int64_t offset = nvme_l2b(nvm, slba); @@ -1865,7 +1865,7 @@ void nvme_rw_complete_cb(void *opaque, int ret) { NvmeRequest *req = opaque; NvmeNamespace *ns = req->ns; - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); BlockAcctCookie *acct = &req->acct; BlockAcctStats *stats = blk_get_stats(blk); @@ -1891,7 +1891,7 @@ static void nvme_rw_cb(void *opaque, int ret) NvmeNamespace *ns = req->ns; NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); trace_pci_nvme_rw_cb(nvme_cid(req), blk_name(blk)); @@ -1942,7 +1942,7 @@ static void nvme_verify_cb(void *opaque, int ret) NvmeRequest *req = ctx->req; NvmeNamespace *ns = req->ns; NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); BlockAcctCookie *acct = &req->acct; BlockAcctStats *stats = blk_get_stats(blk); NvmeRwCmd *rw = (NvmeRwCmd *)&req->cmd; @@ -2000,7 +2000,7 @@ static void nvme_verify_mdata_in_cb(void *opaque, int ret) uint32_t nlb = le16_to_cpu(rw->nlb) + 1; size_t mlen = nvme_m2b(nvm, nlb); uint64_t offset = nvme_moff(nvm, slba); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); trace_pci_nvme_verify_mdata_in_cb(nvme_cid(req), blk_name(blk)); @@ -2046,7 +2046,7 @@ static void nvme_compare_mdata_cb(void *opaque, int ret) uint32_t reftag = le32_to_cpu(rw->reftag); struct nvme_compare_ctx *ctx = req->opaque; g_autofree uint8_t *buf = NULL; - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); BlockAcctCookie *acct = &req->acct; BlockAcctStats *stats = blk_get_stats(blk); uint16_t status = NVME_SUCCESS; @@ -2126,7 +2126,7 @@ static void nvme_compare_data_cb(void *opaque, int ret) NvmeCtrl *n = nvme_ctrl(req); NvmeNamespace *ns = req->ns; NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); BlockAcctCookie *acct = &req->acct; BlockAcctStats *stats = blk_get_stats(blk); @@ -2272,7 +2272,7 @@ static void nvme_dsm_md_cb(void *opaque, int ret) nvme_dsm_cb(iocb, 0); } - iocb->aiocb = blk_aio_pwrite_zeroes(ns->blkconf.blk, nvme_moff(nvm, slba), + iocb->aiocb = blk_aio_pwrite_zeroes(nvme_blk(ns), nvme_moff(nvm, slba), nvme_m2b(nvm, nlb), BDRV_REQ_MAY_UNMAP, nvme_dsm_cb, iocb); return; @@ -2320,7 +2320,7 @@ next: goto next; } - iocb->aiocb = blk_aio_pdiscard(ns->blkconf.blk, nvme_l2b(nvm, slba), + iocb->aiocb = blk_aio_pdiscard(nvme_blk(ns), nvme_l2b(nvm, slba), nvme_l2b(nvm, nlb), nvme_dsm_md_cb, iocb); return; @@ -2341,7 +2341,7 @@ static uint16_t nvme_dsm(NvmeCtrl *n, NvmeRequest *req) trace_pci_nvme_dsm(nr, attr); if (attr & NVME_DSMGMT_AD) { - NvmeDSMAIOCB *iocb = blk_aio_get(&nvme_dsm_aiocb_info, ns->blkconf.blk, + NvmeDSMAIOCB *iocb = blk_aio_get(&nvme_dsm_aiocb_info, nvme_blk(ns), nvme_misc_cb, req); iocb->req = req; @@ -2371,7 +2371,7 @@ static uint16_t nvme_verify(NvmeCtrl *n, NvmeRequest *req) NvmeRwCmd *rw = (NvmeRwCmd *)&req->cmd; NvmeNamespace *ns = req->ns; NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); uint64_t slba = le64_to_cpu(rw->slba); uint32_t nlb = le16_to_cpu(rw->nlb) + 1; size_t len = nvme_l2b(nvm, nlb); @@ -2421,7 +2421,7 @@ static uint16_t nvme_verify(NvmeCtrl *n, NvmeRequest *req) block_acct_start(blk_get_stats(blk), &req->acct, ctx->data.iov.size, BLOCK_ACCT_READ); - req->aiocb = blk_aio_preadv(ns->blkconf.blk, offset, &ctx->data.iov, 0, + req->aiocb = blk_aio_preadv(nvme_blk(ns), offset, &ctx->data.iov, 0, nvme_verify_mdata_in_cb, ctx); return NVME_NO_COMPLETE; } @@ -2472,7 +2472,7 @@ static void nvme_copy_bh(void *opaque) NvmeCopyAIOCB *iocb = opaque; NvmeRequest *req = iocb->req; NvmeNamespace *ns = req->ns; - BlockAcctStats *stats = blk_get_stats(ns->blkconf.blk); + BlockAcctStats *stats = blk_get_stats(nvme_blk(ns)); if (iocb->idx != iocb->nr) { req->cqe.result = cpu_to_le32(iocb->idx); @@ -2555,7 +2555,7 @@ static void nvme_copy_out_cb(void *opaque, int ret) qemu_iovec_reset(&iocb->iov); qemu_iovec_add(&iocb->iov, mbounce, mlen); - iocb->aiocb = blk_aio_pwritev(ns->blkconf.blk, nvme_moff(nvm, iocb->slba), + iocb->aiocb = blk_aio_pwritev(nvme_blk(ns), nvme_moff(nvm, iocb->slba), &iocb->iov, 0, nvme_copy_out_completed_cb, iocb); @@ -2647,7 +2647,7 @@ static void nvme_copy_in_completed_cb(void *opaque, int ret) qemu_iovec_reset(&iocb->iov); qemu_iovec_add(&iocb->iov, iocb->bounce, len); - iocb->aiocb = blk_aio_pwritev(ns->blkconf.blk, nvme_l2b(nvm, iocb->slba), + iocb->aiocb = blk_aio_pwritev(nvme_blk(ns), nvme_l2b(nvm, iocb->slba), &iocb->iov, 0, nvme_copy_out_cb, iocb); return; @@ -2695,7 +2695,7 @@ static void nvme_copy_in_cb(void *opaque, int ret) qemu_iovec_add(&iocb->iov, iocb->bounce + nvme_l2b(nvm, nlb), nvme_m2b(nvm, nlb)); - iocb->aiocb = blk_aio_preadv(ns->blkconf.blk, nvme_moff(nvm, slba), + iocb->aiocb = blk_aio_preadv(nvme_blk(ns), nvme_moff(nvm, slba), &iocb->iov, 0, nvme_copy_in_completed_cb, iocb); return; @@ -2761,7 +2761,7 @@ static void nvme_copy_cb(void *opaque, int ret) qemu_iovec_reset(&iocb->iov); qemu_iovec_add(&iocb->iov, iocb->bounce, len); - iocb->aiocb = blk_aio_preadv(ns->blkconf.blk, nvme_l2b(nvm, slba), + iocb->aiocb = blk_aio_preadv(nvme_blk(ns), nvme_l2b(nvm, slba), &iocb->iov, 0, nvme_copy_in_cb, iocb); return; @@ -2780,7 +2780,7 @@ static uint16_t nvme_copy(NvmeCtrl *n, NvmeRequest *req) NvmeNamespace *ns = req->ns; NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); NvmeCopyCmd *copy = (NvmeCopyCmd *)&req->cmd; - NvmeCopyAIOCB *iocb = blk_aio_get(&nvme_copy_aiocb_info, ns->blkconf.blk, + NvmeCopyAIOCB *iocb = blk_aio_get(&nvme_copy_aiocb_info, nvme_blk(ns), nvme_misc_cb, req); uint16_t nr = copy->nr + 1; uint8_t format = copy->control[0] & 0xf; @@ -2847,9 +2847,9 @@ static uint16_t nvme_copy(NvmeCtrl *n, NvmeRequest *req) qemu_iovec_init(&iocb->iov, 1); - block_acct_start(blk_get_stats(ns->blkconf.blk), &iocb->acct.read, 0, + block_acct_start(blk_get_stats(nvme_blk(ns)), &iocb->acct.read, 0, BLOCK_ACCT_READ); - block_acct_start(blk_get_stats(ns->blkconf.blk), &iocb->acct.write, 0, + block_acct_start(blk_get_stats(nvme_blk(ns)), &iocb->acct.write, 0, BLOCK_ACCT_WRITE); req->aiocb = &iocb->common; @@ -2868,7 +2868,7 @@ static uint16_t nvme_compare(NvmeCtrl *n, NvmeRequest *req) NvmeRwCmd *rw = (NvmeRwCmd *)&req->cmd; NvmeNamespace *ns = req->ns; NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); uint64_t slba = le64_to_cpu(rw->slba); uint32_t nlb = le16_to_cpu(rw->nlb) + 1; uint8_t prinfo = NVME_RW_PRINFO(le16_to_cpu(rw->control)); @@ -2971,7 +2971,7 @@ static void nvme_flush_ns_cb(void *opaque, int ret) trace_pci_nvme_flush_ns(iocb->nsid); iocb->ns = NULL; - iocb->aiocb = blk_aio_flush(ns->blkconf.blk, nvme_flush_ns_cb, iocb); + iocb->aiocb = blk_aio_flush(nvme_blk(ns), nvme_flush_ns_cb, iocb); return; } @@ -3073,7 +3073,7 @@ static uint16_t nvme_read(NvmeCtrl *n, NvmeRequest *req) uint64_t data_size = nvme_l2b(nvm, nlb); uint64_t mapped_size = data_size; uint64_t data_offset; - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); uint16_t status; if (nvme_ns_ext(nvm)) { @@ -3151,7 +3151,7 @@ static uint16_t nvme_do_write(NvmeCtrl *n, NvmeRequest *req, bool append, uint64_t data_offset; NvmeZone *zone; NvmeZonedResult *res = (NvmeZonedResult *)&req->cqe; - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); uint16_t status; if (nvme_ns_ext(nvm)) { @@ -3542,7 +3542,7 @@ static void nvme_zone_reset_epilogue_cb(void *opaque, int ret) moff = nvme_moff(nvm, iocb->zone->d.zslba); count = nvme_m2b(nvm, zoned->zone_size); - iocb->aiocb = blk_aio_pwrite_zeroes(ns->blkconf.blk, moff, count, + iocb->aiocb = blk_aio_pwrite_zeroes(nvme_blk(ns), moff, count, BDRV_REQ_MAY_UNMAP, nvme_zone_reset_cb, iocb); return; @@ -3593,7 +3593,7 @@ static void nvme_zone_reset_cb(void *opaque, int ret) trace_pci_nvme_zns_zone_reset(zone->d.zslba); - iocb->aiocb = blk_aio_pwrite_zeroes(ns->blkconf.blk, + iocb->aiocb = blk_aio_pwrite_zeroes(nvme_blk(ns), nvme_l2b(nvm, zone->d.zslba), nvme_l2b(nvm, zoned->zone_size), BDRV_REQ_MAY_UNMAP, @@ -3673,7 +3673,7 @@ static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, NvmeRequest *req) case NVME_ZONE_ACTION_RESET: trace_pci_nvme_reset_zone(slba, zone_idx, all); - iocb = blk_aio_get(&nvme_zone_reset_aiocb_info, ns->blkconf.blk, + iocb = blk_aio_get(&nvme_zone_reset_aiocb_info, nvme_blk(ns), nvme_misc_cb, req); iocb->req = req; @@ -4072,7 +4072,7 @@ struct nvme_stats { static void nvme_set_blk_stats(NvmeNamespace *ns, struct nvme_stats *stats) { - BlockAcctStats *s = blk_get_stats(ns->blkconf.blk); + BlockAcctStats *s = blk_get_stats(nvme_blk(ns)); stats->units_read += s->nr_bytes[BLOCK_ACCT_READ] >> BDRV_SECTOR_BITS; stats->units_written += s->nr_bytes[BLOCK_ACCT_WRITE] >> BDRV_SECTOR_BITS; @@ -4938,7 +4938,7 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRequest *req) continue; } - result = blk_enable_write_cache(ns->blkconf.blk); + result = blk_enable_write_cache(nvme_blk(ns)); if (result) { break; } @@ -5110,11 +5110,11 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeRequest *req) continue; } - if (!(dw11 & 0x1) && blk_enable_write_cache(ns->blkconf.blk)) { - blk_flush(ns->blkconf.blk); + if (!(dw11 & 0x1) && blk_enable_write_cache(nvme_blk(ns))) { + blk_flush(nvme_blk(ns)); } - blk_set_enable_write_cache(ns->blkconf.blk, dw11 & 1); + blk_set_enable_write_cache(nvme_blk(ns), dw11 & 1); } break; @@ -5364,7 +5364,7 @@ static void nvme_format_ns_cb(void *opaque, int ret) if (iocb->offset < nvm->size) { bytes = MIN(BDRV_REQUEST_MAX_BYTES, nvm->size - iocb->offset); - iocb->aiocb = blk_aio_pwrite_zeroes(ns->blkconf.blk, iocb->offset, + iocb->aiocb = blk_aio_pwrite_zeroes(nvme_blk(ns), iocb->offset, bytes, BDRV_REQ_MAY_UNMAP, nvme_format_ns_cb, iocb); diff --git a/hw/nvme/dif.c b/hw/nvme/dif.c index 26c7412eb523..1b8f9ba2fb44 100644 --- a/hw/nvme/dif.c +++ b/hw/nvme/dif.c @@ -171,7 +171,7 @@ uint16_t nvme_dif_mangle_mdata(NvmeNamespace *ns, uint8_t *mbuf, size_t mlen, uint64_t slba) { NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); BlockDriverState *bs = blk_bs(blk); int64_t moffset = 0, offset = nvme_l2b(nvm, slba); @@ -227,7 +227,7 @@ static void nvme_dif_rw_cb(void *opaque, int ret) NvmeBounceContext *ctx = opaque; NvmeRequest *req = ctx->req; NvmeNamespace *ns = req->ns; - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); trace_pci_nvme_dif_rw_cb(nvme_cid(req), blk_name(blk)); @@ -311,7 +311,7 @@ static void nvme_dif_rw_mdata_in_cb(void *opaque, int ret) uint32_t nlb = le16_to_cpu(rw->nlb) + 1; size_t mlen = nvme_m2b(nvm, nlb); uint64_t offset = nvme_moff(nvm, slba); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); trace_pci_nvme_dif_rw_mdata_in_cb(nvme_cid(req), blk_name(blk)); @@ -341,7 +341,7 @@ static void nvme_dif_rw_mdata_out_cb(void *opaque, int ret) NvmeRwCmd *rw = (NvmeRwCmd *)&req->cmd; uint64_t slba = le64_to_cpu(rw->slba); uint64_t offset = nvme_moff(nvm, slba); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); trace_pci_nvme_dif_rw_mdata_out_cb(nvme_cid(req), blk_name(blk)); @@ -362,7 +362,7 @@ uint16_t nvme_dif_rw(NvmeCtrl *n, NvmeRequest *req) NvmeRwCmd *rw = (NvmeRwCmd *)&req->cmd; NvmeNamespace *ns = req->ns; NvmeNamespaceNvm *nvm = NVME_NAMESPACE_NVM(ns); - BlockBackend *blk = ns->blkconf.blk; + BlockBackend *blk = nvme_blk(ns); bool wrz = rw->opcode == NVME_CMD_WRITE_ZEROES; uint32_t nlb = le16_to_cpu(rw->nlb) + 1; uint64_t slba = le64_to_cpu(rw->slba); @@ -451,7 +451,7 @@ uint16_t nvme_dif_rw(NvmeCtrl *n, NvmeRequest *req) block_acct_start(blk_get_stats(blk), &req->acct, ctx->data.iov.size, BLOCK_ACCT_READ); - req->aiocb = blk_aio_preadv(ns->blkconf.blk, offset, &ctx->data.iov, 0, + req->aiocb = blk_aio_preadv(nvme_blk(ns), offset, &ctx->data.iov, 0, nvme_dif_rw_mdata_in_cb, ctx); return NVME_NO_COMPLETE; } @@ -497,7 +497,7 @@ uint16_t nvme_dif_rw(NvmeCtrl *n, NvmeRequest *req) block_acct_start(blk_get_stats(blk), &req->acct, ctx->data.iov.size, BLOCK_ACCT_WRITE); - req->aiocb = blk_aio_pwritev(ns->blkconf.blk, offset, &ctx->data.iov, 0, + req->aiocb = blk_aio_pwritev(nvme_blk(ns), offset, &ctx->data.iov, 0, nvme_dif_rw_mdata_out_cb, ctx); return NVME_NO_COMPLETE; diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index c5e08cf9e1c1..525bfd0ca831 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -155,6 +155,7 @@ enum { typedef struct NvmeNamespaceNvm { NvmeIdNs id_ns; + BlockBackend *blk; int64_t size; int64_t moff; @@ -193,6 +194,11 @@ typedef struct NvmeNamespace { #define NVME_NAMESPACE_NVM(ns) (&(ns)->nvm) #define NVME_NAMESPACE_ZONED(ns) (&(ns)->zoned) +static inline BlockBackend *nvme_blk(NvmeNamespace *ns) +{ + return NVME_NAMESPACE_NVM(ns)->blk; +} + static inline uint32_t nvme_nsid(NvmeNamespace *ns) { if (ns) { -- 2.33.0