By following works, my system very often fails set_variable() to set new variable to efi variable storage and shows "efivars: set_variable() failed: status=-28" message. - commit 68d929862e29a8b52a7f2f2f86a0600423b093cd efi: be more paranoid about available space when creating variables - commit 31ff2f20d9003e74991d135f56e503fe776c127c efi: Distinguish between "remaining space" and actually used space - commit 8c58bf3eec3b8fc8162fe557e9361891c20758f2 x86,efi: Implement efi_no_storage_paranoia parameter - commit f8b8404337de4e2466e2e1139ea68b1f8295974f Modify UEFI anti-bricking code When booting my system, remaining space of efi variable storage is about 5KB. So there is no room that sets a new variable to the storage. On my system, trigger of gc is when EFI_OUT_OF_RESOURCES occurs on pre OS environment with UEFI. So if EFI_OUT_OF_RESOURCES occurs by the 5Kbyte threshold, nvram storage cannot be used until EFI_OUT_OF_RESOURCES occurs on pre OS environment with UEFI. This patch adds whitelist. If a server is in the whitelist, efi_no_storage_paranoia is set to true. And the system can use all efi variable storage. Signed-off-by: Yasuaki Ishimatsu <isimatu.yasuaki@xxxxxxxxxxxxxx> CC: Matthew Garrett <matthew.garrett@xxxxxxxxxx> CC: Richard Weinberger <richard@xxxxxx> CC: Lee, Chun-Y <jlee@xxxxxxxx> CC: Madper Xie <cxie@xxxxxxxxxx> CC: Matt Fleming <matt.fleming@xxxxxxxxx> --- arch/x86/platform/efi/efi.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index c7e22ab..f9fad62 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c @@ -42,6 +42,7 @@ #include <linux/io.h> #include <linux/reboot.h> #include <linux/bcd.h> +#include <linux/dmi.h> #include <asm/setup.h> #include <asm/efi.h> @@ -116,6 +117,24 @@ static int __init setup_storage_paranoia(char *arg) } early_param("efi_no_storage_paranoia", setup_storage_paranoia); +static struct dmi_system_id efi_whitelist_table[] __initdata = { + { + /* FUJITSU PRIMEQUEST */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "PRIMEQUEST"), + }, + }, + {} +}; + +static int __init init_efi_no_storage_paranoia(void) +{ + if (dmi_check_system(efi_whitelist_table)) + efi_no_storage_paranoia = true; + return 0; +} +late_initcall(init_efi_no_storage_paranoia); static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc) { -- To unsubscribe from this list: send the line "unsubscribe linux-efi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html