X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;ds=inline;f=src%2Fplugins%2Fmemif%2Fmemif.c;h=05a7f83b3b112e43e8265106fb843713cf4e28cb;hb=2de9c0f92;hp=3171ba22f7df93862cb160c4ac6662c3acbfe99e;hpb=e58041f242bf4bd120ecc9619b88348d80b94c17;p=vpp.git diff --git a/src/plugins/memif/memif.c b/src/plugins/memif/memif.c index 3171ba22f7d..05a7f83b3b1 100644 --- a/src/plugins/memif/memif.c +++ b/src/plugins/memif/memif.c @@ -65,6 +65,24 @@ memif_queue_intfd_close (memif_queue_t * mq) } } +static void +memif_disconnect_free_zc_queue_buffer (memif_queue_t * mq, u8 is_rx) +{ + vlib_main_t *vm = vlib_get_main (); + u16 ring_size, n_slots, mask, start; + + ring_size = 1 << mq->log2_ring_size; + mask = ring_size - 1; + n_slots = mq->ring->head - mq->last_tail; + start = mq->last_tail & mask; + if (is_rx) + vlib_buffer_free_from_ring (vm, mq->buffers, start, ring_size, n_slots); + else + vlib_buffer_free_from_ring_no_next (vm, mq->buffers, start, ring_size, + n_slots); + vec_free (mq->buffers); +} + void memif_disconnect (memif_if_t * mif, clib_error_t * err) { @@ -126,10 +144,28 @@ memif_disconnect (memif_if_t * mif, clib_error_t * err) memif_log_warn (mif, "Unable to unassign interface %d, queue %d: rc=%d", mif->hw_if_index, i, rv); + if (mif->flags & MEMIF_IF_FLAG_ZERO_COPY) + { + memif_disconnect_free_zc_queue_buffer(mq, 1); + } mq->ring = 0; } } + /* *INDENT-OFF* */ + vec_foreach_index (i, mif->tx_queues) + { + mq = vec_elt_at_index (mif->tx_queues, i); + if (mq->ring) + { + if (mif->flags & MEMIF_IF_FLAG_ZERO_COPY) + { + memif_disconnect_free_zc_queue_buffer(mq, 0); + } + } + mq->ring = 0; + } + /* free tx and rx queues */ vec_foreach (mq, mif->rx_queues) memif_queue_intfd_close (mq); @@ -185,6 +221,7 @@ memif_int_fd_read_ready (clib_file_t * uf) clib_error_t * memif_connect (memif_if_t * mif) { + vlib_main_t *vm = vlib_get_main (); vnet_main_t *vnm = vnet_get_main (); clib_file_t template = { 0 }; memif_region_t *mr; @@ -235,6 +272,7 @@ memif_connect (memif_if_t * mif) vec_foreach_index (i, mif->rx_queues) { memif_queue_t *mq = vec_elt_at_index (mif->rx_queues, i); + u32 ti; int rv; mq->ring = mif->regions[mq->region].shm + mq->offset; @@ -254,6 +292,9 @@ memif_connect (memif_if_t * mif) memif_file_add (&mq->int_clib_file_index, &template); } vnet_hw_interface_assign_rx_thread (vnm, mif->hw_if_index, i, ~0); + ti = vnet_get_device_input_thread_index (vnm, mif->hw_if_index, i); + mq->buffer_pool_index = + vlib_buffer_pool_get_default_for_numa (vm, vlib_mains[ti]->numa_node); rv = vnet_hw_interface_set_rx_mode (vnm, mif->hw_if_index, i, VNET_HW_INTERFACE_RX_MODE_DEFAULT); if (rv) @@ -338,7 +379,7 @@ memif_init_regions_and_queues (memif_if_t * mif) { vlib_buffer_pool_t *bp; /* *INDENT-OFF* */ - vec_foreach (bp, buffer_main.buffer_pools) + vec_foreach (bp, vm->buffer_main->buffer_pools) { vlib_physmem_map_t *pm; pm = vlib_physmem_get_map (vm, bp->physmem_map_index); @@ -1039,7 +1080,7 @@ VLIB_INIT_FUNCTION (memif_init); /* *INDENT-OFF* */ VLIB_PLUGIN_REGISTER () = { .version = VPP_BUILD_VER, - .description = "Packet Memory Interface (experimental)", + .description = "Packet Memory Interface (memif) -- Experimental", }; /* *INDENT-ON* */