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;
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",
// 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]);
}
{
// 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;
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]);
}
{
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);
*/
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;
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);
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);
}
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;
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));
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)
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;
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
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);
}
{
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);
}
}