return vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_FEATURES, &features);
}
-static uint64_t vhost_req_user_to_kernel[] = {
- [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER,
- [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL,
- [VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM,
- [VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE,
- [VHOST_USER_GET_VRING_BASE] = VHOST_GET_VRING_BASE,
- [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR,
- [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK,
- [VHOST_USER_SET_MEM_TABLE] = VHOST_SET_MEM_TABLE,
-};
-
static int
add_memseg_list(const struct rte_memseg_list *msl, void *arg)
{
* have much more memory regions. Below function will treat each
* contiguous memory space reserved by DPDK as one region.
*/
-static struct vhost_memory_kernel *
-prepare_vhost_memory_kernel(void)
+static int
+vhost_kernel_set_memory_table(struct virtio_user_dev *dev)
{
struct vhost_memory_kernel *vm;
+ int ret;
vm = malloc(sizeof(struct vhost_memory_kernel) +
max_regions *
sizeof(struct vhost_memory_region));
if (!vm)
- return NULL;
+ goto err;
vm->nregions = 0;
vm->padding = 0;
* The memory lock has already been taken by memory subsystem
* or virtio_user_start_device().
*/
- if (rte_memseg_list_walk_thread_unsafe(add_memseg_list, vm) < 0) {
- free(vm);
- return NULL;
- }
+ ret = rte_memseg_list_walk_thread_unsafe(add_memseg_list, vm);
+ if (ret < 0)
+ goto err_free;
+
+ ret = vhost_kernel_ioctl(dev->vhostfds[0], VHOST_SET_MEM_TABLE, vm);
+ if (ret < 0)
+ goto err_free;
- return vm;
+ free(vm);
+
+ return 0;
+err_free:
+ free(vm);
+err:
+ PMD_DRV_LOG(ERR, "Failed to set memory table");
+ return -1;
}
+static uint64_t vhost_req_user_to_kernel[] = {
+ [VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER,
+ [VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL,
+ [VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM,
+ [VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE,
+ [VHOST_USER_GET_VRING_BASE] = VHOST_GET_VRING_BASE,
+ [VHOST_USER_SET_VRING_ADDR] = VHOST_SET_VRING_ADDR,
+ [VHOST_USER_SET_VRING_KICK] = VHOST_SET_VRING_KICK,
+};
+
static int
vhost_kernel_send_request(struct virtio_user_dev *dev,
enum vhost_user_request req,
int ret = -1;
unsigned int i;
uint64_t req_kernel;
- struct vhost_memory_kernel *vm = NULL;
int vhostfd;
unsigned int queue_sel;
req_kernel = vhost_req_user_to_kernel[req];
- if (req_kernel == VHOST_SET_MEM_TABLE) {
- vm = prepare_vhost_memory_kernel();
- if (!vm)
- return -1;
- arg = (void *)vm;
- }
-
switch (req_kernel) {
case VHOST_SET_VRING_NUM:
case VHOST_SET_VRING_ADDR:
ret = ioctl(vhostfd, req_kernel, arg);
}
- if (vm)
- free(vm);
-
if (ret < 0)
PMD_DRV_LOG(ERR, "%s failed: %s",
vhost_msg_strings[req], strerror(errno));
.set_owner = vhost_kernel_set_owner,
.get_features = vhost_kernel_get_features,
.set_features = vhost_kernel_set_features,
+ .set_memory_table = vhost_kernel_set_memory_table,
.send_request = vhost_kernel_send_request,
.enable_qp = vhost_kernel_enable_queue_pair
};