]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
efi: cache test results of boolean EFI state functions
authorLennart Poettering <lennart@poettering.net>
Tue, 28 Apr 2020 21:33:46 +0000 (23:33 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 30 Apr 2020 06:10:31 +0000 (08:10 +0200)
EFI variable access is nowadays subject to rate limiting by the kernel.
Thus, let's cache the results of checking them, in order to minimize how
often we access them.

Fixes: #14828
src/basic/efivars.c

index aa08ad2e278f7f4f2fae4c9f7be0e7c6b7f8f209..b79ca8efd77710c8cf55f860c8775af6e32c16d1 100644 (file)
@@ -244,10 +244,16 @@ int efi_set_variable_string(sd_id128_t vendor, const char *name, const char *v)
 }
 
 bool is_efi_boot(void) {
-        if (detect_container() > 0)
-                return false;
+        static int cache = -1;
 
-        return access("/sys/firmware/efi/", F_OK) >= 0;
+        if (cache < 0) {
+                if (detect_container() > 0)
+                        cache = false;
+                else
+                        cache = access("/sys/firmware/efi/", F_OK) >= 0;
+        }
+
+        return cache;
 }
 
 static int read_flag(const char *varname) {
@@ -271,11 +277,21 @@ static int read_flag(const char *varname) {
 }
 
 bool is_efi_secure_boot(void) {
-        return read_flag("SecureBoot") > 0;
+        static int cache = -1;
+
+        if (cache < 0)
+                cache = read_flag("SecureBoot");
+
+        return cache > 0;
 }
 
 bool is_efi_secure_boot_setup_mode(void) {
-        return read_flag("SetupMode") > 0;
+        static int cache = -1;
+
+        if (cache < 0)
+                cache = read_flag("SetupMode");
+
+        return cache > 0;
 }
 
 int systemd_efi_options_variable(char **line) {