2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 01:51:26 +00:00

netdev-offload: Fix Clang's static analyzer 'Division by zero' warnings.

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 <echaudro@redhat.com>
Acked-by: Ilya Maximets <i.maximets@ovn.org>
Signed-off-by: Simon Horman <horms@ovn.org>
This commit is contained in:
Eelco Chaudron 2023-10-23 16:22:47 +02:00 committed by Simon Horman
parent 979bc94b1b
commit 08212d755e
4 changed files with 8 additions and 3 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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) {

View File

@ -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]);