if (PREDICT_FALSE
(vum->cpus[cpu_index].rx_buffers_len == 0))
{
+ /* Cancel speculation */
+ to_next--;
+ n_left_to_next++;
+
/*
* Checking if there are some left buffers.
* If not, just rewind the used buffers and stop.
strncpy (sun.sun_path, (char *) vui->sock_filename,
sizeof (sun.sun_path) - 1);
+ /* Avoid hanging VPP if the other end does not accept */
+ if (fcntl(sockfd, F_SETFL, O_NONBLOCK) < 0)
+ clib_unix_warning ("fcntl");
+
if (connect (sockfd, (struct sockaddr *) &sun,
sizeof (struct sockaddr_un)) == 0)
{
+ /* Set the socket to blocking as it was before */
+ if (fcntl(sockfd, F_SETFL, 0) < 0)
+ clib_unix_warning ("fcntl2");
+
vui->sock_errno = 0;
template.file_descriptor = sockfd;
template.private_data =
static void
vhost_user_term_if (vhost_user_intf_t * vui)
{
+ int q;
+
// Delete configured thread pinning
vec_reset_length (vui->workers);
// disconnect interface sockets
vhost_user_if_disconnect (vui);
vhost_user_update_iface_state (vui);
+ for (q = 0; q < VHOST_VRING_MAX_N; q++)
+ {
+ clib_mem_free ((void *) vui->vring_locks[q]);
+ }
+
if (vui->unix_server_index != ~0)
{
//Close server socket
// Disable and reset interface
vhost_user_term_if (vui);
- // Back to pool
- pool_put (vum->vhost_user_interfaces, vui);
-
// Reset renumbered iface
if (hwif->dev_instance <
vec_len (vum->show_dev_instance_by_real_dev_instance))
// Delete ethernet interface
ethernet_delete_interface (vnm, vui->hw_if_index);
+
+ // Back to pool
+ pool_put (vum->vhost_user_interfaces, vui);
+
return rv;
}