mirror of https://gitee.com/openkylin/qemu.git
hw/block/nvme: report non-mdts command size limit for dsm
Dataset Management is not subject to MDTS, but exceeded a certain size per range causes internal looping. Report this limit (DMRSL) in the NVM command set specific identify controller data structure. Signed-off-by: Gollu Appalanaidu <anaidu.gollu@samsung.com> Signed-off-by: Klaus Jensen <k.jensen@samsung.com> Reviewed-by: Keith Busch <kbusch@kernel.org>
This commit is contained in:
parent
57331f9355
commit
67ce28a1fd
|
@ -1789,6 +1789,10 @@ static uint16_t nvme_dsm(NvmeCtrl *n, NvmeRequest *req)
|
|||
trace_pci_nvme_dsm_deallocate(nvme_cid(req), nvme_nsid(ns), slba,
|
||||
nlb);
|
||||
|
||||
if (nlb > n->dmrsl) {
|
||||
trace_pci_nvme_dsm_single_range_limit_exceeded(nlb, n->dmrsl);
|
||||
}
|
||||
|
||||
offset = nvme_l2b(ns, slba);
|
||||
len = nvme_l2b(ns, nlb);
|
||||
|
||||
|
@ -3208,20 +3212,24 @@ static uint16_t nvme_identify_ctrl(NvmeCtrl *n, NvmeRequest *req)
|
|||
static uint16_t nvme_identify_ctrl_csi(NvmeCtrl *n, NvmeRequest *req)
|
||||
{
|
||||
NvmeIdentify *c = (NvmeIdentify *)&req->cmd;
|
||||
NvmeIdCtrlZoned id = {};
|
||||
uint8_t id[NVME_IDENTIFY_DATA_SIZE] = {};
|
||||
|
||||
trace_pci_nvme_identify_ctrl_csi(c->csi);
|
||||
|
||||
if (c->csi == NVME_CSI_NVM) {
|
||||
return nvme_rpt_empty_id_struct(n, req);
|
||||
} else if (c->csi == NVME_CSI_ZONED) {
|
||||
id.zasl = n->params.zasl;
|
||||
switch (c->csi) {
|
||||
case NVME_CSI_NVM:
|
||||
((NvmeIdCtrlNvm *)&id)->dmrsl = cpu_to_le32(n->dmrsl);
|
||||
break;
|
||||
|
||||
return nvme_dma(n, (uint8_t *)&id, sizeof(id),
|
||||
DMA_DIRECTION_FROM_DEVICE, req);
|
||||
case NVME_CSI_ZONED:
|
||||
((NvmeIdCtrlZoned *)&id)->zasl = n->params.zasl;
|
||||
break;
|
||||
|
||||
default:
|
||||
return NVME_INVALID_FIELD | NVME_DNR;
|
||||
}
|
||||
|
||||
return NVME_INVALID_FIELD | NVME_DNR;
|
||||
return nvme_dma(n, id, sizeof(id), DMA_DIRECTION_FROM_DEVICE, req);
|
||||
}
|
||||
|
||||
static uint16_t nvme_identify_ns(NvmeCtrl *n, NvmeRequest *req)
|
||||
|
@ -4655,6 +4663,9 @@ int nvme_register_namespace(NvmeCtrl *n, NvmeNamespace *ns, Error **errp)
|
|||
|
||||
n->namespaces[nsid - 1] = ns;
|
||||
|
||||
n->dmrsl = MIN_NON_ZERO(n->dmrsl,
|
||||
BDRV_REQUEST_MAX_BYTES / nvme_l2b(ns, 1));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -171,6 +171,8 @@ typedef struct NvmeCtrl {
|
|||
QTAILQ_HEAD(, NvmeAsyncEvent) aer_queue;
|
||||
int aer_queued;
|
||||
|
||||
uint32_t dmrsl;
|
||||
|
||||
NvmeSubsystem *subsys;
|
||||
|
||||
NvmeNamespace namespace;
|
||||
|
|
|
@ -51,6 +51,7 @@ pci_nvme_copy_cb(uint16_t cid) "cid %"PRIu16""
|
|||
pci_nvme_block_status(int64_t offset, int64_t bytes, int64_t pnum, int ret, bool zeroed) "offset %"PRId64" bytes %"PRId64" pnum %"PRId64" ret 0x%x zeroed %d"
|
||||
pci_nvme_dsm(uint16_t cid, uint32_t nsid, uint32_t nr, uint32_t attr) "cid %"PRIu16" nsid %"PRIu32" nr %"PRIu32" attr 0x%"PRIx32""
|
||||
pci_nvme_dsm_deallocate(uint16_t cid, uint32_t nsid, uint64_t slba, uint32_t nlb) "cid %"PRIu16" nsid %"PRIu32" slba %"PRIu64" nlb %"PRIu32""
|
||||
pci_nvme_dsm_single_range_limit_exceeded(uint32_t nlb, uint32_t dmrsl) "nlb %"PRIu32" dmrsl %"PRIu32""
|
||||
pci_nvme_compare(uint16_t cid, uint32_t nsid, uint64_t slba, uint32_t nlb) "cid %"PRIu16" nsid %"PRIu32" slba 0x%"PRIx64" nlb %"PRIu32""
|
||||
pci_nvme_compare_cb(uint16_t cid) "cid %"PRIu16""
|
||||
pci_nvme_aio_discard_cb(uint16_t cid) "cid %"PRIu16""
|
||||
|
|
|
@ -1041,6 +1041,16 @@ typedef struct NvmeIdCtrlZoned {
|
|||
uint8_t rsvd1[4095];
|
||||
} NvmeIdCtrlZoned;
|
||||
|
||||
typedef struct NvmeIdCtrlNvm {
|
||||
uint8_t vsl;
|
||||
uint8_t wzsl;
|
||||
uint8_t wusl;
|
||||
uint8_t dmrl;
|
||||
uint32_t dmrsl;
|
||||
uint64_t dmsl;
|
||||
uint8_t rsvd16[4080];
|
||||
} NvmeIdCtrlNvm;
|
||||
|
||||
enum NvmeIdCtrlOacs {
|
||||
NVME_OACS_SECURITY = 1 << 0,
|
||||
NVME_OACS_FORMAT = 1 << 1,
|
||||
|
@ -1396,6 +1406,7 @@ static inline void _nvme_check_size(void)
|
|||
QEMU_BUILD_BUG_ON(sizeof(NvmeEffectsLog) != 4096);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrl) != 4096);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlZoned) != 4096);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlNvm) != 4096);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeLBAF) != 4);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeLBAFE) != 16);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeIdNs) != 4096);
|
||||
|
|
Loading…
Reference in New Issue