examples/l3fwd-power: add legacy mode option
[dpdk.git] / examples / l3fwd-power / main.c
index 9db94ce..c02b0a3 100644 (file)
@@ -195,7 +195,8 @@ static int parse_ptype; /**< Parse packet type using rx callback, and */
                        /**< disabled by default */
 
 enum appmode {
-       APP_MODE_LEGACY = 0,
+       APP_MODE_DEFAULT = 0,
+       APP_MODE_LEGACY,
        APP_MODE_EMPTY_POLL,
        APP_MODE_TELEMETRY
 };
@@ -256,10 +257,7 @@ static struct rte_eth_conf port_conf = {
        },
        .txmode = {
                .mq_mode = ETH_MQ_TX_NONE,
-       },
-       .intr_conf = {
-               .rxq = 1,
-       },
+       }
 };
 
 static struct rte_mempool * pktmbuf_pool[NB_SOCKETS];
@@ -1129,7 +1127,7 @@ main_empty_poll_loop(__rte_unused void *dummy)
 }
 /* main processing loop */
 static int
-main_loop(__rte_unused void *dummy)
+main_legacy_loop(__rte_unused void *dummy)
 {
        struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
        unsigned lcore_id;
@@ -1438,6 +1436,7 @@ print_usage(const char *prgname)
                "  --enable-jumbo: enable jumbo frame"
                " which max packet len is PKTLEN in decimal (64-9600)\n"
                "  --parse-ptype: parse packet type by software\n"
+               "  --legacy: use legacy interrupt-based scaling\n"
                "  --empty-poll: enable empty poll detection"
                " follow (training_flag, high_threshold, med_threshold)\n"
                " --telemetry: enable telemetry mode, to update"
@@ -1584,6 +1583,8 @@ parse_ep_config(const char *q_arg)
 
 }
 #define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
+#define CMD_LINE_OPT_LEGACY "legacy"
+#define CMD_LINE_OPT_EMPTY_POLL "empty-poll"
 #define CMD_LINE_OPT_TELEMETRY "telemetry"
 
 /* Parse the argument given in the command line of the application */
@@ -1601,8 +1602,9 @@ parse_args(int argc, char **argv)
                {"high-perf-cores", 1, 0, 0},
                {"no-numa", 0, 0, 0},
                {"enable-jumbo", 0, 0, 0},
-               {"empty-poll", 1, 0, 0},
+               {CMD_LINE_OPT_EMPTY_POLL, 1, 0, 0},
                {CMD_LINE_OPT_PARSE_PTYPE, 0, 0, 0},
+               {CMD_LINE_OPT_LEGACY, 0, 0, 0},
                {CMD_LINE_OPT_TELEMETRY, 0, 0, 0},
                {NULL, 0, 0, 0}
        };
@@ -1676,9 +1678,20 @@ parse_args(int argc, char **argv)
                        }
 
                        if (!strncmp(lgopts[option_index].name,
-                                               "empty-poll", 10)) {
-                               if (app_mode == APP_MODE_TELEMETRY) {
-                                       printf(" empty-poll cannot be enabled as telemetry mode is enabled\n");
+                                       CMD_LINE_OPT_LEGACY,
+                                       sizeof(CMD_LINE_OPT_LEGACY))) {
+                               if (app_mode != APP_MODE_DEFAULT) {
+                                       printf(" legacy mode is mutually exclusive with other modes\n");
+                                       return -1;
+                               }
+                               app_mode = APP_MODE_LEGACY;
+                               printf("legacy mode is enabled\n");
+                       }
+
+                       if (!strncmp(lgopts[option_index].name,
+                                       CMD_LINE_OPT_EMPTY_POLL, 10)) {
+                               if (app_mode != APP_MODE_DEFAULT) {
+                                       printf(" empty-poll mode is mutually exclusive with other modes\n");
                                        return -1;
                                }
                                app_mode = APP_MODE_EMPTY_POLL;
@@ -1695,8 +1708,8 @@ parse_args(int argc, char **argv)
                        if (!strncmp(lgopts[option_index].name,
                                        CMD_LINE_OPT_TELEMETRY,
                                        sizeof(CMD_LINE_OPT_TELEMETRY))) {
-                               if (app_mode == APP_MODE_EMPTY_POLL) {
-                                       printf("telemetry mode cannot be enabled as empty poll mode is enabled\n");
+                               if (app_mode != APP_MODE_DEFAULT) {
+                                       printf(" telemetry mode is mutually exclusive with other modes\n");
                                        return -1;
                                }
                                app_mode = APP_MODE_TELEMETRY;
@@ -2046,6 +2059,7 @@ static int check_ptype(uint16_t portid)
 static int
 init_power_library(void)
 {
+       enum power_management_env env;
        unsigned int lcore_id;
        int ret = 0;
 
@@ -2058,6 +2072,14 @@ init_power_library(void)
                                lcore_id);
                        return ret;
                }
+               /* we're not supporting the VM channel mode */
+               env = rte_power_get_env();
+               if (env != PM_ENV_ACPI_CPUFREQ &&
+                               env != PM_ENV_PSTATE_CPUFREQ) {
+                       RTE_LOG(ERR, POWER,
+                               "Only ACPI and PSTATE mode are supported\n");
+                       return -1;
+               }
        }
        return ret;
 }
@@ -2247,7 +2269,12 @@ main(int argc, char **argv)
        if (ret < 0)
                rte_exit(EXIT_FAILURE, "Invalid L3FWD parameters\n");
 
-       if (app_mode != APP_MODE_TELEMETRY && init_power_library())
+       if (app_mode == APP_MODE_DEFAULT)
+               app_mode = APP_MODE_LEGACY;
+
+       /* only legacy and empty poll mode rely on power library */
+       if ((app_mode == APP_MODE_LEGACY || app_mode == APP_MODE_EMPTY_POLL) &&
+                       init_power_library())
                rte_exit(EXIT_FAILURE, "init_power_library failed\n");
 
        if (update_lcore_params() < 0)
@@ -2270,6 +2297,8 @@ main(int argc, char **argv)
        /* initialize all ports */
        RTE_ETH_FOREACH_DEV(portid) {
                struct rte_eth_conf local_port_conf = port_conf;
+               /* not all app modes need interrupts */
+               bool need_intr = app_mode == APP_MODE_LEGACY;
 
                /* skip ports that are not enabled */
                if ((enabled_port_mask & (1 << portid)) == 0) {
@@ -2303,7 +2332,10 @@ main(int argc, char **argv)
                        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)
-                       local_port_conf.intr_conf.rxq = 0;
+                       need_intr = false;
+
+               if (need_intr)
+                       local_port_conf.intr_conf.rxq = 1;
 
                ret = rte_eth_dev_info_get(portid, &dev_info);
                if (ret != 0)
@@ -2515,12 +2547,12 @@ main(int argc, char **argv)
 
        /* launch per-lcore init on every lcore */
        if (app_mode == APP_MODE_LEGACY) {
-               rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER);
+               rte_eal_mp_remote_launch(main_legacy_loop, NULL, CALL_MASTER);
        } else if (app_mode == APP_MODE_EMPTY_POLL) {
                empty_poll_stop = false;
                rte_eal_mp_remote_launch(main_empty_poll_loop, NULL,
                                SKIP_MASTER);
-       } else {
+       } else if (app_mode == APP_MODE_TELEMETRY) {
                unsigned int i;
 
                /* Init metrics library */
@@ -2566,7 +2598,8 @@ main(int argc, char **argv)
        if (app_mode == APP_MODE_EMPTY_POLL)
                rte_power_empty_poll_stat_free();
 
-       if (app_mode != APP_MODE_TELEMETRY && deinit_power_library())
+       if ((app_mode == APP_MODE_LEGACY || app_mode == APP_MODE_EMPTY_POLL) &&
+                       deinit_power_library())
                rte_exit(EXIT_FAILURE, "deinit_power_library failed\n");
 
        if (rte_eal_cleanup() < 0)