env: pass an spdk_mem_map_ops structure to mem_map_alloc
This series of changes is aimed at enabling spdk_mem_map_translate to report back to the user the length of the valid mem_map up to the function that requested the translation. This will be useful when retrieving memory regions associated with I/O buffers in NVMe-oF. For large I/O it will be possible that the buffer is split over multiple MRs and the I/O will have to be split into multiple SGLs. Change-Id: I90da6d4d31c669a3bf046f7721923dd743c5ef21 Signed-off-by: Seth Howell <seth.howell@intel.com> Reviewed-on: https://review.gerrithub.io/425328 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
55bc3a7255
commit
4e06bb5e6d
@ -37,6 +37,10 @@ The size parameter of spdk_mem_map_translate is now a pointer. This allows the
|
|||||||
function to report back the actual size of the translation relative to the original
|
function to report back the actual size of the translation relative to the original
|
||||||
request made by the user.
|
request made by the user.
|
||||||
|
|
||||||
|
A new structure spdk_mem_map_ops has been introduced to hold memory map related
|
||||||
|
callbacks. This structure is now passed as the second argument of spdk_mem_map_alloc
|
||||||
|
in lieu of the notify callback.
|
||||||
|
|
||||||
### iscsi
|
### iscsi
|
||||||
|
|
||||||
Parameter names of `set_iscsi_options` and `get_iscsi_global_params` RPC
|
Parameter names of `set_iscsi_options` and `get_iscsi_global_params` RPC
|
||||||
|
@ -990,13 +990,13 @@ struct spdk_mem_map_ops {
|
|||||||
* Allocate a virtual memory address translation map.
|
* Allocate a virtual memory address translation map.
|
||||||
*
|
*
|
||||||
* \param default_translation Default translation for the map.
|
* \param default_translation Default translation for the map.
|
||||||
* \param notify_cb Callback function to notify the mapping.
|
* \param ops Table of callback functions for map operations.
|
||||||
* \param cb_ctx Argument passed to the callback function.
|
* \param cb_ctx Argument passed to the callback function.
|
||||||
*
|
*
|
||||||
* \return a pointer to the allocated virtual memory address translation map.
|
* \return a pointer to the allocated virtual memory address translation map.
|
||||||
*/
|
*/
|
||||||
struct spdk_mem_map *spdk_mem_map_alloc(uint64_t default_translation,
|
struct spdk_mem_map *spdk_mem_map_alloc(uint64_t default_translation,
|
||||||
spdk_mem_map_notify_cb notify_cb, void *cb_ctx);
|
const struct spdk_mem_map_ops *ops, void *cb_ctx);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free a memory map previously allocated by spdk_mem_map_alloc().
|
* Free a memory map previously allocated by spdk_mem_map_alloc().
|
||||||
|
@ -151,7 +151,7 @@ spdk_mem_map_notify_walk(struct spdk_mem_map *map, enum spdk_mem_map_notify_acti
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct spdk_mem_map *
|
struct spdk_mem_map *
|
||||||
spdk_mem_map_alloc(uint64_t default_translation, spdk_mem_map_notify_cb notify_cb, void *cb_ctx)
|
spdk_mem_map_alloc(uint64_t default_translation, const struct spdk_mem_map_ops *ops, void *cb_ctx)
|
||||||
{
|
{
|
||||||
struct spdk_mem_map *map;
|
struct spdk_mem_map *map;
|
||||||
|
|
||||||
@ -166,12 +166,14 @@ spdk_mem_map_alloc(uint64_t default_translation, spdk_mem_map_notify_cb notify_c
|
|||||||
}
|
}
|
||||||
|
|
||||||
map->default_translation = default_translation;
|
map->default_translation = default_translation;
|
||||||
map->ops.notify_cb = notify_cb;
|
|
||||||
map->cb_ctx = cb_ctx;
|
map->cb_ctx = cb_ctx;
|
||||||
|
if (ops) {
|
||||||
|
map->ops = *ops;
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&g_spdk_mem_map_mutex);
|
pthread_mutex_lock(&g_spdk_mem_map_mutex);
|
||||||
|
|
||||||
if (notify_cb) {
|
if (ops && ops->notify_cb) {
|
||||||
spdk_mem_map_notify_walk(map, SPDK_MEM_MAP_NOTIFY_REGISTER);
|
spdk_mem_map_notify_walk(map, SPDK_MEM_MAP_NOTIFY_REGISTER);
|
||||||
TAILQ_INSERT_TAIL(&g_spdk_mem_maps, map, tailq);
|
TAILQ_INSERT_TAIL(&g_spdk_mem_maps, map, tailq);
|
||||||
}
|
}
|
||||||
|
@ -604,11 +604,15 @@ spdk_vtophys_pci_device_removed(struct rte_pci_device *pci_device)
|
|||||||
int
|
int
|
||||||
spdk_vtophys_init(void)
|
spdk_vtophys_init(void)
|
||||||
{
|
{
|
||||||
|
const struct spdk_mem_map_ops vtophys_map_ops = {
|
||||||
|
.notify_cb = spdk_vtophys_notify
|
||||||
|
};
|
||||||
|
|
||||||
#if SPDK_VFIO_ENABLED
|
#if SPDK_VFIO_ENABLED
|
||||||
spdk_vtophys_iommu_init();
|
spdk_vtophys_iommu_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
g_vtophys_map = spdk_mem_map_alloc(SPDK_VTOPHYS_ERROR, spdk_vtophys_notify, NULL);
|
g_vtophys_map = spdk_mem_map_alloc(SPDK_VTOPHYS_ERROR, &vtophys_map_ops, NULL);
|
||||||
if (g_vtophys_map == NULL) {
|
if (g_vtophys_map == NULL) {
|
||||||
DEBUG_PRINT("vtophys map allocation failed\n");
|
DEBUG_PRINT("vtophys map allocation failed\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -631,12 +631,14 @@ nvme_rdma_mr_map_notify(void *cb_ctx, struct spdk_mem_map *map,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nvme_rdma_register_mem(struct nvme_rdma_qpair *rqpair)
|
nvme_rdma_register_mem(struct nvme_rdma_qpair *rqpair)
|
||||||
{
|
{
|
||||||
struct ibv_pd *pd = rqpair->cm_id->qp->pd;
|
struct ibv_pd *pd = rqpair->cm_id->qp->pd;
|
||||||
struct spdk_nvme_rdma_mr_map *mr_map;
|
struct spdk_nvme_rdma_mr_map *mr_map;
|
||||||
|
const struct spdk_mem_map_ops nvme_rdma_map_ops = {
|
||||||
|
.notify_cb = nvme_rdma_mr_map_notify
|
||||||
|
};
|
||||||
|
|
||||||
pthread_mutex_lock(&g_rdma_mr_maps_mutex);
|
pthread_mutex_lock(&g_rdma_mr_maps_mutex);
|
||||||
|
|
||||||
@ -659,7 +661,7 @@ nvme_rdma_register_mem(struct nvme_rdma_qpair *rqpair)
|
|||||||
|
|
||||||
mr_map->ref = 1;
|
mr_map->ref = 1;
|
||||||
mr_map->pd = pd;
|
mr_map->pd = pd;
|
||||||
mr_map->map = spdk_mem_map_alloc((uint64_t)NULL, nvme_rdma_mr_map_notify, pd);
|
mr_map->map = spdk_mem_map_alloc((uint64_t)NULL, &nvme_rdma_map_ops, pd);
|
||||||
if (mr_map->map == NULL) {
|
if (mr_map->map == NULL) {
|
||||||
SPDK_ERRLOG("spdk_mem_map_alloc() failed\n");
|
SPDK_ERRLOG("spdk_mem_map_alloc() failed\n");
|
||||||
free(mr_map);
|
free(mr_map);
|
||||||
|
@ -1634,6 +1634,10 @@ spdk_nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
|
|||||||
int flag;
|
int flag;
|
||||||
uint32_t sge_count;
|
uint32_t sge_count;
|
||||||
|
|
||||||
|
const struct spdk_mem_map_ops nvmf_rdma_map_ops = {
|
||||||
|
.notify_cb = spdk_nvmf_rdma_mem_notify
|
||||||
|
};
|
||||||
|
|
||||||
rtransport = calloc(1, sizeof(*rtransport));
|
rtransport = calloc(1, sizeof(*rtransport));
|
||||||
if (!rtransport) {
|
if (!rtransport) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1766,7 +1770,7 @@ spdk_nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
device->map = spdk_mem_map_alloc(0, spdk_nvmf_rdma_mem_notify, device);
|
device->map = spdk_mem_map_alloc(0, &nvmf_rdma_map_ops, device);
|
||||||
if (!device->map) {
|
if (!device->map) {
|
||||||
SPDK_ERRLOG("Unable to allocate memory map for new poll group\n");
|
SPDK_ERRLOG("Unable to allocate memory map for new poll group\n");
|
||||||
ibv_dealloc_pd(device->pd);
|
ibv_dealloc_pd(device->pd);
|
||||||
|
10
test/env/memory/memory_ut.c
vendored
10
test/env/memory/memory_ut.c
vendored
@ -96,13 +96,17 @@ test_mem_map_notify(void *cb_ctx, struct spdk_mem_map *map,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct spdk_mem_map_ops test_mem_map_ops = {
|
||||||
|
.notify_cb = test_mem_map_notify
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_mem_map_alloc_free(void)
|
test_mem_map_alloc_free(void)
|
||||||
{
|
{
|
||||||
struct spdk_mem_map *map;
|
struct spdk_mem_map *map;
|
||||||
uint64_t default_translation = 0xDEADBEEF0BADF00D;
|
uint64_t default_translation = 0xDEADBEEF0BADF00D;
|
||||||
|
|
||||||
map = spdk_mem_map_alloc(default_translation, test_mem_map_notify, NULL);
|
map = spdk_mem_map_alloc(default_translation, &test_mem_map_ops, NULL);
|
||||||
SPDK_CU_ASSERT_FATAL(map != NULL);
|
SPDK_CU_ASSERT_FATAL(map != NULL);
|
||||||
|
|
||||||
spdk_mem_map_free(&map);
|
spdk_mem_map_free(&map);
|
||||||
@ -117,7 +121,7 @@ test_mem_map_translation(void)
|
|||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
map = spdk_mem_map_alloc(default_translation, test_mem_map_notify, NULL);
|
map = spdk_mem_map_alloc(default_translation, &test_mem_map_ops, NULL);
|
||||||
SPDK_CU_ASSERT_FATAL(map != NULL);
|
SPDK_CU_ASSERT_FATAL(map != NULL);
|
||||||
|
|
||||||
/* Try to get translation for address with no translation */
|
/* Try to get translation for address with no translation */
|
||||||
@ -204,7 +208,7 @@ test_mem_map_registration(void)
|
|||||||
struct spdk_mem_map *map;
|
struct spdk_mem_map *map;
|
||||||
uint64_t default_translation = 0xDEADBEEF0BADF00D;
|
uint64_t default_translation = 0xDEADBEEF0BADF00D;
|
||||||
|
|
||||||
map = spdk_mem_map_alloc(default_translation, test_mem_map_notify, NULL);
|
map = spdk_mem_map_alloc(default_translation, &test_mem_map_ops, NULL);
|
||||||
SPDK_CU_ASSERT_FATAL(map != NULL);
|
SPDK_CU_ASSERT_FATAL(map != NULL);
|
||||||
|
|
||||||
/* Unregister memory region that wasn't previously registered */
|
/* Unregister memory region that wasn't previously registered */
|
||||||
|
6
test/env/vtophys/vtophys.c
vendored
6
test/env/vtophys/vtophys.c
vendored
@ -135,8 +135,12 @@ mem_map_test(void)
|
|||||||
{
|
{
|
||||||
struct spdk_mem_map *map;
|
struct spdk_mem_map *map;
|
||||||
uint64_t default_translation = 0xDEADBEEF0BADF00D;
|
uint64_t default_translation = 0xDEADBEEF0BADF00D;
|
||||||
|
const struct spdk_mem_map_ops test_map_ops = {
|
||||||
|
.notify_cb = test_map_notify
|
||||||
|
};
|
||||||
|
|
||||||
map = spdk_mem_map_alloc(default_translation, test_map_notify, NULL);
|
|
||||||
|
map = spdk_mem_map_alloc(default_translation, &test_map_ops, NULL);
|
||||||
if (map == NULL) {
|
if (map == NULL) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user