]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
psi-util: fix error handling
authorLennart Poettering <lennart@poettering.net>
Mon, 27 Feb 2023 18:02:41 +0000 (19:02 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 28 Feb 2023 12:16:59 +0000 (12:16 +0000)
We checked ERRNO_IS_NOT_SUPPORTED on a possible positive non-error code,
which isn't right.

Fix that. Also add caching, since we are about to call this more often.

src/basic/psi-util.c

index 8bdd0d4a859ad33821ad8384c9db57ebc87bec76..a3b553cb440c732171b397aa24637c0896e3a402 100644 (file)
@@ -106,18 +106,24 @@ int read_resource_pressure(const char *path, PressureType type, ResourcePressure
 }
 
 int is_pressure_supported(void) {
-        /* The pressure files, both under /proc and in cgroups, will exist
-         * even if the kernel has PSI support disabled; we have to read
-         * the file to make sure it doesn't return -EOPNOTSUPP */
-        FOREACH_STRING(p, "/proc/pressure/cpu", "/proc/pressure/io", "/proc/pressure/memory") {
-                int r;
+        static thread_local int cached = -1;
+        int r;
+
+        /* The pressure files, both under /proc/ and in cgroups, will exist even if the kernel has PSI
+         * support disabled; we have to read the file to make sure it doesn't return -EOPNOTSUPP */
+
+        if (cached >= 0)
+                return cached;
 
+        FOREACH_STRING(p, "/proc/pressure/cpu", "/proc/pressure/io", "/proc/pressure/memory") {
                 r = read_virtual_file(p, 0, NULL, NULL);
-                if (r == -ENOENT || ERRNO_IS_NOT_SUPPORTED(r))
-                        return 0;
-                if (r < 0)
+                if (r < 0) {
+                        if (r == -ENOENT || ERRNO_IS_NOT_SUPPORTED(r))
+                                return (cached = false);
+
                         return r;
+                }
         }
 
-        return 1;
+        return (cached = true);
 }