git.droids-corp.org
/
dpdk.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
examples/l3fwd-power: fix style and control flow
[dpdk.git]
/
examples
/
l3fwd-power
/
main.c
diff --git
a/examples/l3fwd-power/main.c
b/examples/l3fwd-power/main.c
index
20dc765
..
c70611b
100644
(file)
--- a/
examples/l3fwd-power/main.c
+++ b/
examples/l3fwd-power/main.c
@@
-46,9
+46,7
@@
#include <rte_spinlock.h>
#include <rte_power_empty_poll.h>
#include <rte_metrics.h>
#include <rte_spinlock.h>
#include <rte_power_empty_poll.h>
#include <rte_metrics.h>
-#ifdef RTE_LIBRTE_TELEMETRY
#include <rte_telemetry.h>
#include <rte_telemetry.h>
-#endif
#include "perf_core.h"
#include "main.h"
#include "perf_core.h"
#include "main.h"
@@
-258,10
+256,7
@@
static struct rte_eth_conf port_conf = {
},
.txmode = {
.mq_mode = ETH_MQ_TX_NONE,
},
.txmode = {
.mq_mode = ETH_MQ_TX_NONE,
- },
- .intr_conf = {
- .rxq = 1,
- },
+ }
};
static struct rte_mempool * pktmbuf_pool[NB_SOCKETS];
};
static struct rte_mempool * pktmbuf_pool[NB_SOCKETS];
@@
-826,17
+821,24
@@
power_freq_scaleup_heuristic(unsigned lcore_id,
static int
sleep_until_rx_interrupt(int num)
{
static int
sleep_until_rx_interrupt(int num)
{
+ /*
+ * we want to track when we are woken up by traffic so that we can go
+ * back to sleep again without log spamming.
+ */
+ static bool timeout;
struct rte_epoll_event event[num];
int n, i;
uint16_t port_id;
uint8_t queue_id;
void *data;
struct rte_epoll_event event[num];
int n, i;
uint16_t port_id;
uint8_t queue_id;
void *data;
- RTE_LOG(INFO, L3FWD_POWER,
- "lcore %u sleeps until interrupt triggers\n",
- rte_lcore_id());
+ if (!timeout) {
+ RTE_LOG(INFO, L3FWD_POWER,
+ "lcore %u sleeps until interrupt triggers\n",
+ rte_lcore_id());
+ }
- n = rte_epoll_wait(RTE_EPOLL_PER_THREAD, event, num,
-1
);
+ n = rte_epoll_wait(RTE_EPOLL_PER_THREAD, event, num,
10
);
for (i = 0; i < n; i++) {
data = event[i].epdata.data;
port_id = ((uintptr_t)data) >> CHAR_BIT;
for (i = 0; i < n; i++) {
data = event[i].epdata.data;
port_id = ((uintptr_t)data) >> CHAR_BIT;
@@
-847,6
+849,7
@@
sleep_until_rx_interrupt(int num)
" port %d queue %d\n",
rte_lcore_id(), port_id, queue_id);
}
" port %d queue %d\n",
rte_lcore_id(), port_id, queue_id);
}
+ timeout = n == 0;
return 0;
}
return 0;
}
@@
-1123,7
+1126,7
@@
main_empty_poll_loop(__rte_unused void *dummy)
}
/* main processing loop */
static int
}
/* main processing loop */
static int
-main_loop(__rte_unused void *dummy)
+main_l
egacy_l
oop(__rte_unused void *dummy)
{
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
unsigned lcore_id;
{
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
unsigned lcore_id;
@@
-1309,7
+1312,8
@@
start_rx:
/**
* start receiving packets immediately
*/
/**
* start receiving packets immediately
*/
- goto start_rx;
+ if (likely(!is_done()))
+ goto start_rx;
}
}
stats[lcore_id].sleep_time += lcore_idle_hint;
}
}
stats[lcore_id].sleep_time += lcore_idle_hint;
@@
-1577,6
+1581,7
@@
parse_ep_config(const char *q_arg)
}
#define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
}
#define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
+#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 */
#define CMD_LINE_OPT_TELEMETRY "telemetry"
/* Parse the argument given in the command line of the application */
@@
-1594,7
+1599,7
@@
parse_args(int argc, char **argv)
{"high-perf-cores", 1, 0, 0},
{"no-numa", 0, 0, 0},
{"enable-jumbo", 0, 0, 0},
{"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_TELEMETRY, 0, 0, 0},
{NULL, 0, 0, 0}
{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, 0},
{CMD_LINE_OPT_TELEMETRY, 0, 0, 0},
{NULL, 0, 0, 0}
@@
-1669,7
+1674,7
@@
parse_args(int argc, char **argv)
}
if (!strncmp(lgopts[option_index].name,
}
if (!strncmp(lgopts[option_index].name,
-
"empty-poll"
, 10)) {
+
CMD_LINE_OPT_EMPTY_POLL
, 10)) {
if (app_mode == APP_MODE_TELEMETRY) {
printf(" empty-poll cannot be enabled as telemetry mode is enabled\n");
return -1;
if (app_mode == APP_MODE_TELEMETRY) {
printf(" empty-poll cannot be enabled as telemetry mode is enabled\n");
return -1;
@@
-1962,7
+1967,7
@@
check_all_ports_link_status(uint32_t port_mask)
"Mbps - %s\n", (uint8_t)portid,
(unsigned)link.link_speed,
(link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
"Mbps - %s\n", (uint8_t)portid,
(unsigned)link.link_speed,
(link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
- ("full-duplex") : ("half-duplex
\n
"));
+ ("full-duplex") : ("half-duplex"));
else
printf("Port %d Link Down\n",
(uint8_t)portid);
else
printf("Port %d Link Down\n",
(uint8_t)portid);
@@
-2039,6
+2044,7
@@
static int check_ptype(uint16_t portid)
static int
init_power_library(void)
{
static int
init_power_library(void)
{
+ enum power_management_env env;
unsigned int lcore_id;
int ret = 0;
unsigned int lcore_id;
int ret = 0;
@@
-2051,6
+2057,14
@@
init_power_library(void)
lcore_id);
return ret;
}
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;
}
}
return ret;
}
@@
-2116,7
+2130,7
@@
update_telemetry(__rte_unused struct rte_timer *tim,
if (ret < 0)
RTE_LOG(WARNING, POWER, "failed to update metrcis\n");
}
if (ret < 0)
RTE_LOG(WARNING, POWER, "failed to update metrcis\n");
}
-#ifdef RTE_LIBRTE_TELEMETRY
+
static int
handle_app_stats(const char *cmd __rte_unused,
const char *params __rte_unused,
static int
handle_app_stats(const char *cmd __rte_unused,
const char *params __rte_unused,
@@
-2132,7
+2146,7
@@
handle_app_stats(const char *cmd __rte_unused,
values[i]);
return 0;
}
values[i]);
return 0;
}
-#endif
+
static void
telemetry_setup_timer(void)
{
static void
telemetry_setup_timer(void)
{
@@
-2240,7
+2254,9
@@
main(int argc, char **argv)
if (ret < 0)
rte_exit(EXIT_FAILURE, "Invalid L3FWD parameters\n");
if (ret < 0)
rte_exit(EXIT_FAILURE, "Invalid L3FWD parameters\n");
- if (app_mode != APP_MODE_TELEMETRY && init_power_library())
+ /* 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)
rte_exit(EXIT_FAILURE, "init_power_library failed\n");
if (update_lcore_params() < 0)
@@
-2263,6
+2279,8
@@
main(int argc, char **argv)
/* initialize all ports */
RTE_ETH_FOREACH_DEV(portid) {
struct rte_eth_conf local_port_conf = port_conf;
/* 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) {
/* skip ports that are not enabled */
if ((enabled_port_mask & (1 << portid)) == 0) {
@@
-2296,7
+2314,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)
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)
ret = rte_eth_dev_info_get(portid, &dev_info);
if (ret != 0)
@@
-2508,12
+2529,12
@@
main(int argc, char **argv)
/* launch per-lcore init on every lcore */
if (app_mode == APP_MODE_LEGACY) {
/* 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_l
egacy_l
oop, 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 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 */
unsigned int i;
/* Init metrics library */
@@
-2532,11
+2553,9
@@
main(int argc, char **argv)
rte_spinlock_init(&stats[lcore_id].telemetry_lock);
}
rte_timer_init(&telemetry_timer);
rte_spinlock_init(&stats[lcore_id].telemetry_lock);
}
rte_timer_init(&telemetry_timer);
-#ifdef RTE_LIBRTE_TELEMETRY
rte_telemetry_register_cmd("/l3fwd-power/stats",
handle_app_stats,
"Returns global power stats. Parameters: None");
rte_telemetry_register_cmd("/l3fwd-power/stats",
handle_app_stats,
"Returns global power stats. Parameters: None");
-#endif
rte_eal_mp_remote_launch(main_telemetry_loop, NULL,
SKIP_MASTER);
}
rte_eal_mp_remote_launch(main_telemetry_loop, NULL,
SKIP_MASTER);
}
@@
-2561,7
+2580,8
@@
main(int argc, char **argv)
if (app_mode == APP_MODE_EMPTY_POLL)
rte_power_empty_poll_stat_free();
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)
rte_exit(EXIT_FAILURE, "deinit_power_library failed\n");
if (rte_eal_cleanup() < 0)