linux-efi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [[efi boot control]] efibc: Replace variable set function in notifier call
@ 2019-06-12  8:18 baofeng.tian
  2019-06-20  0:45 ` Tian, Baofeng
  2019-06-21 16:04 ` Ard Biesheuvel
  0 siblings, 2 replies; 4+ messages in thread
From: baofeng.tian @ 2019-06-12  8:18 UTC (permalink / raw)
  To: ard.biesheuvel, linux-efi, jeremy.compostella, ming.tan, qihua.zhuang
  Cc: Tian Baofeng, Luo XinanX

From: Tian Baofeng <baofeng.tian@intel.com>

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@intel.com>
Signed-off-by: Luo XinanX <xinanx.luo@intel.com>
---
 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* RE: [[efi boot control]] efibc: Replace variable set function in notifier call
  2019-06-12  8:18 [[efi boot control]] efibc: Replace variable set function in notifier call baofeng.tian
@ 2019-06-20  0:45 ` Tian, Baofeng
  2019-06-21 16:04 ` Ard Biesheuvel
  1 sibling, 0 replies; 4+ messages in thread
From: Tian, Baofeng @ 2019-06-20  0:45 UTC (permalink / raw)
  To: ard.biesheuvel, linux-efi, Compostella, Jeremy, Tan, Ming, Zhuang, Qihua

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@linaro.org; linux-efi@vger.kernel.org; Compostella, Jeremy <jeremy.compostella@intel.com>; Tan, Ming <ming.tan@intel.com>; Zhuang, Qihua <qihua.zhuang@intel.com>
Cc: Tian, Baofeng <baofeng.tian@intel.com>; Luo, XinanX <xinanx.luo@intel.com>
Subject: [[efi boot control]] efibc: Replace variable set function in notifier call

From: Tian Baofeng <baofeng.tian@intel.com>

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@intel.com>
Signed-off-by: Luo XinanX <xinanx.luo@intel.com>
---
 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


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [[efi boot control]] efibc: Replace variable set function in notifier call
  2019-06-12  8:18 [[efi boot control]] efibc: Replace variable set function in notifier call baofeng.tian
  2019-06-20  0:45 ` Tian, Baofeng
@ 2019-06-21 16:04 ` Ard Biesheuvel
  1 sibling, 0 replies; 4+ messages in thread
From: Ard Biesheuvel @ 2019-06-21 16:04 UTC (permalink / raw)
  To: baofeng.tian
  Cc: linux-efi, jeremy.compostella, ming.tan, qihua.zhuang, Luo XinanX

On Wed, 12 Jun 2019 at 10:20, <baofeng.tian@intel.com> wrote:
>
> From: Tian Baofeng <baofeng.tian@intel.com>
>
> 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@intel.com>
> Signed-off-by: Luo XinanX <xinanx.luo@intel.com>

Queued as a fix in efi/urgent

Thanks

> ---
>  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
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [[efi boot control]] efibc: Replace variable set function in notifier call
@ 2019-06-12  8:15 baofeng.tian
  0 siblings, 0 replies; 4+ messages in thread
From: baofeng.tian @ 2019-06-12  8:15 UTC (permalink / raw)
  To: ard.biesheuvel, linux-efi, jeremy.compostella, ming.tan, qihua.zhuang
  Cc: Tian Baofeng, Luo XinanX

From: Tian Baofeng <baofeng.tian@intel.com>

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.

Change-Id: I82d182ef6c036a1427d65d090a97469e2d51a5e1
Signed-off-by: Tian Baofeng <baofeng.tian@intel.com>
Signed-off-by: Luo XinanX <xinanx.luo@intel.com>
---
 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-06-21 16:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-12  8:18 [[efi boot control]] efibc: Replace variable set function in notifier call baofeng.tian
2019-06-20  0:45 ` Tian, Baofeng
2019-06-21 16:04 ` Ard Biesheuvel
  -- strict thread matches above, loose matches on Subject: below --
2019-06-12  8:15 baofeng.tian

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).