net/hns3: modify a function name
[dpdk.git] / examples / l3fwd / l3fwd_event.c
index 0a75e39..0b58475 100644 (file)
@@ -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);
 }