sched: remove useless malloc in PIE data init
[dpdk.git] / examples / l3fwd / l3fwd_event.c
index f9491ec..dd9eafa 100644 (file)
@@ -70,10 +70,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;
@@ -188,10 +192,61 @@ l3fwd_event_capability_setup(void)
                l3fwd_event_set_internal_port_ops(&evt_rsrc->ops);
 }
 
+int
+l3fwd_get_free_event_port(struct l3fwd_event_resources *evt_rsrc)
+{
+       static int index;
+       int port_id;
+
+       rte_spinlock_lock(&evt_rsrc->evp.lock);
+       if (index >= evt_rsrc->evp.nb_ports) {
+               printf("No free event port is available\n");
+               return -1;
+       }
+
+       port_id = evt_rsrc->evp.event_p_id[index];
+       index++;
+       rte_spinlock_unlock(&evt_rsrc->evp.lock);
+
+       return port_id;
+}
+
 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;
@@ -206,5 +261,31 @@ l3fwd_event_resource_setup(struct rte_eth_conf *port_conf)
        l3fwd_eth_dev_port_setup(port_conf);
 
        /* Event device configuration */
-       evt_rsrc->ops.event_device_setup();
+       event_queue_cfg = evt_rsrc->ops.event_device_setup();
+
+       /* Event queue configuration */
+       evt_rsrc->ops.event_queue_setup(event_queue_cfg);
+
+       /* Event port configuration */
+       evt_rsrc->ops.event_port_setup();
+
+       /* 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];
 }