RE: [[efi boot control]] efibc: Replace variable set function in notifier call

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Reviewers and all

Could you help review below changes? and let me know your opinion.

Jeremy, could you help add Matt Fleming into the loop to review this change?

Thanks
Tim

-----Original Message-----
From: Tian, Baofeng 
Sent: Wednesday, June 12, 2019 4:18 PM
To: ard.biesheuvel@xxxxxxxxxx; linux-efi@xxxxxxxxxxxxxxx; Compostella, Jeremy <jeremy.compostella@xxxxxxxxx>; Tan, Ming <ming.tan@xxxxxxxxx>; Zhuang, Qihua <qihua.zhuang@xxxxxxxxx>
Cc: Tian, Baofeng <baofeng.tian@xxxxxxxxx>; Luo, XinanX <xinanx.luo@xxxxxxxxx>
Subject: [[efi boot control]] efibc: Replace variable set function in notifier call

From: Tian Baofeng <baofeng.tian@xxxxxxxxx>

Replace the variable set function from "efivar_entry_set" to "efivar_entry_set_safe" in efibc panic notifier.
In safe function parameter "block" will set to false and will call "efivar_entry_set_nonblocking"to set efi variables.
efivar_entry_set_nonblocking is guaranteed to not block and is suitable for calling from crash/panic handlers.
In UEFI android platform, when warm reset happens, with this change, efibc will not block the reboot process.
Otherwise, set variable will call queue work and send to other offlined cpus then cause another panic, finally will cause reboot failure.

Signed-off-by: Tian Baofeng <baofeng.tian@xxxxxxxxx>
Signed-off-by: Luo XinanX <xinanx.luo@xxxxxxxxx>
---
 drivers/firmware/efi/efibc.c | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/firmware/efi/efibc.c b/drivers/firmware/efi/efibc.c index 61e099826cbb..35dccc88ac0a 100644
--- a/drivers/firmware/efi/efibc.c
+++ b/drivers/firmware/efi/efibc.c
@@ -43,11 +43,13 @@ static int efibc_set_variable(const char *name, const char *value)
 	efibc_str_to_str16(value, (efi_char16_t *)entry->var.Data);
 	memcpy(&entry->var.VendorGuid, &guid, sizeof(guid));
 
-	ret = efivar_entry_set(entry,
-			       EFI_VARIABLE_NON_VOLATILE
-			       | EFI_VARIABLE_BOOTSERVICE_ACCESS
-			       | EFI_VARIABLE_RUNTIME_ACCESS,
-			       size, entry->var.Data, NULL);
+	ret = efivar_entry_set_safe(entry->var.VariableName,
+				    entry->var.VendorGuid,
+				    EFI_VARIABLE_NON_VOLATILE
+				    | EFI_VARIABLE_BOOTSERVICE_ACCESS
+				    | EFI_VARIABLE_RUNTIME_ACCESS,
+				    false, size, entry->var.Data);
+
 	if (ret)
 		pr_err("failed to set %s EFI variable: 0x%x\n",
 		       name, ret);
--
2.21.0





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux