Skip to content
This repository has been archived by the owner on Apr 14, 2023. It is now read-only.

Commit

Permalink
hw/nvme: Fixed nvme_create_ns after 6.1.0 merge
Browse files Browse the repository at this point in the history
hw/nvme: stub Reprioritize nvme io command
  • Loading branch information
TrungNguyen1909 committed Mar 9, 2022
1 parent 7f5549a commit fe3d463
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 11 deletions.
82 changes: 71 additions & 11 deletions hw/nvme/ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ static const uint32_t nvme_cse_iocs_nvm[256] = {
[NVME_CMD_VERIFY] = NVME_CMD_EFF_CSUPP,
[NVME_CMD_COPY] = NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC,
[NVME_CMD_COMPARE] = NVME_CMD_EFF_CSUPP,
[NVME_CMD_REPRIORITIZE] = NVME_CMD_EFF_CSUPP,
};

static const uint32_t nvme_cse_iocs_zoned[256] = {
Expand All @@ -253,6 +254,7 @@ static const uint32_t nvme_cse_iocs_zoned[256] = {
[NVME_CMD_ZONE_APPEND] = NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC,
[NVME_CMD_ZONE_MGMT_SEND] = NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_LBCC,
[NVME_CMD_ZONE_MGMT_RECV] = NVME_CMD_EFF_CSUPP,
[NVME_CMD_REPRIORITIZE] = NVME_CMD_EFF_CSUPP,
};

static void nvme_process_sq(void *opaque);
Expand Down Expand Up @@ -3922,6 +3924,8 @@ static uint16_t nvme_io_cmd(NvmeCtrl *n, NvmeRequest *req)
return nvme_zone_mgmt_send(n, req);
case NVME_CMD_ZONE_MGMT_RECV:
return nvme_zone_mgmt_recv(n, req);
case NVME_CMD_REPRIORITIZE:
return NVME_SUCCESS;
default:
assert(false);
}
Expand Down Expand Up @@ -5475,6 +5479,64 @@ static uint16_t nvme_format(NvmeCtrl *n, NvmeRequest *req)
return status;
}

static void nvme_create_ns_ns_cb(void *opaque, int ret)
{
NvmeFormatAIOCB *iocb = opaque;
NvmeNamespace *ns = iocb->ns;
int bytes;

if (ret < 0) {
iocb->ret = ret;
goto done;
}

assert(ns);

if (iocb->offset < ns->size) {
bytes = MIN(BDRV_REQUEST_MAX_BYTES, ns->size - iocb->offset);

iocb->aiocb = blk_aio_pwrite_zeroes(ns->blkconf.blk, iocb->offset,
bytes, BDRV_REQ_MAY_UNMAP,
nvme_create_ns_ns_cb, iocb);

iocb->offset += bytes;
return;
}

ns->status = 0x0;
iocb->ns = NULL;
iocb->offset = 0;

done:
iocb->aiocb = NULL;
qemu_bh_schedule(iocb->bh);
}

static void nvme_create_ns_bh(void *opaque)
{
NvmeFormatAIOCB *iocb = opaque;

if (iocb->ret < 0) {
goto done;
}

if (!iocb->ns) {
goto done;
}

iocb->ns->status = NVME_FORMAT_IN_PROGRESS;
nvme_create_ns_ns_cb(iocb, 0);
return;

done:
qemu_bh_delete(iocb->bh);
iocb->bh = NULL;

iocb->common.cb(iocb->common.opaque, iocb->ret);

qemu_aio_unref(iocb);
}

static uint16_t nvme_create_ns(NvmeCtrl *n, NvmeRequest *req)
{
NvmeFormatAIOCB *iocb;
Expand All @@ -5494,24 +5556,22 @@ static uint16_t nvme_create_ns(NvmeCtrl *n, NvmeRequest *req)
iocb = qemu_aio_get(&nvme_format_aiocb_info, NULL, nvme_misc_cb, req);

iocb->req = req;
iocb->bh = qemu_bh_new(nvme_format_bh, iocb);
iocb->bh = qemu_bh_new(nvme_create_ns_bh, iocb);
iocb->ret = 0;
iocb->ns = NULL;
iocb->nsid = 1;
iocb->broadcast = false;
iocb->offset = 0;

if (!iocb->broadcast) {
if (!nvme_nsid_valid(n, 1)) {
status = NVME_INVALID_NSID | NVME_DNR;
goto out;
}
if (!nvme_nsid_valid(n, 1)) {
status = NVME_INVALID_NSID | NVME_DNR;
goto out;
}

iocb->ns = nvme_ns(n, 1);
if (!iocb->ns) {
status = NVME_INVALID_FIELD | NVME_DNR;
goto out;
}
iocb->ns = nvme_ns(n, 1);
if (!iocb->ns) {
status = NVME_INVALID_FIELD | NVME_DNR;
goto out;
}

req->aiocb = &iocb->common;
Expand Down
2 changes: 2 additions & 0 deletions hw/nvme/nvme.h
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,7 @@ static inline const char *nvme_adm_opc_str(uint8_t opc)
case NVME_ADM_CMD_ASYNC_EV_REQ: return "NVME_ADM_CMD_ASYNC_EV_REQ";
case NVME_ADM_CMD_NS_ATTACHMENT: return "NVME_ADM_CMD_NS_ATTACHMENT";
case NVME_ADM_CMD_FORMAT_NVM: return "NVME_ADM_CMD_FORMAT_NVM";
case NVME_ADM_CMD_TUNNEL: return "NVME_ADM_CMD_TUNNEL";
default: return "NVME_ADM_CMD_UNKNOWN";
}
}
Expand All @@ -345,6 +346,7 @@ static inline const char *nvme_io_opc_str(uint8_t opc)
case NVME_CMD_ZONE_MGMT_SEND: return "NVME_ZONED_CMD_MGMT_SEND";
case NVME_CMD_ZONE_MGMT_RECV: return "NVME_ZONED_CMD_MGMT_RECV";
case NVME_CMD_ZONE_APPEND: return "NVME_ZONED_CMD_ZONE_APPEND";
case NVME_CMD_REPRIORITIZE: return "NVME_CMD_REPRIORITIZE";
default: return "NVME_NVM_CMD_UNKNOWN";
}
}
Expand Down

0 comments on commit fe3d463

Please sign in to comment.