ut/vhost: add helper functions to start/stop a device
This refactors the way we setup vhost devices. Hopefully when we change internal vhost ABI/logic in future, we won't have to go through all vhost test cases and refactor them. alloc_vdev - allocate *and* register the device. It makes little to no sense to have a non-registered device since you cannot call any spdk_vhost_dev_* functions on it. start_vdev - simulate a connection on the device socket stop_vdev - close the connection cleanup_vdev - do everything necessary to cleanup and free the vdev This implies closing the connection. Change-Id: Ic97f969ec7a57cec7092c0f7681c2e7e44ceb31e Signed-off-by: Dariusz Stojaczyk <dariuszx.stojaczyk@intel.com> Reviewed-on: https://review.gerrithub.io/399603 Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
This commit is contained in:
parent
eeab0d6cb1
commit
341a489ac9
@ -106,14 +106,16 @@ DEFINE_STUB(rte_vhost_set_vhost_vring_last_idx, int,
|
|||||||
(int vid, uint16_t vring_idx, uint16_t last_avail_idx, uint16_t last_used_idx), 0);
|
(int vid, uint16_t vring_idx, uint16_t last_avail_idx, uint16_t last_used_idx), 0);
|
||||||
DEFINE_STUB(spdk_env_get_current_core, uint32_t, (void), 0);
|
DEFINE_STUB(spdk_env_get_current_core, uint32_t, (void), 0);
|
||||||
|
|
||||||
|
static struct spdk_vhost_dev_backend g_vdev_backend;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
test_setup(void)
|
test_setup(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct spdk_vhost_dev *
|
static int
|
||||||
alloc_vdev(void)
|
alloc_vdev(struct spdk_vhost_dev **vdev_p, const char *name, const char *cpumask)
|
||||||
{
|
{
|
||||||
struct spdk_vhost_dev *vdev = NULL;
|
struct spdk_vhost_dev *vdev = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
@ -123,7 +125,22 @@ alloc_vdev(void)
|
|||||||
CU_ASSERT(rc == 0);
|
CU_ASSERT(rc == 0);
|
||||||
SPDK_CU_ASSERT_FATAL(vdev != NULL);
|
SPDK_CU_ASSERT_FATAL(vdev != NULL);
|
||||||
memset(vdev, 0, sizeof(*vdev));
|
memset(vdev, 0, sizeof(*vdev));
|
||||||
|
rc = spdk_vhost_dev_register(vdev, name, cpumask, &g_vdev_backend);
|
||||||
|
if (rc == 0) {
|
||||||
|
*vdev_p = vdev;
|
||||||
|
} else {
|
||||||
|
free(vdev);
|
||||||
|
*vdev_p = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
start_vdev(struct spdk_vhost_dev *vdev)
|
||||||
|
{
|
||||||
|
vdev->vid = 0;
|
||||||
|
vdev->lcore = 0;
|
||||||
vdev->mem = calloc(1, sizeof(*vdev->mem) + 2 * sizeof(struct rte_vhost_mem_region));
|
vdev->mem = calloc(1, sizeof(*vdev->mem) + 2 * sizeof(struct rte_vhost_mem_region));
|
||||||
SPDK_CU_ASSERT_FATAL(vdev->mem != NULL);
|
SPDK_CU_ASSERT_FATAL(vdev->mem != NULL);
|
||||||
vdev->mem->nregions = 2;
|
vdev->mem->nregions = 2;
|
||||||
@ -133,14 +150,21 @@ alloc_vdev(void)
|
|||||||
vdev->mem->regions[1].guest_phys_addr = 0x400000;
|
vdev->mem->regions[1].guest_phys_addr = 0x400000;
|
||||||
vdev->mem->regions[1].size = 0x400000; /* 4 MB */
|
vdev->mem->regions[1].size = 0x400000; /* 4 MB */
|
||||||
vdev->mem->regions[1].host_user_addr = 0x2000000;
|
vdev->mem->regions[1].host_user_addr = 0x2000000;
|
||||||
|
|
||||||
return vdev;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
free_vdev(struct spdk_vhost_dev *vdev)
|
stop_vdev(struct spdk_vhost_dev *vdev)
|
||||||
{
|
{
|
||||||
free(vdev->mem);
|
free(vdev->mem);
|
||||||
|
vdev->mem = NULL;
|
||||||
|
vdev->vid = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cleanup_vdev(struct spdk_vhost_dev *vdev)
|
||||||
|
{
|
||||||
|
stop_vdev(vdev);
|
||||||
|
spdk_vhost_dev_unregister(vdev);
|
||||||
free(vdev);
|
free(vdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,7 +177,9 @@ desc_to_iov_test(void)
|
|||||||
struct vring_desc desc;
|
struct vring_desc desc;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
vdev = alloc_vdev();
|
rc = alloc_vdev(&vdev, "vdev_name_0", "0x1");
|
||||||
|
SPDK_CU_ASSERT_FATAL(rc == 0 && vdev);
|
||||||
|
start_vdev(vdev);
|
||||||
|
|
||||||
/* Test simple case where iov falls fully within a 2MB page. */
|
/* Test simple case where iov falls fully within a 2MB page. */
|
||||||
desc.addr = 0x110000;
|
desc.addr = 0x110000;
|
||||||
@ -218,7 +244,7 @@ desc_to_iov_test(void)
|
|||||||
CU_ASSERT(iov[1].iov_len == 0x10000);
|
CU_ASSERT(iov[1].iov_len == 0x10000);
|
||||||
memset(iov, 0, sizeof(iov));
|
memset(iov, 0, sizeof(iov));
|
||||||
|
|
||||||
free_vdev(vdev);
|
cleanup_vdev(vdev);
|
||||||
|
|
||||||
CU_ASSERT(true);
|
CU_ASSERT(true);
|
||||||
}
|
}
|
||||||
@ -229,49 +255,41 @@ create_controller_test(void)
|
|||||||
struct spdk_vhost_dev *vdev, *vdev2;
|
struct spdk_vhost_dev *vdev, *vdev2;
|
||||||
int ret;
|
int ret;
|
||||||
char long_name[PATH_MAX];
|
char long_name[PATH_MAX];
|
||||||
struct spdk_vhost_dev_backend backend;
|
|
||||||
|
|
||||||
/* NOTE: spdk_app_get_core_mask stub always sets coremask 0x01 */
|
/* NOTE: spdk_app_get_core_mask stub always sets coremask 0x01 */
|
||||||
|
|
||||||
/* Create device with no name */
|
/* Create device with no name */
|
||||||
vdev = alloc_vdev();
|
ret = alloc_vdev(&vdev, NULL, "0x1");
|
||||||
ret = spdk_vhost_dev_register(vdev, NULL, "0x1", &backend);
|
|
||||||
CU_ASSERT(ret != 0);
|
CU_ASSERT(ret != 0);
|
||||||
|
|
||||||
/* Create device with incorrect cpumask */
|
/* Create device with incorrect cpumask */
|
||||||
ret = spdk_vhost_dev_register(vdev, "vdev_name_0", "0x2", &backend);
|
ret = alloc_vdev(&vdev, "vdev_name_0", "0x2");
|
||||||
CU_ASSERT(ret != 0);
|
CU_ASSERT(ret != 0);
|
||||||
|
|
||||||
/* Create device with too long name and path */
|
/* Create device with too long name and path */
|
||||||
memset(long_name, 'x', sizeof(long_name));
|
memset(long_name, 'x', sizeof(long_name));
|
||||||
long_name[PATH_MAX - 1] = 0;
|
long_name[PATH_MAX - 1] = 0;
|
||||||
snprintf(dev_dirname, sizeof(dev_dirname), "some_path/");
|
snprintf(dev_dirname, sizeof(dev_dirname), "some_path/");
|
||||||
ret = spdk_vhost_dev_register(vdev, long_name, "0x1", &backend);
|
ret = alloc_vdev(&vdev, long_name, "0x1");
|
||||||
CU_ASSERT(ret != 0);
|
CU_ASSERT(ret != 0);
|
||||||
dev_dirname[0] = 0;
|
dev_dirname[0] = 0;
|
||||||
|
|
||||||
/* Create device when device name is already taken */
|
/* Create device when device name is already taken */
|
||||||
ret = spdk_vhost_dev_register(vdev, "vdev_name_0", "0x1", &backend);
|
ret = alloc_vdev(&vdev, "vdev_name_0", "0x1");
|
||||||
CU_ASSERT(ret == 0);
|
SPDK_CU_ASSERT_FATAL(ret == 0 && vdev);
|
||||||
vdev2 = alloc_vdev();
|
ret = alloc_vdev(&vdev2, "vdev_name_0", "0x1");
|
||||||
ret = spdk_vhost_dev_register(vdev2, "vdev_name_0", "0x1", &backend);
|
|
||||||
CU_ASSERT(ret != 0);
|
CU_ASSERT(ret != 0);
|
||||||
free_vdev(vdev2);
|
cleanup_vdev(vdev);
|
||||||
|
|
||||||
spdk_vhost_dev_unregister(vdev);
|
|
||||||
free_vdev(vdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dev_find_by_vid_test(void)
|
dev_find_by_vid_test(void)
|
||||||
{
|
{
|
||||||
struct spdk_vhost_dev *vdev, *tmp;
|
struct spdk_vhost_dev *vdev, *tmp;
|
||||||
struct spdk_vhost_dev_backend backend;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
vdev = alloc_vdev();
|
rc = alloc_vdev(&vdev, "vdev_name_0", "0x1");
|
||||||
rc = spdk_vhost_dev_register(vdev, "vdev_name_0", "0x1", &backend);
|
SPDK_CU_ASSERT_FATAL(rc == 0 && vdev);
|
||||||
CU_ASSERT(rc == 0);
|
|
||||||
|
|
||||||
tmp = spdk_vhost_dev_find_by_vid(vdev->vid);
|
tmp = spdk_vhost_dev_find_by_vid(vdev->vid);
|
||||||
CU_ASSERT(tmp == vdev);
|
CU_ASSERT(tmp == vdev);
|
||||||
@ -280,32 +298,24 @@ dev_find_by_vid_test(void)
|
|||||||
tmp = spdk_vhost_dev_find_by_vid(vdev->vid + 0xFF);
|
tmp = spdk_vhost_dev_find_by_vid(vdev->vid + 0xFF);
|
||||||
CU_ASSERT(tmp == NULL);
|
CU_ASSERT(tmp == NULL);
|
||||||
|
|
||||||
spdk_vhost_dev_unregister(vdev);
|
cleanup_vdev(vdev);
|
||||||
free_vdev(vdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_controller_test(void)
|
remove_controller_test(void)
|
||||||
{
|
{
|
||||||
struct spdk_vhost_dev *vdev;
|
struct spdk_vhost_dev *vdev;
|
||||||
struct spdk_vhost_dev_backend backend;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
vdev = alloc_vdev();
|
ret = alloc_vdev(&vdev, "vdev_name_0", "0x1");
|
||||||
ret = spdk_vhost_dev_register(vdev, "vdev_name_0", "0x1", &backend);
|
SPDK_CU_ASSERT_FATAL(ret == 0 && vdev);
|
||||||
CU_ASSERT(ret == 0);
|
|
||||||
|
|
||||||
/* Remove device when controller is in use */
|
/* Remove device when controller is in use */
|
||||||
vdev->vid = 0;
|
start_vdev(vdev);
|
||||||
vdev->lcore = 0;
|
|
||||||
ret = spdk_vhost_dev_unregister(vdev);
|
ret = spdk_vhost_dev_unregister(vdev);
|
||||||
CU_ASSERT(ret != 0);
|
CU_ASSERT(ret != 0);
|
||||||
|
|
||||||
vdev->vid = -1;
|
cleanup_vdev(vdev);
|
||||||
vdev->lcore = -1;
|
|
||||||
ret = spdk_vhost_dev_unregister(vdev);
|
|
||||||
CU_ASSERT(ret == 0);
|
|
||||||
free_vdev(vdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
Loading…
Reference in New Issue
Block a user