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:
Dariusz Stojaczyk 2018-02-13 15:08:36 +01:00 committed by Jim Harris
parent eeab0d6cb1
commit 341a489ac9

View File

@ -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