On Wed, 12 Jun 2019 at 10:20, <[email protected]> wrote:
>
> From: Tian Baofeng <[email protected]>
>
> 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 <[email protected]>
> Signed-off-by: Luo XinanX <[email protected]>
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
>