vhost: move memory registration functions to vhost_compat.c
This change will allow us to move other DPDK specific functions to rte_vhost_compat.c, such as session callbacks which are the only consumers of these memory management functions. Change-Id: Ieb7b3f08ddf2e7cf04ecf18e8af4ad04124ccfea Signed-off-by: Vitaliy Mysak <vitaliy.mysak@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/470458 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
3f7e2ba18e
commit
0a089121f6
@ -47,6 +47,63 @@
|
|||||||
#include "vhost_internal.h"
|
#include "vhost_internal.h"
|
||||||
|
|
||||||
#include "spdk_internal/vhost_user.h"
|
#include "spdk_internal/vhost_user.h"
|
||||||
|
#include "spdk_internal/memory.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
vhost_session_mem_register(struct rte_vhost_memory *mem)
|
||||||
|
{
|
||||||
|
struct rte_vhost_mem_region *region;
|
||||||
|
uint32_t i;
|
||||||
|
uint64_t previous_start = UINT64_MAX;
|
||||||
|
|
||||||
|
for (i = 0; i < mem->nregions; i++) {
|
||||||
|
uint64_t start, end, len;
|
||||||
|
region = &mem->regions[i];
|
||||||
|
start = FLOOR_2MB(region->mmap_addr);
|
||||||
|
end = CEIL_2MB(region->mmap_addr + region->mmap_size);
|
||||||
|
if (start == previous_start) {
|
||||||
|
start += (size_t) VALUE_2MB;
|
||||||
|
}
|
||||||
|
previous_start = start;
|
||||||
|
len = end - start;
|
||||||
|
SPDK_INFOLOG(SPDK_LOG_VHOST, "Registering VM memory for vtophys translation - 0x%jx len:0x%jx\n",
|
||||||
|
start, len);
|
||||||
|
|
||||||
|
if (spdk_mem_register((void *)start, len) != 0) {
|
||||||
|
SPDK_WARNLOG("Failed to register memory region %"PRIu32". Future vtophys translation might fail.\n",
|
||||||
|
i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vhost_session_mem_unregister(struct rte_vhost_memory *mem)
|
||||||
|
{
|
||||||
|
struct rte_vhost_mem_region *region;
|
||||||
|
uint32_t i;
|
||||||
|
uint64_t previous_start = UINT64_MAX;
|
||||||
|
|
||||||
|
for (i = 0; i < mem->nregions; i++) {
|
||||||
|
uint64_t start, end, len;
|
||||||
|
region = &mem->regions[i];
|
||||||
|
start = FLOOR_2MB(region->mmap_addr);
|
||||||
|
end = CEIL_2MB(region->mmap_addr + region->mmap_size);
|
||||||
|
if (start == previous_start) {
|
||||||
|
start += (size_t) VALUE_2MB;
|
||||||
|
}
|
||||||
|
previous_start = start;
|
||||||
|
len = end - start;
|
||||||
|
|
||||||
|
if (spdk_vtophys((void *) start, NULL) == SPDK_VTOPHYS_ERROR) {
|
||||||
|
continue; /* region has not been registered */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spdk_mem_unregister((void *)start, len) != 0) {
|
||||||
|
assert(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
new_connection(int vid)
|
new_connection(int vid)
|
||||||
|
@ -524,62 +524,6 @@ vhost_session_find_by_vid(int vid)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
vhost_session_mem_register(struct rte_vhost_memory *mem)
|
|
||||||
{
|
|
||||||
struct rte_vhost_mem_region *region;
|
|
||||||
uint32_t i;
|
|
||||||
uint64_t previous_start = UINT64_MAX;
|
|
||||||
|
|
||||||
for (i = 0; i < mem->nregions; i++) {
|
|
||||||
uint64_t start, end, len;
|
|
||||||
region = &mem->regions[i];
|
|
||||||
start = FLOOR_2MB(region->mmap_addr);
|
|
||||||
end = CEIL_2MB(region->mmap_addr + region->mmap_size);
|
|
||||||
if (start == previous_start) {
|
|
||||||
start += (size_t) VALUE_2MB;
|
|
||||||
}
|
|
||||||
previous_start = start;
|
|
||||||
len = end - start;
|
|
||||||
SPDK_INFOLOG(SPDK_LOG_VHOST, "Registering VM memory for vtophys translation - 0x%jx len:0x%jx\n",
|
|
||||||
start, len);
|
|
||||||
|
|
||||||
if (spdk_mem_register((void *)start, len) != 0) {
|
|
||||||
SPDK_WARNLOG("Failed to register memory region %"PRIu32". Future vtophys translation might fail.\n",
|
|
||||||
i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
vhost_session_mem_unregister(struct rte_vhost_memory *mem)
|
|
||||||
{
|
|
||||||
struct rte_vhost_mem_region *region;
|
|
||||||
uint32_t i;
|
|
||||||
uint64_t previous_start = UINT64_MAX;
|
|
||||||
|
|
||||||
for (i = 0; i < mem->nregions; i++) {
|
|
||||||
uint64_t start, end, len;
|
|
||||||
region = &mem->regions[i];
|
|
||||||
start = FLOOR_2MB(region->mmap_addr);
|
|
||||||
end = CEIL_2MB(region->mmap_addr + region->mmap_size);
|
|
||||||
if (start == previous_start) {
|
|
||||||
start += (size_t) VALUE_2MB;
|
|
||||||
}
|
|
||||||
previous_start = start;
|
|
||||||
len = end - start;
|
|
||||||
|
|
||||||
if (spdk_vtophys((void *) start, NULL) == SPDK_VTOPHYS_ERROR) {
|
|
||||||
continue; /* region has not been registered */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spdk_mem_unregister((void *)start, len) != 0) {
|
|
||||||
assert(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct spdk_vhost_dev *
|
struct spdk_vhost_dev *
|
||||||
spdk_vhost_dev_next(struct spdk_vhost_dev *vdev)
|
spdk_vhost_dev_next(struct spdk_vhost_dev *vdev)
|
||||||
{
|
{
|
||||||
|
@ -330,6 +330,12 @@ int vhost_set_config_cb(int vid, uint8_t *config, uint32_t offset,
|
|||||||
uint32_t size, uint32_t flags)
|
uint32_t size, uint32_t flags)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Memory registration functions used in start/stop device callbacks
|
||||||
|
*/
|
||||||
|
void vhost_session_mem_register(struct rte_vhost_memory *mem);
|
||||||
|
void vhost_session_mem_unregister(struct rte_vhost_memory *mem);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call a function for each session of the provided vhost device.
|
* Call a function for each session of the provided vhost device.
|
||||||
* The function will be called one-by-one on each session's thread.
|
* The function will be called one-by-one on each session's thread.
|
||||||
|
Loading…
Reference in New Issue
Block a user