diff mbox series

[ovs-dev,v6,1/2] util: Support checking for kernel versions.

Message ID 7fc55e71ef28fc4575c0005e34599e86aefd7f51.1709537628.git.felix.huettner@mail.schwarz
State Changes Requested
Headers show
Series [ovs-dev,v6,1/2] util: Support checking for kernel versions. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Felix Huettner March 4, 2024, 8:22 a.m. UTC
Extract checking for a given kernel version to a separate function.
It will be used also in the next patch.

Signed-off-by: Felix Huettner <felix.huettner@mail.schwarz>
---
v5->v6:
- fix ovs_kernel_is_version_or_newer returning false if major and minor
  are equal (thanks Mike)
v4->v5:
- fix wrong ifdef that broke on macos
- fix ovs_kernel_is_version_or_newer working in reverse than desired
- ovs_kernel_is_version_or_newer now always returns false if uname
  errors (Thanks Eelco)
v4:
- extract function to check kernel version

 lib/netdev-linux.c | 15 +++------------
 lib/util.c         | 27 +++++++++++++++++++++++++++
 lib/util.h         |  4 ++++
 3 files changed, 34 insertions(+), 12 deletions(-)


base-commit: 436aba68d52891fb5775ec7651282ccf9d04176b

Comments

Mike Pattrick March 5, 2024, 6:56 p.m. UTC | #1
On Mon, Mar 4, 2024 at 3:22 AM Felix Huettner via dev
<ovs-dev@openvswitch.org> wrote:
>
> Extract checking for a given kernel version to a separate function.
> It will be used also in the next patch.
>
> Signed-off-by: Felix Huettner <felix.huettner@mail.schwarz>
> ---

Acked-by: Mike Pattrick <mkp@redhat.com>
Eelco Chaudron March 8, 2024, 9:52 a.m. UTC | #2
On 4 Mar 2024, at 9:22, Felix Huettner via dev wrote:

> Extract checking for a given kernel version to a separate function.
> It will be used also in the next patch.
>
> Signed-off-by: Felix Huettner <felix.huettner@mail.schwarz>

Thanks for fixing the version check.

Acked-by: Eelco Chaudron <echaudro@redhat.com>
diff mbox series

Patch

diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index bf91ef462..a8424ed82 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -40,7 +40,6 @@ 
 #include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/uio.h>
-#include <sys/utsname.h>
 #include <net/if.h>
 #include <net/if_arp.h>
 #include <net/route.h>
@@ -6427,18 +6426,10 @@  getqdisc_is_safe(void)
     static bool safe = false;
 
     if (ovsthread_once_start(&once)) {
-        struct utsname utsname;
-        int major, minor;
-
-        if (uname(&utsname) == -1) {
-            VLOG_WARN("uname failed (%s)", ovs_strerror(errno));
-        } else if (!ovs_scan(utsname.release, "%d.%d", &major, &minor)) {
-            VLOG_WARN("uname reported bad OS release (%s)", utsname.release);
-        } else if (major < 2 || (major == 2 && minor < 35)) {
-            VLOG_INFO("disabling unsafe RTM_GETQDISC in Linux kernel %s",
-                      utsname.release);
-        } else {
+        if (ovs_kernel_is_version_or_newer(2, 35)) {
             safe = true;
+        } else {
+            VLOG_INFO("disabling unsafe RTM_GETQDISC in Linux kernel");
         }
         ovsthread_once_done(&once);
     }
diff --git a/lib/util.c b/lib/util.c
index 3fb3a4b40..5c31d983a 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -27,6 +27,7 @@ 
 #include <string.h>
 #ifdef __linux__
 #include <sys/prctl.h>
+#include <sys/utsname.h>
 #endif
 #include <sys/stat.h>
 #include <unistd.h>
@@ -2500,3 +2501,29 @@  OVS_CONSTRUCTOR(winsock_start) {
    }
 }
 #endif
+
+#ifdef __linux__
+bool
+ovs_kernel_is_version_or_newer(int target_major, int target_minor)
+{
+    static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
+    static int current_major, current_minor = -1;
+
+    if (ovsthread_once_start(&once)) {
+        struct utsname utsname;
+
+        if (uname(&utsname) == -1) {
+            VLOG_WARN("uname failed (%s)", ovs_strerror(errno));
+        } else if (!ovs_scan(utsname.release, "%d.%d",
+                    &current_major, &current_minor)) {
+            VLOG_WARN("uname reported bad OS release (%s)", utsname.release);
+        }
+        ovsthread_once_done(&once);
+    }
+    if (current_major == -1 || current_minor == -1) {
+        return false;
+    }
+    return current_major > target_major || (
+            current_major == target_major && current_minor >= target_minor);
+}
+#endif
diff --git a/lib/util.h b/lib/util.h
index f2d45bcac..55718fd87 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -611,4 +611,8 @@  int ftruncate(int fd, off_t length);
 }
 #endif
 
+#ifdef __linux__
+bool ovs_kernel_is_version_or_newer(int target_major, int target_minor);
+#endif
+
 #endif /* util.h */