X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Fdevices%2Fdpdk%2Fvhost_user.c;h=46fae60dac7053f945a3ed47dbe3e6caf8d3137c;hb=9876520f9ba746ed4d9923f392911c4f1888a105;hp=11a81c2d7cb310081612b128dc860b5571eb95c0;hpb=5e15c91b6c2b5fbd7f989c5dc4edde506d254926;p=vpp.git diff --git a/vnet/vnet/devices/dpdk/vhost_user.c b/vnet/vnet/devices/dpdk/vhost_user.c index 11a81c2d7cb..46fae60dac7 100644 --- a/vnet/vnet/devices/dpdk/vhost_user.c +++ b/vnet/vnet/devices/dpdk/vhost_user.c @@ -137,7 +137,7 @@ dpdk_vhost_user_device_from_hw_if_index (u32 hw_if_index) vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index); dpdk_device_t *xd = vec_elt_at_index (dm->devices, hi->dev_instance); - if (xd->dev_type != VNET_DPDK_DEV_VHOST_USER) + if ((xd->flags DPDK_DEVICE_FLAG_VHOST_USER) == 0) return 0; return xd; @@ -221,7 +221,7 @@ dpdk_create_vhost_user_if_internal (u32 * hw_if_index, u32 if_id, u8 * hwaddr) if (vec_len (dm->devices) > vui_idx) { xd = vec_elt_at_index (dm->devices, vui_idx); - if (xd->dev_type == VNET_DPDK_DEV_VHOST_USER) + if (xd->flags & DPDK_DEVICE_FLAG_VHOST_USER) { DBG_SOCK ("reusing inactive vhost-user interface sw_if_index %d", @@ -266,7 +266,7 @@ dpdk_create_vhost_user_if_internal (u32 * hw_if_index, u32 if_id, u8 * hwaddr) // reset tx vectors for (j = 0; j < tm->n_vlib_mains; j++) { - vec_validate_ha (xd->tx_vectors[j], DPDK_TX_RING_SIZE, + vec_validate_ha (xd->tx_vectors[j], xd->nb_tx_desc, sizeof (tx_ring_hdr_t), CLIB_CACHE_LINE_BYTES); vec_reset_length (xd->tx_vectors[j]); } @@ -283,7 +283,7 @@ dpdk_create_vhost_user_if_internal (u32 * hw_if_index, u32 if_id, u8 * hwaddr) { // vui was not retrieved from inactive ifaces - create new vec_add2_aligned (dm->devices, xd, 1, CLIB_CACHE_LINE_BYTES); - xd->dev_type = VNET_DPDK_DEV_VHOST_USER; + xd->flags |= DPDK_DEVICE_FLAG_VHOST_USER; xd->rx_q_used = num_qpairs; xd->tx_q_used = num_qpairs; xd->vu_vhost_dev.virt_qp_nb = num_qpairs; @@ -338,7 +338,7 @@ dpdk_create_vhost_user_if_internal (u32 * hw_if_index, u32 if_id, u8 * hwaddr) for (j = 0; j < tm->n_vlib_mains; j++) { - vec_validate_ha (xd->tx_vectors[j], DPDK_TX_RING_SIZE, + vec_validate_ha (xd->tx_vectors[j], xd->nb_tx_desc, sizeof (tx_ring_hdr_t), CLIB_CACHE_LINE_BYTES); vec_reset_length (xd->tx_vectors[j]); } @@ -393,7 +393,7 @@ dpdk_create_vhost_user_if_internal (u32 * hw_if_index, u32 if_id, u8 * hwaddr) { int cpu = dm->input_cpu_first_index + (next_cpu % dm->input_cpu_count); - unsigned lcore = vlib_worker_threads[cpu].dpdk_lcore_id; + unsigned lcore = vlib_worker_threads[cpu].lcore_id; vec_validate (xd->cpu_socket_id_by_queue, q); xd->cpu_socket_id_by_queue[q] = rte_lcore_to_socket_id (lcore); @@ -660,6 +660,15 @@ dpdk_vhost_user_get_vring_base (u32 hw_if_index, u8 idx, u32 * num) */ DBG_SOCK ("Stopping vring Q %u of device %d", idx, hw_if_index); dpdk_vu_intf_t *vui = xd->vu_intf; + + /* if there is old fd, delete it */ + if (vui->vrings[idx].callfd > 0) + { + unix_file_t *uf = pool_elt_at_index (unix_main.file_pool, + vui->vrings[idx].callfd_idx); + unix_file_del (&unix_main, uf); + } + vui->vrings[idx].enabled = 0; /* Reset local copy */ vui->vrings[idx].callfd = -1; /* Reset FD */ vq->enabled = 0; @@ -833,7 +842,7 @@ dpdk_vhost_user_set_vring_call (u32 hw_if_index, u8 idx, int fd) dpdk_vu_intf_t *vui = xd->vu_intf; /* if there is old fd, delete it */ - if (vui->vrings[idx].callfd > 0) + if (vui->vrings[idx].callfd > -1) { unix_file_t *uf = pool_elt_at_index (unix_main.file_pool, vui->vrings[idx].callfd_idx); @@ -863,7 +872,7 @@ dpdk_vhost_user_want_interrupt (dpdk_device_t * xd, int idx) struct vhost_virtqueue *vq = xd->vu_vhost_dev.virtqueue[idx]; /* return if vm is interested in interrupts */ - return (vring->callfd > 0) + return (vring->callfd > -1) && !(vq->avail->flags & VRING_AVAIL_F_NO_INTERRUPT); } @@ -881,7 +890,8 @@ dpdk_vhost_user_send_interrupt (vlib_main_t * vm, dpdk_device_t * xd, int idx) struct vhost_virtqueue *vq = xd->vu_vhost_dev.virtqueue[idx]; /* if vm is interested in interrupts */ - if ((vring->callfd > 0) && !(vq->avail->flags & VRING_AVAIL_F_NO_INTERRUPT)) + if ((vring->callfd > -1) + && !(vq->avail->flags & VRING_AVAIL_F_NO_INTERRUPT)) { eventfd_write (vring->callfd, (eventfd_t) 1); vring->n_since_last_int = 0; @@ -901,6 +911,7 @@ dpdk_vhost_user_vui_init (vnet_main_t * vnm, const char *sock_filename, u8 is_server, u64 feature_mask, u32 * sw_if_index) { + int q; dpdk_vu_intf_t *vui = xd->vu_intf; memset (vui, 0, sizeof (*vui)); @@ -916,6 +927,13 @@ dpdk_vhost_user_vui_init (vnet_main_t * vnm, vui->active = 1; vui->unix_file_index = ~0; + for (q = 0; q < vui->num_vrings; q++) + { + vui->vrings[q].enabled = 0; + vui->vrings[q].callfd = -1; + vui->vrings[q].kickfd = -1; + } + vnet_hw_interface_set_flags (vnm, xd->vlib_hw_if_index, 0); if (sw_if_index) @@ -997,6 +1015,19 @@ dpdk_vhost_user_if_disconnect (dpdk_device_t * xd) for (q = 0; q < vui->num_vrings; q++) { vq = xd->vu_vhost_dev.virtqueue[q]; + if (vui->vrings[q].callfd > -1) + { + unix_file_t *uf = pool_elt_at_index (unix_main.file_pool, + vui->vrings[q].callfd_idx); + unix_file_del (&unix_main, uf); + } + + if (vui->vrings[q].kickfd > -1) + { + close (vui->vrings[q].kickfd); + vui->vrings[q].kickfd = -1; + } + vui->vrings[q].enabled = 0; /* Reset local copy */ vui->vrings[q].callfd = -1; /* Reset FD */ vq->enabled = 0; @@ -1200,6 +1231,9 @@ dpdk_vhost_user_socket_read (unix_file_t * uf) if (number_of_fds != 1) goto close_socket; + if (vui->vrings[q].kickfd > -1) + close (vui->vrings[q].kickfd); + vui->vrings[q].kickfd = fds[0]; } else @@ -1661,7 +1695,7 @@ dpdk_vhost_user_dump_ifs (vnet_main_t * vnm, vlib_main_t * vm, vec_foreach (xd, dm->devices) { - if (xd->dev_type == VNET_DPDK_DEV_VHOST_USER && xd->vu_intf->active) + if ((xd->flags & DPDK_DEVICE_FLAG_VHOST_USER) && xd->vu_intf->active) vec_add1 (hw_if_indices, xd->vlib_hw_if_index); } @@ -1790,6 +1824,7 @@ dpdk_vhost_user_process_if (vlib_main_t * vm, dpdk_device_t * xd, void *ctx) } return 0; } +#endif /* * CLI functions @@ -1800,6 +1835,7 @@ dpdk_vhost_user_connect_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { +#if DPDK_VHOST_USER dpdk_main_t *dm = &dpdk_main; unformat_input_t _line_input, *line_input = &_line_input; u8 *sock_filename = NULL; @@ -1813,7 +1849,9 @@ dpdk_vhost_user_connect_command_fn (vlib_main_t * vm, if (dm->conf->use_virtio_vhost) { +#endif return vhost_user_connect_command_fn (vm, input, cmd); +#if DPDK_VHOST_USER } /* Get a line of input. */ @@ -1854,6 +1892,7 @@ dpdk_vhost_user_connect_command_fn (vlib_main_t * vm, vlib_cli_output (vm, "%U\n", format_vnet_sw_if_index_name, vnet_get_main (), sw_if_index); return 0; +#endif } /* *INDENT-OFF* */ @@ -1902,7 +1941,11 @@ dpdk_vhost_user_delete_command_fn (vlib_main_t * vm, vnet_main_t *vnm = vnet_get_main (); +#if DPDK_VHOST_USER dpdk_vhost_user_delete_if (vnm, vm, sw_if_index); +#else + vhost_user_delete_if (vnm, vm, sw_if_index); +#endif return 0; } @@ -1925,6 +1968,7 @@ show_dpdk_vhost_user_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { +#if DPDK_VHOST_USER clib_error_t *error = 0; dpdk_main_t *dm = &dpdk_main; vnet_main_t *vnm = vnet_get_main (); @@ -1952,7 +1996,9 @@ show_dpdk_vhost_user_command_fn (vlib_main_t * vm, if (dm->conf->use_virtio_vhost) { +#endif return show_vhost_user_command_fn (vm, input, cmd); +#if DPDK_VHOST_USER } while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) @@ -1976,7 +2022,7 @@ show_dpdk_vhost_user_command_fn (vlib_main_t * vm, { vec_foreach (xd, dm->devices) { - if (xd->dev_type == VNET_DPDK_DEV_VHOST_USER && xd->vu_intf->active) + if ((xd->flags DPDK_DEVICE_FLAG_VHOST_USER) && xd->vu_intf->active) vec_add1 (hw_if_indices, xd->vlib_hw_if_index); } } @@ -2089,6 +2135,7 @@ show_dpdk_vhost_user_command_fn (vlib_main_t * vm, done: vec_free (hw_if_indices); return error; +#endif } /* *INDENT-OFF* */ @@ -2098,7 +2145,6 @@ VLIB_CLI_COMMAND (show_vhost_user_command, static) = { .function = show_dpdk_vhost_user_command_fn, }; /* *INDENT-ON* */ -#endif /* * fd.io coding-style-patch-verification: ON