lib/nvme: Expose APIs to Access PMR

APIs to get PMR size, enable, disable, map and unmap the PMR.

Signed-off-by: Krishna Kanth Reddy <krish.reddy@samsung.com>
Change-Id: If6ec7f3e2f19bc13b3cbb2def622a41a3d84dc4e
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6560
Community-CI: Broadcom CI
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Krishna Kanth Reddy 2021-02-25 16:41:33 +05:30 committed by Jim Harris
parent 89858bbf5d
commit f98b792db2
5 changed files with 145 additions and 0 deletions

View File

@ -63,6 +63,9 @@ chained accelerated CRC32 computation support.
### nvme
Added new functions `spdk_nvme_ctrlr_get_pmrsz`, `spdk_nvme_ctrlr_enable_pmr`,
`spdk_nvme_ctrlr_disable_pmr`, `spdk_nvme_ctrlr_map_pmr` and `spdk_nvme_ctrlr_unmap_pmr`.
Added NVMe transport operations to enable, disable, map and unmap the PMR.
Added `spdk_nvme_qpair_get_optimal_poll_group` function and `qpair_get_optimal_poll_group`

View File

@ -1094,6 +1094,15 @@ union spdk_nvme_cmbsz_register spdk_nvme_ctrlr_get_regs_cmbsz(struct spdk_nvme_c
*/
union spdk_nvme_pmrcap_register spdk_nvme_ctrlr_get_regs_pmrcap(struct spdk_nvme_ctrlr *ctrlr);
/**
* Get the NVMe controller PMR size.
*
* \param ctrlr Opaque handle to NVMe controller.
*
* \return the NVMe controller PMR size or 0 if PMR is not supported.
*/
uint64_t spdk_nvme_ctrlr_get_pmrsz(struct spdk_nvme_ctrlr *ctrlr);
/**
* Get the number of namespaces for the given NVMe controller.
*
@ -2227,6 +2236,56 @@ void *spdk_nvme_ctrlr_map_cmb(struct spdk_nvme_ctrlr *ctrlr, size_t *size);
*/
void spdk_nvme_ctrlr_unmap_cmb(struct spdk_nvme_ctrlr *ctrlr);
/**
* Enable the Persistent Memory Region
*
* \param ctrlr Controller that contains the Persistent Memory Region
*
* \return 0 on success. Negated errno on the following error conditions:
* -ENOTSUP: PMR is not supported by the Controller.
* -EIO: Registers access failure.
* -EINVAL: PMR Time Units Invalid or PMR is already enabled.
* -ETIMEDOUT: Timed out to Enable PMR.
* -ENOSYS: Transport does not support Enable PMR function.
*/
int spdk_nvme_ctrlr_enable_pmr(struct spdk_nvme_ctrlr *ctrlr);
/**
* Disable the Persistent Memory Region
*
* \param ctrlr Controller that contains the Persistent Memory Region
*
* \return 0 on success. Negated errno on the following error conditions:
* -ENOTSUP: PMR is not supported by the Controller.
* -EIO: Registers access failure.
* -EINVAL: PMR Time Units Invalid or PMR is already disabled.
* -ETIMEDOUT: Timed out to Disable PMR.
* -ENOSYS: Transport does not support Disable PMR function.
*/
int spdk_nvme_ctrlr_disable_pmr(struct spdk_nvme_ctrlr *ctrlr);
/**
* Map the Persistent Memory Region so that it's data is
* visible from the CPU.
*
* \param ctrlr Controller that contains the Persistent Memory Region
* \param size Size of the region that was mapped.
*
* \return Pointer to Persistent Memory Region, or NULL on failure.
*/
void *spdk_nvme_ctrlr_map_pmr(struct spdk_nvme_ctrlr *ctrlr, size_t *size);
/**
* Free the Persistent Memory Region.
*
* \param ctrlr Controller from which to unmap the Persistent Memory Region.
*
* \return 0 on success, negative errno on failure.
* -ENXIO: Either PMR is not supported by the Controller or the PMR is already unmapped.
* -ENOSYS: Transport does not support Unmap PMR function.
*/
int spdk_nvme_ctrlr_unmap_pmr(struct spdk_nvme_ctrlr *ctrlr);
/**
* Get the transport ID for a given NVMe controller.
*

View File

@ -3614,6 +3614,12 @@ union spdk_nvme_pmrcap_register spdk_nvme_ctrlr_get_regs_pmrcap(struct spdk_nvme
return pmrcap;
}
uint64_t
spdk_nvme_ctrlr_get_pmrsz(struct spdk_nvme_ctrlr *ctrlr)
{
return ctrlr->pmr_size;
}
uint32_t
spdk_nvme_ctrlr_get_num_ns(struct spdk_nvme_ctrlr *ctrlr)
{
@ -4093,6 +4099,54 @@ spdk_nvme_ctrlr_unmap_cmb(struct spdk_nvme_ctrlr *ctrlr)
nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock);
}
int
spdk_nvme_ctrlr_enable_pmr(struct spdk_nvme_ctrlr *ctrlr)
{
int rc;
nvme_robust_mutex_lock(&ctrlr->ctrlr_lock);
rc = nvme_transport_ctrlr_enable_pmr(ctrlr);
nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock);
return rc;
}
int
spdk_nvme_ctrlr_disable_pmr(struct spdk_nvme_ctrlr *ctrlr)
{
int rc;
nvme_robust_mutex_lock(&ctrlr->ctrlr_lock);
rc = nvme_transport_ctrlr_disable_pmr(ctrlr);
nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock);
return rc;
}
void *
spdk_nvme_ctrlr_map_pmr(struct spdk_nvme_ctrlr *ctrlr, size_t *size)
{
void *buf;
nvme_robust_mutex_lock(&ctrlr->ctrlr_lock);
buf = nvme_transport_ctrlr_map_pmr(ctrlr, size);
nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock);
return buf;
}
int
spdk_nvme_ctrlr_unmap_pmr(struct spdk_nvme_ctrlr *ctrlr)
{
int rc;
nvme_robust_mutex_lock(&ctrlr->ctrlr_lock);
rc = nvme_transport_ctrlr_unmap_pmr(ctrlr);
nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock);
return rc;
}
bool
spdk_nvme_ctrlr_is_discovery(struct spdk_nvme_ctrlr *ctrlr)
{

View File

@ -42,6 +42,7 @@
spdk_nvme_ctrlr_get_regs_vs;
spdk_nvme_ctrlr_get_regs_cmbsz;
spdk_nvme_ctrlr_get_regs_pmrcap;
spdk_nvme_ctrlr_get_pmrsz;
spdk_nvme_ctrlr_get_num_ns;
spdk_nvme_ctrlr_get_pci_device;
spdk_nvme_ctrlr_get_max_xfer_size;
@ -90,6 +91,10 @@
spdk_nvme_ctrlr_reserve_cmb;
spdk_nvme_ctrlr_map_cmb;
spdk_nvme_ctrlr_unmap_cmb;
spdk_nvme_ctrlr_enable_pmr;
spdk_nvme_ctrlr_disable_pmr;
spdk_nvme_ctrlr_map_pmr;
spdk_nvme_ctrlr_unmap_pmr;
spdk_nvme_ctrlr_get_transport_id;
spdk_nvme_ctrlr_alloc_qid;
spdk_nvme_ctrlr_free_qid;

View File

@ -158,6 +158,30 @@ nvme_transport_ctrlr_unmap_cmb(struct spdk_nvme_ctrlr *ctrlr)
return 0;
}
int
nvme_transport_ctrlr_enable_pmr(struct spdk_nvme_ctrlr *ctrlr)
{
return 0;
}
int
nvme_transport_ctrlr_disable_pmr(struct spdk_nvme_ctrlr *ctrlr)
{
return 0;
}
void *
nvme_transport_ctrlr_map_pmr(struct spdk_nvme_ctrlr *ctrlr, size_t *size)
{
return NULL;
}
int
nvme_transport_ctrlr_unmap_pmr(struct spdk_nvme_ctrlr *ctrlr)
{
return 0;
}
struct spdk_nvme_qpair *
nvme_transport_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, uint16_t qid,
const struct spdk_nvme_io_qpair_opts *opts)