{
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;
printf("Creating queues: nb_rxq=%d nb_txq=1...\n",
evt_rsrc->eth_rx_queues);
- rte_eth_dev_info_get(port_id, &dev_info);
- if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+ ret = rte_eth_dev_info_get(port_id, &dev_info);
+ if (ret != 0)
+ rte_panic("Error during getting device (port %u) info:"
+ "%s\n", port_id, strerror(-ret));
+
+ 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][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][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][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 (!evt_rsrc->enabled)
return;
/* Rx/Tx adapters configuration */
evt_rsrc->ops.adapter_setup();
+
+ /* Start event device */
+ ret = rte_event_dev_start(evt_rsrc->event_d_id);
+ if (ret < 0)
+ rte_exit(EXIT_FAILURE, "Error in starting eventdev");
+
+ 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->vector_enabled][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);
}