]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: Prefer cpuset_{get,set}affinity() on BSD
authorAndrea Bolognani <abologna@redhat.com>
Fri, 23 Feb 2024 00:37:22 +0000 (01:37 +0100)
committerAndrea Bolognani <abologna@redhat.com>
Tue, 19 Mar 2024 17:34:30 +0000 (18:34 +0100)
FreeBSD 14 implements sched_{get,set}affinity() for
compatibility with Linux, but we should still use the native
syscalls instead.

Signed-off-by: Andrea Bolognani <abologna@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/util/virprocess.c

index 8384bd1378ed0ec96170991455f27c55c77a1c59..426d56c1ce4aa11526fcb3a91e87603251ef7c49 100644 (file)
@@ -444,7 +444,61 @@ int virProcessKillPainfully(pid_t pid, bool force)
     return virProcessKillPainfullyDelay(pid, force, 0, false);
 }
 
-#if WITH_DECL_CPU_SET_T
+#if defined(WITH_BSD_CPU_AFFINITY)
+
+int virProcessSetAffinity(pid_t pid,
+                          virBitmap *map,
+                          bool quiet)
+{
+    size_t i;
+    cpuset_t mask;
+
+    CPU_ZERO(&mask);
+    for (i = 0; i < virBitmapSize(map); i++) {
+        if (virBitmapIsBitSet(map, i))
+            CPU_SET(i, &mask);
+    }
+
+    if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TIDPID, pid,
+                           sizeof(mask), &mask) != 0) {
+        if (quiet) {
+            VIR_DEBUG("cannot set CPU affinity on process %d: %s",
+                      pid, g_strerror(errno));
+        } else {
+            virReportSystemError(errno,
+                                 _("cannot set CPU affinity on process %1$d"), pid);
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+virBitmap *
+virProcessGetAffinity(pid_t pid)
+{
+    size_t i;
+    cpuset_t mask;
+    virBitmap *ret = NULL;
+
+    CPU_ZERO(&mask);
+    if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TIDPID, pid,
+                           sizeof(mask), &mask) != 0) {
+        virReportSystemError(errno,
+                             _("cannot get CPU affinity of process %1$d"), pid);
+        return NULL;
+    }
+
+    ret = virBitmapNew(sizeof(mask) * 8);
+
+    for (i = 0; i < sizeof(mask) * 8; i++)
+        if (CPU_ISSET(i, &mask))
+            ignore_value(virBitmapSetBit(ret, i));
+
+    return ret;
+}
+
+#elif WITH_DECL_CPU_SET_T
 
 int virProcessSetAffinity(pid_t pid, virBitmap *map, bool quiet)
 {
@@ -536,60 +590,6 @@ virProcessGetAffinity(pid_t pid)
     return ret;
 }
 
-#elif defined(WITH_BSD_CPU_AFFINITY)
-
-int virProcessSetAffinity(pid_t pid,
-                          virBitmap *map,
-                          bool quiet)
-{
-    size_t i;
-    cpuset_t mask;
-
-    CPU_ZERO(&mask);
-    for (i = 0; i < virBitmapSize(map); i++) {
-        if (virBitmapIsBitSet(map, i))
-            CPU_SET(i, &mask);
-    }
-
-    if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TIDPID, pid,
-                           sizeof(mask), &mask) != 0) {
-        if (quiet) {
-            VIR_DEBUG("cannot set CPU affinity on process %d: %s",
-                      pid, g_strerror(errno));
-        } else {
-            virReportSystemError(errno,
-                                 _("cannot set CPU affinity on process %1$d"), pid);
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-virBitmap *
-virProcessGetAffinity(pid_t pid)
-{
-    size_t i;
-    cpuset_t mask;
-    virBitmap *ret = NULL;
-
-    CPU_ZERO(&mask);
-    if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TIDPID, pid,
-                           sizeof(mask), &mask) != 0) {
-        virReportSystemError(errno,
-                             _("cannot get CPU affinity of process %1$d"), pid);
-        return NULL;
-    }
-
-    ret = virBitmapNew(sizeof(mask) * 8);
-
-    for (i = 0; i < sizeof(mask) * 8; i++)
-        if (CPU_ISSET(i, &mask))
-            ignore_value(virBitmapSetBit(ret, i));
-
-    return ret;
-}
-
 #else /* WITH_DECL_CPU_SET_T */
 
 int virProcessSetAffinity(pid_t pid G_GNUC_UNUSED,