examples/l3fwd-power: exit on power lib init failure
[dpdk.git] / examples / l3fwd-power / main.c
index 7a95605..be50ec0 100644 (file)
@@ -184,8 +184,8 @@ enum busy_rate {
  * reference CYCLES to be used to
  * measure core busyness based on poll count
  */
-#define MIN_CYCLES 1500000ULL
-#define MAX_CYCLES 2500000ULL
+#define MIN_CYCLES  1500000ULL
+#define MAX_CYCLES 22000000ULL
 
 /* (500ms) */
 #define TELEMETRY_INTERVALS_PER_SEC 2
@@ -238,8 +238,7 @@ static struct lcore_params lcore_params_array_default[] = {
 };
 
 struct lcore_params *lcore_params = lcore_params_array_default;
-uint16_t nb_lcore_params = sizeof(lcore_params_array_default) /
-                               sizeof(lcore_params_array_default[0]);
+uint16_t nb_lcore_params = RTE_DIM(lcore_params_array_default);
 
 static struct rte_eth_conf port_conf = {
        .rxmode = {
@@ -281,7 +280,7 @@ struct ipv4_5tuple {
        uint16_t port_dst;
        uint16_t port_src;
        uint8_t  proto;
-} __attribute__((__packed__));
+} __rte_packed;
 
 struct ipv6_5tuple {
        uint8_t  ip_dst[IPV6_ADDR_LEN];
@@ -289,7 +288,7 @@ struct ipv6_5tuple {
        uint16_t port_dst;
        uint16_t port_src;
        uint8_t  proto;
-} __attribute__((__packed__));
+} __rte_packed;
 
 struct ipv4_l3fwd_route {
        struct ipv4_5tuple key;
@@ -326,12 +325,6 @@ static lookup_struct_t *ipv6_l3fwd_lookup_struct[NB_SOCKETS];
 
 #define L3FWD_HASH_ENTRIES     1024
 
-#define IPV4_L3FWD_NUM_ROUTES \
-       (sizeof(ipv4_l3fwd_route_array) / sizeof(ipv4_l3fwd_route_array[0]))
-
-#define IPV6_L3FWD_NUM_ROUTES \
-       (sizeof(ipv6_l3fwd_route_array) / sizeof(ipv6_l3fwd_route_array[0]))
-
 static uint16_t ipv4_l3fwd_out_if[L3FWD_HASH_ENTRIES] __rte_cache_aligned;
 static uint16_t ipv6_l3fwd_out_if[L3FWD_HASH_ENTRIES] __rte_cache_aligned;
 #endif
@@ -354,9 +347,6 @@ static struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {
        {RTE_IPV4(8,1,1,0), 24, 7},
 };
 
-#define IPV4_L3FWD_NUM_ROUTES \
-       (sizeof(ipv4_l3fwd_route_array) / sizeof(ipv4_l3fwd_route_array[0]))
-
 #define IPV4_L3FWD_LPM_MAX_RULES     1024
 
 typedef struct rte_lpm lookup_struct_t;
@@ -471,8 +461,8 @@ signal_exit_now(int sigtype)
 
 /*  Freqency scale down timer callback */
 static void
-power_timer_cb(__attribute__((unused)) struct rte_timer *tim,
-                         __attribute__((unused)) void *arg)
+power_timer_cb(__rte_unused struct rte_timer *tim,
+                         __rte_unused void *arg)
 {
        uint64_t hz;
        float sleep_time_ratio;
@@ -880,7 +870,6 @@ sleep_until_rx_interrupt(int num)
                port_id = ((uintptr_t)data) >> CHAR_BIT;
                queue_id = ((uintptr_t)data) &
                        RTE_LEN2MASK(CHAR_BIT, uint8_t);
-               rte_eth_dev_rx_intr_disable(port_id, queue_id);
                RTE_LOG(INFO, L3FWD_POWER,
                        "lcore %u is waked up from rx interrupt on"
                        " port %d queue %d\n",
@@ -890,7 +879,7 @@ sleep_until_rx_interrupt(int num)
        return 0;
 }
 
-static void turn_on_intr(struct lcore_conf *qconf)
+static void turn_on_off_intr(struct lcore_conf *qconf, bool on)
 {
        int i;
        struct lcore_rx_queue *rx_queue;
@@ -903,7 +892,10 @@ static void turn_on_intr(struct lcore_conf *qconf)
                queue_id = rx_queue->queue_id;
 
                rte_spinlock_lock(&(locks[port_id]));
-               rte_eth_dev_rx_intr_enable(port_id, queue_id);
+               if (on)
+                       rte_eth_dev_rx_intr_enable(port_id, queue_id);
+               else
+                       rte_eth_dev_rx_intr_disable(port_id, queue_id);
                rte_spinlock_unlock(&(locks[port_id]));
        }
 }
@@ -935,7 +927,7 @@ static int event_register(struct lcore_conf *qconf)
 }
 /* main processing loop */
 static int
-main_telemetry_loop(__attribute__((unused)) void *dummy)
+main_telemetry_loop(__rte_unused void *dummy)
 {
        struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
        unsigned int lcore_id;
@@ -1034,7 +1026,7 @@ main_telemetry_loop(__attribute__((unused)) void *dummy)
                                br = FULL;
                        } else if (diff_tsc > MIN_CYCLES &&
                                        diff_tsc < MAX_CYCLES) {
-                               br = PARTIAL;
+                               br = (diff_tsc * 100) / MAX_CYCLES;
                        } else {
                                br = ZERO;
                        }
@@ -1055,7 +1047,7 @@ main_telemetry_loop(__attribute__((unused)) void *dummy)
 }
 /* main processing loop */
 static int
-main_empty_poll_loop(__attribute__((unused)) void *dummy)
+main_empty_poll_loop(__rte_unused void *dummy)
 {
        struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
        unsigned int lcore_id;
@@ -1159,7 +1151,7 @@ main_empty_poll_loop(__attribute__((unused)) void *dummy)
 }
 /* main processing loop */
 static int
-main_loop(__attribute__((unused)) void *dummy)
+main_loop(__rte_unused void *dummy)
 {
        struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
        unsigned lcore_id;
@@ -1336,11 +1328,12 @@ start_rx:
                                 */
                                rte_delay_us(lcore_idle_hint);
                        else {
-                               /* suspend until rx interrupt trigges */
+                               /* suspend until rx interrupt triggers */
                                if (intr_en) {
-                                       turn_on_intr(qconf);
+                                       turn_on_off_intr(qconf, 1);
                                        sleep_until_rx_interrupt(
                                                qconf->n_rx_queue);
+                                       turn_on_off_intr(qconf, 0);
                                        /**
                                         * start receiving packets immediately
                                         */
@@ -1839,7 +1832,7 @@ setup_hash(int socketid)
 
 
        /* populate the ipv4 hash */
-       for (i = 0; i < IPV4_L3FWD_NUM_ROUTES; i++) {
+       for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) {
                ret = rte_hash_add_key (ipv4_l3fwd_lookup_struct[socketid],
                                (void *) &ipv4_l3fwd_route_array[i].key);
                if (ret < 0) {
@@ -1852,7 +1845,7 @@ setup_hash(int socketid)
        }
 
        /* populate the ipv6 hash */
-       for (i = 0; i < IPV6_L3FWD_NUM_ROUTES; i++) {
+       for (i = 0; i < RTE_DIM(ipv6_l3fwd_route_array); i++) {
                ret = rte_hash_add_key (ipv6_l3fwd_lookup_struct[socketid],
                                (void *) &ipv6_l3fwd_route_array[i].key);
                if (ret < 0) {
@@ -1889,7 +1882,7 @@ setup_lpm(int socketid)
                                " on socket %d\n", socketid);
 
        /* populate the LPM table */
-       for (i = 0; i < IPV4_L3FWD_NUM_ROUTES; i++) {
+       for (i = 0; i < RTE_DIM(ipv4_l3fwd_route_array); i++) {
                ret = rte_lpm_add(ipv4_l3fwd_lookup_struct[socketid],
                        ipv4_l3fwd_route_array[i].ip,
                        ipv4_l3fwd_route_array[i].depth,
@@ -1970,6 +1963,7 @@ check_all_ports_link_status(uint32_t port_mask)
        uint8_t count, all_ports_up, print_flag = 0;
        uint16_t portid;
        struct rte_eth_link link;
+       int ret;
 
        printf("\nChecking link status");
        fflush(stdout);
@@ -1979,7 +1973,14 @@ check_all_ports_link_status(uint32_t port_mask)
                        if ((port_mask & (1 << portid)) == 0)
                                continue;
                        memset(&link, 0, sizeof(link));
-                       rte_eth_link_get_nowait(portid, &link);
+                       ret = rte_eth_link_get_nowait(portid, &link);
+                       if (ret < 0) {
+                               all_ports_up = 0;
+                               if (print_flag == 1)
+                                       printf("Port %u link get failed: %s\n",
+                                               portid, rte_strerror(-ret));
+                               continue;
+                       }
                        /* print link status if flag set */
                        if (print_flag == 1) {
                                if (link.link_status)
@@ -2064,22 +2065,24 @@ static int check_ptype(uint16_t portid)
 static int
 init_power_library(void)
 {
-       int ret = 0, lcore_id;
-       for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
-               if (rte_lcore_is_enabled(lcore_id)) {
-                       /* init power management library */
-                       ret = rte_power_init(lcore_id);
-                       if (ret)
-                               RTE_LOG(ERR, POWER,
+       unsigned int lcore_id;
+       int ret = 0;
+
+       RTE_LCORE_FOREACH(lcore_id) {
+               /* init power management library */
+               ret = rte_power_init(lcore_id);
+               if (ret) {
+                       RTE_LOG(ERR, POWER,
                                "Library initialization failed on core %u\n",
                                lcore_id);
+                       return ret;
                }
        }
        return ret;
 }
 static void
-update_telemetry(__attribute__((unused)) struct rte_timer *tim,
-               __attribute__((unused)) void *arg)
+update_telemetry(__rte_unused struct rte_timer *tim,
+               __rte_unused void *arg)
 {
        unsigned int lcore_id = rte_lcore_id();
        struct lcore_conf *qconf;
@@ -2223,8 +2226,8 @@ main(int argc, char **argv)
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Invalid L3FWD parameters\n");
 
-       if (init_power_library())
-               RTE_LOG(ERR, L3FWD_POWER, "init_power_library failed\n");
+       if (app_mode != APP_MODE_TELEMETRY && init_power_library())
+               rte_exit(EXIT_FAILURE, "init_power_library failed\n");
 
        if (update_lcore_params() < 0)
                rte_exit(EXIT_FAILURE, "update_lcore_params failed\n");
@@ -2257,7 +2260,12 @@ main(int argc, char **argv)
                printf("Initializing port %d ... ", portid );
                fflush(stdout);
 
-               rte_eth_dev_info_get(portid, &dev_info);
+               ret = rte_eth_dev_info_get(portid, &dev_info);
+               if (ret != 0)
+                       rte_exit(EXIT_FAILURE,
+                               "Error during getting device (port %u) info: %s\n",
+                               portid, strerror(-ret));
+
                dev_rxq_num = dev_info.max_rx_queues;
                dev_txq_num = dev_info.max_tx_queues;
 
@@ -2275,7 +2283,13 @@ main(int argc, char **argv)
                /* If number of Rx queue is 0, no need to enable Rx interrupt */
                if (nb_rx_queue == 0)
                        local_port_conf.intr_conf.rxq = 0;
-               rte_eth_dev_info_get(portid, &dev_info);
+
+               ret = rte_eth_dev_info_get(portid, &dev_info);
+               if (ret != 0)
+                       rte_exit(EXIT_FAILURE,
+                               "Error during getting device (port %u) info: %s\n",
+                               portid, strerror(-ret));
+
                if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
                        local_port_conf.txmode.offloads |=
                                DEV_TX_OFFLOAD_MBUF_FAST_FREE;
@@ -2304,7 +2318,12 @@ main(int argc, char **argv)
                                 "Cannot adjust number of descriptors: err=%d, port=%d\n",
                                 ret, portid);
 
-               rte_eth_macaddr_get(portid, &ports_eth_addr[portid]);
+               ret = rte_eth_macaddr_get(portid, &ports_eth_addr[portid]);
+               if (ret < 0)
+                       rte_exit(EXIT_FAILURE,
+                                "Cannot get MAC address: err=%d, port=%d\n",
+                                ret, portid);
+
                print_ethaddr(" Address:", &ports_eth_addr[portid]);
                printf(", ");
 
@@ -2385,13 +2404,9 @@ main(int argc, char **argv)
                /* init RX queues */
                for(queue = 0; queue < qconf->n_rx_queue; ++queue) {
                        struct rte_eth_rxconf rxq_conf;
-                       struct rte_eth_dev *dev;
-                       struct rte_eth_conf *conf;
 
                        portid = qconf->rx_queue_list[queue].port_id;
                        queueid = qconf->rx_queue_list[queue].queue_id;
-                       dev = &rte_eth_devices[portid];
-                       conf = &dev->data->dev_conf;
 
                        if (numa_on)
                                socketid = \
@@ -2402,9 +2417,14 @@ main(int argc, char **argv)
                        printf("rxq=%d,%d,%d ", portid, queueid, socketid);
                        fflush(stdout);
 
-                       rte_eth_dev_info_get(portid, &dev_info);
+                       ret = rte_eth_dev_info_get(portid, &dev_info);
+                       if (ret != 0)
+                               rte_exit(EXIT_FAILURE,
+                                       "Error during getting device (port %u) info: %s\n",
+                                       portid, strerror(-ret));
+
                        rxq_conf = dev_info.default_rxconf;
-                       rxq_conf.offloads = conf->rxmode.offloads;
+                       rxq_conf.offloads = port_conf.rxmode.offloads;
                        ret = rte_eth_rx_queue_setup(portid, queueid, nb_rxd,
                                socketid, &rxq_conf,
                                pktmbuf_pool[socketid]);
@@ -2441,8 +2461,13 @@ main(int argc, char **argv)
                 * to itself through 2 cross-connected  ports of the
                 * target machine.
                 */
-               if (promiscuous_on)
-                       rte_eth_promiscuous_enable(portid);
+               if (promiscuous_on) {
+                       ret = rte_eth_promiscuous_enable(portid);
+                       if (ret != 0)
+                               rte_exit(EXIT_FAILURE,
+                                       "rte_eth_promiscuous_enable: err=%s, port=%u\n",
+                                       rte_strerror(-ret), portid);
+               }
                /* initialize spinlock for each port */
                rte_spinlock_init(&(locks[portid]));
        }