{
struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
uint16_t nb_ports = rte_eth_dev_count_avail();
- uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT;
- uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
unsigned int nb_lcores = rte_lcore_count();
struct rte_eth_conf local_port_conf;
struct rte_eth_dev_info dev_info;
rte_panic("Error during getting device (port %u) info:"
"%s\n", port_id, strerror(-ret));
- if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+ if (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)
local_port_conf.txmode.offloads |=
- DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+ RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;
local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
dev_info.flow_type_rss_offloads;
l3fwd_event_resource_setup(struct rte_eth_conf *port_conf)
{
struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
- const event_loop_cb lpm_event_loop[2][2] = {
- [0][0] = lpm_event_main_loop_tx_d,
- [0][1] = lpm_event_main_loop_tx_d_burst,
- [1][0] = lpm_event_main_loop_tx_q,
- [1][1] = lpm_event_main_loop_tx_q_burst,
+ const event_loop_cb lpm_event_loop[2][2][2] = {
+ [0][0][0] = lpm_event_main_loop_tx_d,
+ [0][0][1] = lpm_event_main_loop_tx_d_burst,
+ [0][1][0] = lpm_event_main_loop_tx_q,
+ [0][1][1] = lpm_event_main_loop_tx_q_burst,
+ [1][0][0] = lpm_event_main_loop_tx_d_vector,
+ [1][0][1] = lpm_event_main_loop_tx_d_burst_vector,
+ [1][1][0] = lpm_event_main_loop_tx_q_vector,
+ [1][1][1] = lpm_event_main_loop_tx_q_burst_vector,
};
- const event_loop_cb em_event_loop[2][2] = {
- [0][0] = em_event_main_loop_tx_d,
- [0][1] = em_event_main_loop_tx_d_burst,
- [1][0] = em_event_main_loop_tx_q,
- [1][1] = em_event_main_loop_tx_q_burst,
+ const event_loop_cb em_event_loop[2][2][2] = {
+ [0][0][0] = em_event_main_loop_tx_d,
+ [0][0][1] = em_event_main_loop_tx_d_burst,
+ [0][1][0] = em_event_main_loop_tx_q,
+ [0][1][1] = em_event_main_loop_tx_q_burst,
+ [1][0][0] = em_event_main_loop_tx_d_vector,
+ [1][0][1] = em_event_main_loop_tx_d_burst_vector,
+ [1][1][0] = em_event_main_loop_tx_q_vector,
+ [1][1][1] = em_event_main_loop_tx_q_burst_vector,
};
- const event_loop_cb fib_event_loop[2][2] = {
- [0][0] = fib_event_main_loop_tx_d,
- [0][1] = fib_event_main_loop_tx_d_burst,
- [1][0] = fib_event_main_loop_tx_q,
- [1][1] = fib_event_main_loop_tx_q_burst,
+ const event_loop_cb fib_event_loop[2][2][2] = {
+ [0][0][0] = fib_event_main_loop_tx_d,
+ [0][0][1] = fib_event_main_loop_tx_d_burst,
+ [0][1][0] = fib_event_main_loop_tx_q,
+ [0][1][1] = fib_event_main_loop_tx_q_burst,
+ [1][0][0] = fib_event_main_loop_tx_d_vector,
+ [1][0][1] = fib_event_main_loop_tx_d_burst_vector,
+ [1][1][0] = fib_event_main_loop_tx_q_vector,
+ [1][1][1] = fib_event_main_loop_tx_q_burst_vector,
};
uint32_t event_queue_cfg;
int ret;
if (ret < 0)
rte_exit(EXIT_FAILURE, "Error in starting eventdev");
- evt_rsrc->ops.lpm_event_loop = lpm_event_loop[evt_rsrc->tx_mode_q]
- [evt_rsrc->has_burst];
+ evt_rsrc->ops.lpm_event_loop =
+ lpm_event_loop[evt_rsrc->vector_enabled][evt_rsrc->tx_mode_q]
+ [evt_rsrc->has_burst];
- evt_rsrc->ops.em_event_loop = em_event_loop[evt_rsrc->tx_mode_q]
- [evt_rsrc->has_burst];
+ evt_rsrc->ops.em_event_loop =
+ em_event_loop[evt_rsrc->vector_enabled][evt_rsrc->tx_mode_q]
+ [evt_rsrc->has_burst];
- evt_rsrc->ops.fib_event_loop = fib_event_loop[evt_rsrc->tx_mode_q]
- [evt_rsrc->has_burst];
+ evt_rsrc->ops.fib_event_loop =
+ fib_event_loop[evt_rsrc->vector_enabled][evt_rsrc->tx_mode_q]
+ [evt_rsrc->has_burst];
+}
+
+static void
+l3fwd_event_vector_array_free(struct rte_event events[], uint16_t num)
+{
+ uint16_t i;
+
+ for (i = 0; i < num; i++) {
+ rte_pktmbuf_free_bulk(events[i].vec->mbufs,
+ events[i].vec->nb_elem);
+ rte_mempool_put(rte_mempool_from_obj(events[i].vec),
+ events[i].vec);
+ }
+}
+
+static void
+l3fwd_event_port_flush(uint8_t event_d_id __rte_unused, struct rte_event ev,
+ void *args __rte_unused)
+{
+ if (ev.event_type & RTE_EVENT_TYPE_VECTOR)
+ l3fwd_event_vector_array_free(&ev, 1);
+ else
+ rte_pktmbuf_free(ev.mbuf);
+}
+
+void
+l3fwd_event_worker_cleanup(uint8_t event_d_id, uint8_t event_p_id,
+ struct rte_event events[], uint16_t nb_enq,
+ uint16_t nb_deq, uint8_t is_vector)
+{
+ int i;
+
+ if (nb_deq) {
+ if (is_vector)
+ l3fwd_event_vector_array_free(events + nb_enq,
+ nb_deq - nb_enq);
+ else
+ for (i = nb_enq; i < nb_deq; i++)
+ rte_pktmbuf_free(events[i].mbuf);
+
+ for (i = 0; i < nb_deq; i++)
+ events[i].op = RTE_EVENT_OP_RELEASE;
+ rte_event_enqueue_burst(event_d_id, event_p_id, events, nb_deq);
+ }
+
+ rte_event_port_quiesce(event_d_id, event_p_id, l3fwd_event_port_flush,
+ NULL);
}