X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fl3fwd%2Fl3fwd_event.c;h=0b58475c85b875a6fa5a3e6a4a0aac2a5b346238;hb=52600004e70826304fdc52cc1e56264d87a77688;hp=0a75e39ee3082ab624b34ee293a43caa12204d1d;hpb=4eaf90cc18ca59f3ef4a759ac298e71ece500442;p=dpdk.git diff --git a/examples/l3fwd/l3fwd_event.c b/examples/l3fwd/l3fwd_event.c index 0a75e39ee3..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; @@ -70,10 +68,14 @@ l3fwd_eth_dev_port_setup(struct rte_eth_conf *port_conf) 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; @@ -211,7 +213,38 @@ 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][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; @@ -236,4 +269,68 @@ l3fwd_event_resource_setup(struct rte_eth_conf *port_conf) /* 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); }