diff --git a/src/vhost.c b/src/vhost.c index 2876a752e..33133fc05 100644 --- a/src/vhost.c +++ b/src/vhost.c @@ -84,6 +84,7 @@ struct pg_vhost_state { struct pg_vhost_socket *socket; rte_atomic32_t allow_queuing; int vid; + uint64_t flags; struct rte_mbuf *in[PG_MAX_PKTS_BURST]; struct rte_mbuf *out[PG_MAX_PKTS_BURST]; PG_PKTS_COUNT_TYPE tx_bytes; /* TX: [vhost] --> VM */ @@ -94,20 +95,18 @@ struct pg_vhost_state { #endif }; -static int new_vm(int dev); -static void destroy_vm(int dev); +static int on_new_device(int dev); +static void on_destroy_device(int dev); static const struct vhost_device_ops virtio_net_device_ops = { - .new_device = new_vm, - .destroy_device = destroy_vm, + .new_device = on_new_device, + .destroy_device = on_destroy_device, }; /* head of the socket list */ static LIST_HEAD(socket_list, pg_vhost_socket) sockets; static char *sockets_path; static int vhost_start_ok; -static int disable_freacture_mask; -static int enable_freacture_mask; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; @@ -181,6 +180,17 @@ static int vhost_burst(struct pg_brick *brick, enum pg_side from, #define TCP_PROTOCOL_NUMBER 6 #define UDP_PROTOCOL_NUMBER 17 +/* To know if a vhost brick is server or not. */ +static int pg_vhost_is_server(struct pg_brick *brick) +{ + struct pg_vhost_state *state = + pg_brick_get_state(brick, struct pg_vhost_state); + + if(state->flags & 1) + return 0; + return 1; +} + #ifdef PG_VHOST_FASTER_YET_BROKEN_POLL void pg_vhost_request_remove(struct pg_brick *brick) @@ -284,11 +294,15 @@ static void vhost_create_socket(struct pg_vhost_state *state, uint64_t flags, int ret; path = g_strdup_printf("%s/qemu-%s", sockets_path, state->brick.name); - g_remove(path); - - printf("New vhost-user socket: %s, zero-copy %s\n", path, + printf("New vhost-user socket: %s, zero-copy %s, client: %s\n", path, (flags & RTE_VHOST_USER_DEQUEUE_ZERO_COPY) ? - "enable" : "disable"); + "enable" : "disable", + (flags & RTE_VHOST_USER_CLIENT) ? + "true" : "false"); + + /* If the socket is CLIENT do NOT destroy the socket. */ + if((flags & 1) == 0) + g_remove(path);} flags = flags & (RTE_VHOST_USER_CLIENT | RTE_VHOST_USER_NO_RECONNECT | RTE_VHOST_USER_DEQUEUE_ZERO_COPY); @@ -350,11 +364,9 @@ static int vhost_init(struct pg_brick *brick, struct pg_brick_config *config, vhost_config = (struct pg_vhost_config *) config->brick_config; state->output = vhost_config->output; state->vid = -1; + state->flags = vhost_config->flags; PG_PKTS_COUNT_SET(state->rx_bytes, 0); PG_PKTS_COUNT_SET(state->tx_bytes, 0); - pg_vhost_enable(brick, enable_freacture_mask); - pg_vhost_disable(brick, disable_freacture_mask); - vhost_create_socket(state, vhost_config->flags, errp); if (pg_error_is_set(errp)) return -1; @@ -392,20 +404,19 @@ struct pg_brick *pg_vhost_new(const char *name, uint64_t flags, return ret; } - static void vhost_destroy(struct pg_brick *brick, struct pg_error **errp) { - struct pg_vhost_state *state; - - state = pg_brick_get_state(brick, struct pg_vhost_state); - rte_vhost_driver_unregister(state->socket->path); + struct pg_vhost_state *state = + pg_brick_get_state(brick, struct pg_vhost_state); pthread_mutex_lock(&mutex); - g_remove(state->socket->path); - LIST_REMOVE(state->socket, socket_list); + rte_vhost_driver_unregister(state->socket->path); g_free(state->socket->path); g_free(state->socket); - + LIST_REMOVE(state->socket, socket_list); + /* If the socket is client, do NOT destroy the existing socket. */ + if(pg_vhost_is_server(brick)) + g_remove(state->socket->path); pthread_mutex_unlock(&mutex); } @@ -431,7 +442,7 @@ static uint64_t tx_bytes(struct pg_brick *brick) pg_brick_get_state(brick, struct pg_vhost_state)->tx_bytes); } -static int new_vm(int dev) +static int on_new_device(int dev) { struct pg_vhost_socket *s = NULL; char buf[256]; @@ -454,7 +465,7 @@ static int new_vm(int dev) return 0; } -static void destroy_vm(int dev) +static void on_destroy_device(int dev) { struct pg_vhost_socket *s = NULL; char buf[256]; @@ -548,38 +559,6 @@ int pg_vhost_start(const char *base_dir, struct pg_error **errp) return 0; } -int pg_vhost_global_enable(uint64_t feature_mask) -{ - enable_freacture_mask |= feature_mask; - return 0; -} - -int pg_vhost_global_disable(uint64_t feature_mask) -{ - disable_freacture_mask |= feature_mask; - return 0; -} - -int pg_vhost_enable(struct pg_brick *brick, uint64_t feature_mask) -{ - const char *path = pg_vhost_socket_path(brick); - - if (unlikely(!path)) - return -1; - return rte_vhost_driver_enable_features(path, - feature_mask) ? -1 : 0; -} - -int pg_vhost_disable(struct pg_brick *brick, uint64_t feature_mask) -{ - const char *path = pg_vhost_socket_path(brick); - - if (unlikely(!path)) - return -1; - return rte_vhost_driver_disable_features(path, - feature_mask) ? -1 : 0; -} - static void vhost_link(struct pg_brick *brick, enum pg_side side, int edge) { struct pg_vhost_state *state =