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)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 15 Jun 2020 13:24:21 +0000 (15:24 +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
(cherry picked from commit f46ba93944aac3f05211e0d630cdf84955eba2d8)

src/basic/efivars.c

index 502c3a0c4448aa54565674e7372bd660ec8c43f7..9ed0b61f7b3f8303222e4bc46bfc05dc892751d5 100644 (file)
@@ -223,10 +223,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) {
@@ -250,11 +256,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) {