X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fl3fwd%2Fl3fwd_event.c;h=0b58475c85b875a6fa5a3e6a4a0aac2a5b346238;hb=52600004e70826304fdc52cc1e56264d87a77688;hp=961860ea18ef23b5f7f049d575e8e33ea5212d00;hpb=9510dd1feb71fac0b71c74e71bd2618ad14301ac;p=dpdk.git diff --git a/examples/l3fwd/l3fwd_event.c b/examples/l3fwd/l3fwd_event.c index 961860ea18..0b58475c85 100644 --- a/examples/l3fwd/l3fwd_event.c +++ b/examples/l3fwd/l3fwd_event.c @@ -43,8 +43,6 @@ l3fwd_eth_dev_port_setup(struct rte_eth_conf *port_conf) { 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; @@ -75,9 +73,9 @@ l3fwd_eth_dev_port_setup(struct rte_eth_conf *port_conf) 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; @@ -215,23 +213,35 @@ void 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; @@ -265,12 +275,62 @@ l3fwd_event_resource_setup(struct rte_eth_conf *port_conf) 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); }