On 13/07/2023 23:45, Ilya Maximets wrote:
On 7/10/23 16:54, Kevin Traynor wrote:
Extend 'pmd-sleep-max' so that individual PMD thread cores
may have a specified max sleep request value.
Any PMD thread core without a value will use the datapath default
(no sleep request) or datapath global value set by the user.
To set PMD thread cores 8 and 9 to never request a load based sleep
and all other PMD thread cores to be able to request a max sleep of
50 usecs:
$ ovs-vsctl set open_vswitch . other_config:pmd-sleep-max=50,8:0,9:0
To set PMD thread cores 10 and 11 to request a max sleep of 100 usecs
and all other PMD thread cores to never request a sleep:
$ ovs-vsctl set open_vswitch . other_config:pmd-sleep-max=10:100,11:100
'pmd-sleep-show' can be used to dump the global and individual PMD thread
core max sleep request values.
Signed-off-by: Kevin Traynor <[email protected]>
Reviewed-by: David Marchand <[email protected]>
---
Documentation/topics/dpdk/pmd.rst | 23 +++
lib/dpif-netdev-private-thread.h | 3 +
lib/dpif-netdev.c | 226 +++++++++++++++++++++++++++---
tests/pmd.at | 32 ++---
4 files changed, 252 insertions(+), 32 deletions(-)
Notes on this patch are a bit chaotic as they are mostly about the looks
and perception. Hope they make some sense. :)
No problem, thanks for reviewing it. I was able to understand them all.
diff --git a/Documentation/topics/dpdk/pmd.rst
b/Documentation/topics/dpdk/pmd.rst
index 40e6b7843..7eb4eb7b3 100644
--- a/Documentation/topics/dpdk/pmd.rst
+++ b/Documentation/topics/dpdk/pmd.rst
@@ -375,4 +375,27 @@ system configuration (e.g. enabling processor C-states)
and workloads.
rate.
+Max sleep request values can be set for individual PMDs using key:value pairs.
'max sleep request' doesn't sound like a human term.
Maybe 'Maximum sleep values' or 'maximum sleep intervals' ?
The reason I used it was because the request time is not a guarantee of
the actual sleep time. So I was trying to be specific that it was the
request in case someone wondered why it was taking a little longer in
practice.
Though as we've reduced it to typically just a few uS with the slack
timer changes, perhaps it's not worth adding that detail and just keep
it simple. will change to "Maximum sleep values".
+Any PMD that has been assigned a specified value will use that. Any PMD that
+does not have a specified value will use the current global default.
+
+Specified values for individual PMDs can be added or removed at any time.
What do you think about:
s/PMD/PMD thread/
s/PMDs/PMD threads/
averywhere in the text above?
Damn - I try to not just write "PMD" in general, but I can't help myself
sometimes :-)
+
+For example, to set PMD threads on cores 8 and 9 to never request a load based
+sleep and all others PMD threads to be able to request a max sleep of 50
usecs::
s/sleep of 50 usecs/maximum sleep of 50 microseconds (us)/
Ack
+
+ $ ovs-vsctl set open_vswitch . other_config:pmd-sleep-max=50,8:0,9:0
+
+The max sleep request for each PMD can be checked in the logs or with::
Should we remove the previous mentioning of that command?
No real need to have both so can remove the mention above.
+
+ $ ovs-appctl dpif-netdev/pmd-sleep-show
+ PMD max sleep request is 50 usecs by default.
+ PMD load based sleeps are enabled by default.
+ PMD thread core 8 NUMA 0: Max sleep request set to 0 usecs.
+ PMD thread core 9 NUMA 1: Max sleep request set to 0 usecs.
+ PMD thread core 10 NUMA 0: Max sleep request set to 50 usecs.
+ PMD thread core 11 NUMA 1: Max sleep request set to 50 usecs.
+ PMD thread core 12 NUMA 0: Max sleep request set to 50 usecs.
+ PMD thread core 13 NUMA 1: Max sleep request set to 50 usecs.
A few note about the output:
- Too much 'PMD', IMO. :)
- The word 'request' has an unclear meaning and seems redundant.
I agree it's maybe too low level. My fear was that a user misinterprets
as the max sleep that has occurred.
- 'by default' is a bit confusing.
I see what you mean in context of this being a command
- We do not use 'usecs' in other places. We use 'us' in pmd stats.
oops, I should have been consistent with that
What do you think about something like this:
$ ovs-appctl dpif-netdev/pmd-sleep-show
Default max sleep: 50 us
pmd thread numa_id 0 core_id 8:
max sleep: 0 us
pmd thread numa_id 1 core_id 9:
max sleep: 0 us
pmd thread numa_id 0 core_id 10:
max sleep: 50 us
pmd thread numa_id 1 core_id 11:
max sleep: 50 us
pmd thread numa_id 0 core_id 12:
max sleep: 50 us
pmd thread numa_id 1 core_id 13:
max sleep: 50 us
---
?
Less words, the same header for numa/core as in other pmd-*-show
commands. This format also allows extension in the future, if
needed.
Alternatively, we may degrade the output to a table:
$ ovs-appctl dpif-netdev/pmd-sleep-show
Default max sleep: 50 us
core_id numa_id max sleep
------- ------- ---------
8 0 0 us
9 1 0 us
10 0 50 us
11 1 50 us
12 0 50 us
13 1 50 us
---
It's the most readable option, but least extensible.
I agree with your assessments. I think I prefer the former for the
familiarity and extensibility reasons you gave.
+
.. _ovs-vswitchd(8):
http://openvswitch.org/support/dist-docs/ovs-vswitchd.8.html
diff --git a/lib/dpif-netdev-private-thread.h b/lib/dpif-netdev-private-thread.h
index 1ec3cd794..5c72ce5d9 100644
--- a/lib/dpif-netdev-private-thread.h
+++ b/lib/dpif-netdev-private-thread.h
@@ -181,4 +181,7 @@ struct dp_netdev_pmd_thread {
bool isolated;
+ /* Max sleep request. UINT64_MAX indicates dp default should be used.*/
Can we just store a value here directly after parsing without
fallback logic?
Possibly yes, and that would be nice. I'd need to check the details.
+ atomic_uint64_t max_sleep;
+
/* Queue id used by this pmd thread to send packets on all netdevs if
* XPS disabled for this netdev. All static_tx_qid's are unique and less
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 522253c82..0e79705d8 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -180,4 +180,9 @@ static struct odp_support dp_netdev_support = {
#define PMD_SLEEP_INC_US 1
+struct pmd_sleep {
+ unsigned core_id;
+ uint64_t max_sleep;
+};
+
struct dpcls {
struct cmap_node node; /* Within dp_netdev_pmd_thread.classifiers */
@@ -290,4 +295,6 @@ struct dp_netdev {
/* Max load based sleep request. */
atomic_uint64_t pmd_max_sleep;
+ /* Max load based sleep request user string. */
+ char *max_sleep_list;
Can we move it somewhere else in the structure?
This part is on a hot path in the datapath. Might be better for
performance to keep important variables together.
Ack
/* Enable the SMC cache from ovsdb config */
atomic_bool smc_enable_db;
@@ -1013,9 +1020,15 @@ pmd_max_sleep_show(struct ds *reply, struct
dp_netdev_pmd_thread *pmd,
{
if (pmd->core_id != NON_PMD_CORE_ID) {
+ uint64_t pmd_max_sleep;
+
+ atomic_read_relaxed(&pmd->max_sleep, &pmd_max_sleep);
ds_put_format(reply,
"PMD thread core %3u NUMA %2d: "
"Max sleep request set to",
pmd->core_id, pmd->numa_id);
- ds_put_format(reply, " %4"PRIu64" usecs.", default_max_sleep);
+ ds_put_format(reply, " %4"PRIu64" usecs.",
+ pmd_max_sleep == UINT64_MAX
+ ? default_max_sleep
+ : pmd_max_sleep);
Not sure why we need 2 different calls to ds_put_format().
And the ? can be moved on a previous line with : re-indented accordingly.
Ack
ds_put_cstr(reply, "\n");
}
@@ -1528,7 +1541,8 @@ dpif_netdev_pmd_info(struct unixctl_conn *conn, int argc,
const char *argv[],
atomic_read_relaxed(&dp->pmd_max_sleep, &default_max_sleep);
ds_put_format(&reply, "PMD max sleep request is %"PRIu64" "
- "usecs.", default_max_sleep);
+ "usecs by default.", default_max_sleep);
ds_put_cstr(&reply, "\n");
- ds_put_format(&reply, "PMD load based sleeps are %s.",
+ ds_put_format(&reply, "PMD load based sleeps are %s "
+ "by default.",
default_max_sleep ? "enabled" : "disabled");
ds_put_cstr(&reply, "\n");
@@ -1924,4 +1938,6 @@ create_dp_netdev(const char *name, const struct
dpif_class *class,
}
+ dp->max_sleep_list = NULL;
+
dp->last_tnl_conf_seq = seq_read(tnl_conf_seq);
*dpp = dp;
@@ -2033,4 +2049,5 @@ dp_netdev_free(struct dp_netdev *dp)
dp_netdev_meter_destroy(dp);
+ free(dp->max_sleep_list);
free(dp->pmd_cmask);
free(CONST_CAST(char *, dp->name));
@@ -4847,4 +4864,8 @@ set_pmd_auto_lb(struct dp_netdev *dp, bool state, bool
always_log)
}
+static void
+set_all_pmd_max_sleeps(struct dp_netdev *dp, const struct smap *config,
+ bool always_log);
Name of a prototype should be on a same line with a return type.
Ack
+
/* Applies datapath configuration from the database. Some of the changes are
* actually applied in dpif_netdev_run(). */
@@ -4864,5 +4885,4 @@ dpif_netdev_set_config(struct dpif *dpif, const struct
smap *other_config)
uint8_t cur_rebalance_load;
uint32_t rebalance_load, rebalance_improve;
- uint64_t pmd_max_sleep, cur_pmd_max_sleep;
bool log_autolb = false;
enum sched_assignment_type pmd_rxq_assign_type;
@@ -5019,16 +5039,7 @@ dpif_netdev_set_config(struct dpif *dpif, const struct
smap *other_config)
"Please use pmd-sleep-max instead.");
}
+ set_all_pmd_max_sleeps(dp, other_config, first_set_config);
- pmd_max_sleep = smap_get_ullong(other_config, "pmd-sleep-max", 0);
- pmd_max_sleep = MIN(PMD_RCU_QUIESCE_INTERVAL, pmd_max_sleep);
- atomic_read_relaxed(&dp->pmd_max_sleep, &cur_pmd_max_sleep);
- if (first_set_config || pmd_max_sleep != cur_pmd_max_sleep) {
- atomic_store_relaxed(&dp->pmd_max_sleep, pmd_max_sleep);
- VLOG_INFO("PMD max sleep request is %"PRIu64" usecs.", pmd_max_sleep);
- VLOG_INFO("PMD load based sleeps are %s.",
- pmd_max_sleep ? "enabled" : "disabled" );
- }
-
- first_set_config = false;
+ first_set_config = false;
return 0;
}
@@ -5070,4 +5081,182 @@ parse_affinity_list(const char *affinity_list, unsigned
*core_ids, int n_rxq)
}
+static int
+parse_pmd_sleep_list(const char *max_sleep_list,
+ struct pmd_sleep **pmd_sleeps)
+{
+ char *list, *copy, *key, *value;
+ int num_vals = 0;
+
+ if (!max_sleep_list) {
+ return num_vals;
+ }
+
+ list = copy = xstrdup(max_sleep_list);
+
+ while (ofputil_parse_key_value(&list, &key, &value)) {
+ char *error = NULL;
+ unsigned core;
+ uint64_t temp, pmd_max_sleep;
+ int i;
+
+ error = str_to_u64(key, &temp);
+ if (error) {
+ free(error);
+ continue;
+ }
+
+ error = str_to_u64(value, &pmd_max_sleep);
+ if (error) {
+ /* No value specified. key is dp default. */
+ core = UINT_MAX;
+ pmd_max_sleep = temp;
+ free(error);
+ } else {
+ /* Value specified. key is pmd core id.*/
+ if (temp >= UINT_MAX) {
+ continue;
+ }
+ core = (unsigned) temp;
+ }
+
+ /* Detect duplicate max sleep values for default or a specific core. */
+ for (i = 0; i < num_vals; i++) {
+ if ((*pmd_sleeps)[i].core_id == core) {
+ break;
+ }
+ }
+ if (i == num_vals) {
+ /* Not duplicate, add a new entry. */
+ *pmd_sleeps = xrealloc(*pmd_sleeps,
+ (num_vals + 1) * sizeof **pmd_sleeps);
+ num_vals++;
+ }
+
+ pmd_max_sleep = MIN(PMD_RCU_QUIESCE_INTERVAL, pmd_max_sleep);
+
+ (*pmd_sleeps)[i].core_id = core;
+ (*pmd_sleeps)[i].max_sleep = pmd_max_sleep;
Might be cleaner to maintain a locally allocated array and assign the
output parameter on exit.
ok, let me look into that.
+ }
+
+ free(copy);
+ return num_vals;
+}
+
+static void log_pmd_sleep(unsigned core_id, int numa_id,
+ uint64_t pmd_max_sleep, uint64_t default_max_sleep)
+{
+ VLOG_INFO("PMD thread core %3u NUMA %2d: Max sleep request set to "
+ "%4"PRIu64" usecs.", core_id, numa_id,
s/usecs/microseconds/ or s/usecs/us/
And we usually print cores as signed integers to get -1 for non-pmd threads.
OTOH, we should not log for non-pmd at all here, because sleep makes no sense
for them. But I see this in the log:
dpif_netdev|INFO|PMD thread core 4294967295 NUMA 2147483647: Max sleep
request set to 0 usecs.
oh, nice catch. I had not intended to log that. I had checked for
non-pmd in most cases but missed this one.
Also, would be nice to get more unified logging with the general thread
creation:
dpif_netdev|INFO|PMD thread core 4 NUMA 0: Max sleep request set to 0
usecs.
dpif_netdev|INFO|PMD thread on numa_id: 0, core id: 4 created.
dpif_netdev|INFO|PMD thread core 2 NUMA 0: Max sleep request set to 0
usecs.
dpif_netdev|INFO|PMD thread on numa_id: 0, core id: 2 created.
Maybe something like:
dpif_netdev|INFO|PMD thread on numa_id: 0, core id: 4 max sleep changed to 0
us.
dpif_netdev|INFO|PMD thread on numa_id: 0, core id: 4 created.
I agree that looks better, thanks for the suggestion.
And we probably shouldn't log per-pmd if it didn't actually change.
It makes sense to log the first time the default.
I've seen recently how that type of scheme caused confusion (tx xps
moving some queue mappings but not others) as rightly or wrongly people
tend to look at/send snippets of logs and wonder why some (mappings) are
logged there and not others. I know it's debatable. It was one of the
reasons I added the pmd-sleep-show command.
So in general, I'd side on logging complete sets of info, but I'd need
to see this one in the context of a test run to think it through more fully.
+ pmd_max_sleep == UINT64_MAX
+ ? default_max_sleep
+ : pmd_max_sleep);
This should be:
pmd_max_sleep == UINT64_MAX ? default_max_sleep
: pmd_max_sleep);
Oh ok, I'm always a bit hazy on this one, I thought below meant I should
break before the '?' because the full line wouldn't fit <80.
"Break long lines before the ternary operators ? and :, rather than
after them"
I can change to the suggestion, the indentation is wrong anyway :/
+}
+
+static void
+set_pmd_max_sleep(struct dp_netdev *dp, struct dp_netdev_pmd_thread *pmd)
This function should be called something like pmd_init_max_sleep.
It is using the atomic_init call, so it should only be used for init.
Ack
+{
+ struct pmd_sleep *pmd_sleeps = NULL;
+ uint64_t max_sleep = UINT64_MAX;
Can we use a defualt here?
I will check that. As you rightly pointed out, it would save the
possible secondary check in pmd_thread_main.
+ int num_vals;
+
+ num_vals = parse_pmd_sleep_list(dp->max_sleep_list, &pmd_sleeps);
+
+ /* Check if the user has set a specific value for this pmd. */
+ for (int i = 0; i < num_vals; i++) {
+ if (pmd_sleeps[i].core_id == pmd->core_id) {
+ max_sleep = pmd_sleeps[i].max_sleep;
+ break;
+ }
+ }
+ atomic_init(&pmd->max_sleep, max_sleep);
+ log_pmd_sleep(pmd->core_id, pmd->numa_id, max_sleep, dp->pmd_max_sleep);
+ free(pmd_sleeps);
+}
+
+static void
+set_all_pmd_max_sleeps(struct dp_netdev *dp, const struct smap *config,
+ bool always_log)
+{
+ const char *max_sleep_list = smap_get(config, "pmd-sleep-max");
+ struct pmd_sleep *pmd_sleeps = NULL;
+ struct dp_netdev_pmd_thread **pmd_list = NULL;
+ struct dp_netdev_pmd_thread *pmd;
+ int num_vals = 0;
+ uint64_t default_max_sleep = 0;
+ uint64_t cur_default_max_sleep;
+ size_t n;
Reverse x-mass tree.
Ack. I had been thinking structs then variables with assignment then
variables, but maybe that's another project :-)
+
+ if (nullable_string_is_equal(max_sleep_list, dp->max_sleep_list)
+ && !always_log) {
+ return;
+ }
+
+ /* Free existing string and copy new one. */
+ free(dp->max_sleep_list);
+ dp->max_sleep_list = nullable_xstrdup(max_sleep_list);
+
+ num_vals = parse_pmd_sleep_list(max_sleep_list, &pmd_sleeps);
+
+ /* Check if the user has set a dp default. */
+ for (int i = 0; i < num_vals; i++) {
+ if (pmd_sleeps[i].core_id == UINT_MAX) {
+ default_max_sleep = pmd_sleeps[i].max_sleep;
+ break;
+ }
+ }
+ atomic_read_relaxed(&dp->pmd_max_sleep, &cur_default_max_sleep);
+ if (default_max_sleep != cur_default_max_sleep) {
+ atomic_store_relaxed(&dp->pmd_max_sleep, default_max_sleep);
+ always_log = true;
+ }
+
+ CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
+ uint64_t new_max_sleep, cur_pmd_max_sleep;
+
+ if (pmd->core_id == NON_PMD_CORE_ID) {
+ continue;
+ }
+
+ /* Default to dp value. */
+ new_max_sleep = UINT64_MAX;
Can we use a default here?
will check.
+
+ /* Check for pmd specific value. */
+ for (int i = 0; i < num_vals; i++) {
+ if (pmd->core_id == pmd_sleeps[i].core_id) {
+ new_max_sleep = pmd_sleeps[i].max_sleep;
+ break;
+ }
+ }
+ atomic_read_relaxed(&pmd->max_sleep, &cur_pmd_max_sleep);
+ if (new_max_sleep != cur_pmd_max_sleep) {
+ atomic_store_relaxed(&pmd->max_sleep, new_max_sleep);
+ always_log = true;
+ }
+ }
+
+ if (always_log) {
+ VLOG_INFO("PMD max sleep request is %"PRIu64" "
+ "usecs by default.", default_max_sleep);
Same comment about usecs.
And 'by default' is a bit confusing, but I'm not sure how to re-phrase.
Ack, i'll take a look.
+ VLOG_INFO("PMD load based sleeps are %s by default.",
+ default_max_sleep ? "enabled" : "disabled" );
The "enabled/disabled by default" log is confusing, because we do not
say the same for each thread. We only list numbers for them. It's
probbaly better to just list a number here as well.
That's from previous where I was trying to make it super clear if there
could be sleeps or not. Even though you could argue "max sleep 0 us"
tells the same info. I take the point about now we have perpmd with a
value only now. Let me check it when it's all reworked.
+
+ sorted_poll_thread_list(dp, &pmd_list, &n);
+
+ for (size_t i = 0; i < n; i++) {
+ uint64_t cur_pmd_max_sleep;
+
+ pmd = pmd_list[i];
+ if (pmd->core_id == NON_PMD_CORE_ID) {
+ continue;
+ }
+ atomic_read_relaxed(&pmd->max_sleep, &cur_pmd_max_sleep);
+ log_pmd_sleep(pmd->core_id, pmd->numa_id, cur_pmd_max_sleep,
+ default_max_sleep);
+ }
+ free(pmd_list);
Would be better if we only logged changes on per-thread basis, otherwise
there might be a lot of noise in the log file.
It's probably fine to log a default value though on a first start
and then on changes. If we will store the actual default value in the
pmd's local value, changes in the default value will trigger changes
in per-pmd ones and we will log them.
+ }
+ free(pmd_sleeps);
+}
+
/* Parses 'affinity_list' and applies configuration if it is valid. */
static int
@@ -7059,5 +7248,8 @@ reload:
atomic_read_relaxed(&pmd->dp->smc_enable_db, &pmd->ctx.smc_enable_db);
- atomic_read_relaxed(&pmd->dp->pmd_max_sleep, &max_sleep);
+ atomic_read_relaxed(&pmd->max_sleep, &max_sleep);
+ if (max_sleep == UINT64_MAX) {
+ atomic_read_relaxed(&pmd->dp->pmd_max_sleep, &max_sleep);
+ }
This will not be needed if done during the config parsing.
Ack - as above will aim for that and see if i spot any potential issues.
for (i = 0; i < poll_cnt; i++) {
@@ -7646,4 +7838,6 @@ dp_netdev_configure_pmd(struct dp_netdev_pmd_thread *pmd,
struct dp_netdev *dp,
cmap_init(&pmd->tx_bonds);
+ set_pmd_max_sleep(dp, pmd);
init
As above, Ack.
+
/* Initialize DPIF function pointer to the default configured version. */
atomic_init(&pmd->netdev_input_func, dp_netdev_impl_get_default());
diff --git a/tests/pmd.at b/tests/pmd.at
index df578608c..6040d558c 100644
--- a/tests/pmd.at
+++ b/tests/pmd.at
@@ -66,6 +66,6 @@ dnl Checks correct pmd load based sleep is set for the
datapath.
dnl Checking starts from line number 'line' in ovs-vswithd.log .
m4_define([CHECK_DP_SLEEP_MAX], [
- SLEEP_TIME="PMD max sleep request is $1 usecs."
- SLEEP_STATE="PMD load based sleeps are $2."
+ SLEEP_TIME="PMD max sleep request is $1 usecs by default."
+ SLEEP_STATE="PMD load based sleeps are $2 by default."
line_st=$3
if [[ -z "$line_st" ]]
@@ -1279,6 +1279,6 @@ CHECK_DP_SLEEP_MAX([0], [disabled], [])
AT_CHECK([ovs-appctl dpif-netdev/pmd-sleep-show], [0], [dnl
-PMD max sleep request is 0 usecs.
-PMD load based sleeps are disabled.
+PMD max sleep request is 0 usecs by default.
+PMD load based sleeps are disabled by default.
])
@@ -1288,6 +1288,6 @@ AT_CHECK([ovs-vsctl set open_vswitch . other_config:pmd-sleep-max="1"])
CHECK_DP_SLEEP_MAX([1], [enabled], [+$LINENUM])
AT_CHECK([ovs-appctl dpif-netdev/pmd-sleep-show], [0], [dnl
-PMD max sleep request is 1 usecs.
-PMD load based sleeps are enabled.
+PMD max sleep request is 1 usecs by default.
+PMD load based sleeps are enabled by default.
])
@@ -1297,6 +1297,6 @@ AT_CHECK([ovs-vsctl set open_vswitch . other_config:pmd-sleep-max="10000"])
CHECK_DP_SLEEP_MAX([10000], [enabled], [+$LINENUM])
AT_CHECK([ovs-appctl dpif-netdev/pmd-sleep-show], [0], [dnl
-PMD max sleep request is 10000 usecs.
-PMD load based sleeps are enabled.
+PMD max sleep request is 10000 usecs by default.
+PMD load based sleeps are enabled by default.
])
@@ -1306,6 +1306,6 @@ AT_CHECK([ovs-vsctl set open_vswitch . other_config:pmd-sleep-max="0"])
CHECK_DP_SLEEP_MAX([0], [disabled], [+$LINENUM])
AT_CHECK([ovs-appctl dpif-netdev/pmd-sleep-show], [0], [dnl
-PMD max sleep request is 0 usecs.
-PMD load based sleeps are disabled.
+PMD max sleep request is 0 usecs by default.
+PMD load based sleeps are disabled by default.
])
@@ -1315,6 +1315,6 @@ AT_CHECK([ovs-vsctl set open_vswitch . other_config:pmd-sleep-max="10001"])
CHECK_DP_SLEEP_MAX([10000], [enabled], [+$LINENUM])
AT_CHECK([ovs-appctl dpif-netdev/pmd-sleep-show], [0], [dnl
-PMD max sleep request is 10000 usecs.
-PMD load based sleeps are enabled.
+PMD max sleep request is 10000 usecs by default.
+PMD load based sleeps are enabled by default.
])
@@ -1324,6 +1324,6 @@ AT_CHECK([ovs-vsctl set open_vswitch . other_config:pmd-sleep-max="490"])
CHECK_DP_SLEEP_MAX([490], [enabled], [+$LINENUM])
AT_CHECK([ovs-appctl dpif-netdev/pmd-sleep-show], [0], [dnl
-PMD max sleep request is 490 usecs.
-PMD load based sleeps are enabled.
+PMD max sleep request is 490 usecs by default.
+PMD load based sleeps are enabled by default.
])
@@ -1333,6 +1333,6 @@ AT_CHECK([ovs-vsctl set open_vswitch . other_config:pmd-sleep-max="499"])
CHECK_DP_SLEEP_MAX([499], [enabled], [+$LINENUM])
AT_CHECK([ovs-appctl dpif-netdev/pmd-sleep-show], [0], [dnl
-PMD max sleep request is 499 usecs.
-PMD load based sleeps are enabled.
+PMD max sleep request is 499 usecs by default.
+PMD load based sleeps are enabled by default.
])
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev