Merge branch 'upstream-16.11-stable' into 16.11.x
[deb_dpdk.git] / examples / l3fwd-power / main.c
index cb42bfb..217a448 100644 (file)
@@ -66,7 +66,6 @@
 #include <rte_debug.h>
 #include <rte_ether.h>
 #include <rte_ethdev.h>
-#include <rte_ring.h>
 #include <rte_mempool.h>
 #include <rte_mbuf.h>
 #include <rte_ip.h>
@@ -84,8 +83,6 @@
 
 #define MIN_ZERO_POLL_COUNT 10
 
-/* around 100ms at 2 Ghz */
-#define TIMER_RESOLUTION_CYCLES           200000000ULL
 /* 100 ms interval */
 #define TIMER_NUMBER_PER_SECOND           10
 /* 100000 us */
 /*
  * Configurable number of RX/TX ring descriptors
  */
-#define RTE_TEST_RX_DESC_DEFAULT 128
+#define RTE_TEST_RX_DESC_DEFAULT 512
 #define RTE_TEST_TX_DESC_DEFAULT 512
 static uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT;
 static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
@@ -222,7 +219,7 @@ static struct rte_eth_conf port_conf = {
                .hw_ip_checksum = 1, /**< IP checksum offload enabled */
                .hw_vlan_filter = 0, /**< VLAN filtering disabled */
                .jumbo_frame    = 0, /**< Jumbo Frame Support disabled */
-               .hw_strip_crc   = 0, /**< CRC stripped by hardware */
+               .hw_strip_crc   = 1, /**< CRC stripped by hardware */
        },
        .rx_adv_conf = {
                .rss_conf = {
@@ -825,7 +822,7 @@ main_loop(__attribute__((unused)) void *dummy)
 {
        struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
        unsigned lcore_id;
-       uint64_t prev_tsc, diff_tsc, cur_tsc;
+       uint64_t prev_tsc, diff_tsc, cur_tsc, tim_res_tsc, hz;
        uint64_t prev_tsc_power = 0, cur_tsc_power, diff_tsc_power;
        int i, j, nb_rx;
        uint8_t portid, queueid;
@@ -839,6 +836,8 @@ main_loop(__attribute__((unused)) void *dummy)
        const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US;
 
        prev_tsc = 0;
+       hz = rte_get_timer_hz();
+       tim_res_tsc = hz/TIMER_NUMBER_PER_SECOND;
 
        lcore_id = rte_lcore_id();
        qconf = &lcore_conf[lcore_id];
@@ -884,7 +883,7 @@ main_loop(__attribute__((unused)) void *dummy)
                }
 
                diff_tsc_power = cur_tsc_power - prev_tsc_power;
-               if (diff_tsc_power > TIMER_RESOLUTION_CYCLES) {
+               if (diff_tsc_power > tim_res_tsc) {
                        rte_timer_manage();
                        prev_tsc_power = cur_tsc_power;
                }
@@ -1000,9 +999,11 @@ start_rx:
                                        turn_on_intr(qconf);
                                        sleep_until_rx_interrupt(
                                                qconf->n_rx_queue);
+                                       /**
+                                        * start receiving packets immediately
+                                        */
+                                       goto start_rx;
                                }
-                               /* start receiving packets immediately */
-                               goto start_rx;
                        }
                        stats[lcore_id].sleep_time += lcore_idle_hint;
                }
@@ -1546,6 +1547,7 @@ main(int argc, char **argv)
        uint32_t n_tx_queue, nb_lcores;
        uint32_t dev_rxq_num, dev_txq_num;
        uint8_t portid, nb_rx_queue, queue, socketid;
+       uint16_t org_rxq_intr = port_conf.intr_conf.rxq;
 
        /* catch SIGINT and restore cpufreq governor to ondemand */
        signal(SIGINT, signal_exit_now);
@@ -1572,10 +1574,7 @@ main(int argc, char **argv)
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "init_lcore_rx_queues failed\n");
 
-
        nb_ports = rte_eth_dev_count();
-       if (nb_ports > RTE_MAX_ETHPORTS)
-               nb_ports = RTE_MAX_ETHPORTS;
 
        if (check_port_config(nb_ports) < 0)
                rte_exit(EXIT_FAILURE, "check_port_config failed\n");
@@ -1609,8 +1608,13 @@ main(int argc, char **argv)
                        n_tx_queue = dev_txq_num;
                printf("Creating queues: nb_rxq=%d nb_txq=%u... ",
                        nb_rx_queue, (unsigned)n_tx_queue );
+               /* If number of Rx queue is 0, no need to enable Rx interrupt */
+               if (nb_rx_queue == 0)
+                       port_conf.intr_conf.rxq = 0;
                ret = rte_eth_dev_configure(portid, nb_rx_queue,
                                        (uint16_t)n_tx_queue, &port_conf);
+               /* Revert to original value */
+               port_conf.intr_conf.rxq = org_rxq_intr;
                if (ret < 0)
                        rte_exit(EXIT_FAILURE, "Cannot configure device: "
                                        "err=%d, port=%d\n", ret, portid);