When enabling DPDK with the configure the below, ovs-vswitchd will crash.
ovs-vsctl set Open_vSwitch . other_config:n-offload-threads=0
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
This issue arises because setting the 'n-offload-threads' value to zero
is not a supported configuration. This fix addresses this by implementing
a check to ensure a valid 'n-offload-threads' value, both during
configuration and statistics gathering.
Fixes: 62c2d8a67543 ("netdev-offload: Add multi-thread API.")
Signed-off-by: Eelco Chaudron <[email protected]>
---
lib/dpif-netdev.c | 4 ++++
lib/netdev-offload.c | 3 ++-
tests/test-id-fpool.c | 2 +-
tests/test-mpsc-queue.c | 2 +-
4 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 157694bcf..b8f065d1d 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -4748,6 +4748,10 @@ dpif_netdev_offload_stats_get(struct dpif *dpif,
}
nb_thread = netdev_offload_thread_nb();
+ if (!nb_thread) {
+ return EINVAL;
+ }
+
/* nb_thread counters for the overall total as well. */
stats->size = ARRAY_SIZE(hwol_stats) * (nb_thread + 1);
stats->counters = xcalloc(stats->size, sizeof *stats->counters);
diff --git a/lib/netdev-offload.c b/lib/netdev-offload.c
index a5fa62487..931d634e1 100644
--- a/lib/netdev-offload.c
+++ b/lib/netdev-offload.c
@@ -872,7 +872,8 @@ netdev_set_flow_api_enabled(const struct smap
*ovs_other_config)
offload_thread_nb = smap_get_ullong(ovs_other_config,
"n-offload-threads",
DEFAULT_OFFLOAD_THREAD_NB);
- if (offload_thread_nb > MAX_OFFLOAD_THREAD_NB) {
+ if (offload_thread_nb == 0 ||
+ offload_thread_nb > MAX_OFFLOAD_THREAD_NB) {
VLOG_WARN("netdev: Invalid number of threads requested: %u",
offload_thread_nb);
offload_thread_nb = DEFAULT_OFFLOAD_THREAD_NB;
diff --git a/tests/test-id-fpool.c b/tests/test-id-fpool.c
index 27800aa9b..7bdb8154d 100644
--- a/tests/test-id-fpool.c
+++ b/tests/test-id-fpool.c
@@ -237,7 +237,7 @@ print_result(const char *prefix)
for (i = 0; i < n_threads; i++) {
avg += thread_working_ms[i];
}
- avg /= n_threads;
+ avg /= n_threads ? n_threads : 1;
printf("%s: ", prefix);
for (i = 0; i < n_threads; i++) {
if (thread_working_ms[i] >= TIMEOUT_MS) {
diff --git a/tests/test-mpsc-queue.c b/tests/test-mpsc-queue.c
index 16aa804a0..86a223caf 100644
--- a/tests/test-mpsc-queue.c
+++ b/tests/test-mpsc-queue.c
@@ -315,7 +315,7 @@ print_result(const char *prefix, int reader_elapsed)
for (i = 0; i < n_threads; i++) {
avg += thread_working_ms[i];
}
- avg /= n_threads;
+ avg /= n_threads ? n_threads : 1;
printf("%s: %6d", prefix, reader_elapsed);
for (i = 0; i < n_threads; i++) {
printf(" %6" PRIu64, thread_working_ms[i]);
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev