ssize_t map_sz = (vui->regions[i].memory_size +
vui->regions[i].mmap_offset +
- page_sz) & ~(page_sz - 1);
+ page_sz - 1) & ~(page_sz - 1);
r =
munmap (vui->region_mmap_addr[i] - vui->regions[i].mmap_offset,
/* align size to 2M page */
ssize_t map_sz = (vui->regions[i].memory_size +
vui->regions[i].mmap_offset +
- page_sz) & ~(page_sz - 1);
+ page_sz - 1) & ~(page_sz - 1);
vui->region_mmap_addr[i] = mmap (0, map_sz, PROT_READ | PROT_WRITE,
MAP_SHARED, fds[i], 0);
/* align size to 2M page */
long page_sz = get_huge_page_size (fd);
ssize_t map_sz =
- (msg.log.size + msg.log.offset + page_sz) & ~(page_sz - 1);
+ (msg.log.size + msg.log.offset + page_sz - 1) & ~(page_sz - 1);
vui->log_base_addr = mmap (0, map_sz, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
vum->random = random_default_seed ();
- return 0;
-}
+ mhash_init_c_string (&vum->if_index_by_sock_name, sizeof (uword));
-VLIB_INIT_FUNCTION (vhost_user_init);
-
-static clib_error_t *
-vhost_user_exit (vlib_main_t * vm)
-{
- /* TODO cleanup */
return 0;
}
-VLIB_MAIN_LOOP_EXIT_FUNCTION (vhost_user_exit);
+VLIB_INIT_FUNCTION (vhost_user_init);
static u8 *
format_vhost_trace (u8 * s, va_list * va)
vhost_user_term_if (vhost_user_intf_t * vui)
{
int q;
+ vhost_user_main_t *vum = &vhost_user_main;
// Delete configured thread pinning
vec_reset_length (vui->workers);
vui->unix_server_index);
unix_file_del (&unix_main, uf);
vui->unix_server_index = ~0;
+ unlink (vui->sock_filename);
}
+
+ mhash_unset (&vum->if_index_by_sock_name, vui->sock_filename,
+ &vui->if_index);
}
int
return rv;
}
+static clib_error_t *
+vhost_user_exit (vlib_main_t * vm)
+{
+ vnet_main_t *vnm = vnet_get_main ();
+ vhost_user_main_t *vum = &vhost_user_main;
+ vhost_user_intf_t *vui;
+
+ vlib_worker_thread_barrier_sync (vlib_get_main ());
+ /* *INDENT-OFF* */
+ pool_foreach (vui, vum->vhost_user_interfaces, {
+ vhost_user_delete_if (vnm, vm, vui->sw_if_index);
+ });
+ /* *INDENT-ON* */
+ vlib_worker_thread_barrier_release (vlib_get_main ());
+ return 0;
+}
+
+VLIB_MAIN_LOOP_EXIT_FUNCTION (vhost_user_exit);
+
/**
* Open server unix socket on specified sock_filename.
*/
vnet_sw_interface_t *sw;
sw = vnet_get_hw_sw_interface (vnm, vui->hw_if_index);
int q;
+ vhost_user_main_t *vum = &vhost_user_main;
if (server_sock_fd != -1)
{
unix_file_t template = { 0 };
template.read_function = vhost_user_socksvr_accept_ready;
template.file_descriptor = server_sock_fd;
- template.private_data = vui - vhost_user_main.vhost_user_interfaces; //hw index
+ template.private_data = vui - vum->vhost_user_interfaces; //hw index
vui->unix_server_index = unix_file_add (&unix_main, &template);
}
else
vui->unix_file_index = ~0;
vui->log_base_addr = 0;
vui->operation_mode = operation_mode;
+ vui->if_index = vui - vum->vhost_user_interfaces;
+ mhash_set_mem (&vum->if_index_by_sock_name, vui->sock_filename,
+ &vui->if_index, 0);
for (q = 0; q < VHOST_VRING_MAX_N; q++)
vhost_user_vring_init (vui, q);
int rv = 0;
int server_sock_fd = -1;
vhost_user_main_t *vum = &vhost_user_main;
+ uword *if_index;
if ((operation_mode != VHOST_USER_POLLING_MODE) &&
(operation_mode != VHOST_USER_INTERRUPT_MODE))
return VNET_API_ERROR_INVALID_ARGUMENT;
}
+ if_index = mhash_get (&vum->if_index_by_sock_name, (void *) sock_filename);
+ if (if_index)
+ {
+ if (sw_if_index)
+ {
+ vui = &vum->vhost_user_interfaces[*if_index];
+ *sw_if_index = vui->sw_if_index;
+ }
+ return VNET_API_ERROR_IF_ALREADY_EXISTS;
+ }
+
if (is_server)
{
if ((rv =
int server_sock_fd = -1;
int rv = 0;
vnet_hw_interface_t *hwif;
+ uword *if_index;
if ((operation_mode != VHOST_USER_POLLING_MODE) &&
(operation_mode != VHOST_USER_INTERRUPT_MODE))
hwif->dev_class_index != vhost_user_dev_class.index)
return VNET_API_ERROR_INVALID_SW_IF_INDEX;
+ if (sock_filename == NULL || !(strlen (sock_filename) > 0))
+ return VNET_API_ERROR_INVALID_ARGUMENT;
+
vui = vec_elt_at_index (vum->vhost_user_interfaces, hwif->dev_instance);
+ /*
+ * Disallow changing the interface to have the same path name
+ * as other interface
+ */
+ if_index = mhash_get (&vum->if_index_by_sock_name, (void *) sock_filename);
+ if (if_index && (*if_index != vui->if_index))
+ return VNET_API_ERROR_IF_ALREADY_EXISTS;
+
// First try to open server socket
if (is_server)
if ((rv = vhost_user_init_server_sock (sock_filename,