[2/8] efi/x86: Use non-blocking SetVariable() for efi_delete_dummy_variable()

Message ID 20180711094040.12506-3-ard.biesheuvel@linaro.org
State New
Headers show
Series
  • EFI changes for v4.19
Related show

Commit Message

Ard Biesheuvel July 11, 2018, 9:40 a.m.
From: Sai Praneeth <sai.praneeth.prakhya@intel.com>


Presently, efi_delete_dummy_variable() uses set_variable() which might
block and hence kernel prints stack trace with a warning "bad:
scheduling from the idle thread!". So, make efi_delete_dummy_variable()
use set_variable_nonblocking(), which, as the name suggests doesn't
block.

Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

---
 arch/x86/platform/efi/quirks.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

-- 
2.17.1

Comments

Ingo Molnar July 16, 2018, 1:02 a.m. | #1
* Prakhya, Sai Praneeth <sai.praneeth.prakhya@intel.com> wrote:

> > > diff --git a/arch/x86/platform/efi/quirks.c

> > > b/arch/x86/platform/efi/quirks.c index 36c1f8b9f7e0..6af39dc40325

> > > 100644

> > > --- a/arch/x86/platform/efi/quirks.c

> > > +++ b/arch/x86/platform/efi/quirks.c

> > > @@ -105,12 +105,11 @@ early_param("efi_no_storage_paranoia",

> > > setup_storage_paranoia);  */  void efi_delete_dummy_variable(void)  {

> > > -	efi.set_variable((efi_char16_t *)efi_dummy_name,

> > > -			 &EFI_DUMMY_GUID,

> > > -			 EFI_VARIABLE_NON_VOLATILE |

> > > -			 EFI_VARIABLE_BOOTSERVICE_ACCESS |

> > > -			 EFI_VARIABLE_RUNTIME_ACCESS,

> > > -			 0, NULL);

> > > +	efi.set_variable_nonblocking((efi_char16_t *)efi_dummy_name,

> > > +				     &EFI_DUMMY_GUID,

> > > +				     EFI_VARIABLE_NON_VOLATILE |

> > > +				     EFI_VARIABLE_BOOTSERVICE_ACCESS |

> > > +				     EFI_VARIABLE_RUNTIME_ACCESS, 0, NULL);

> > >  }

> > 

> > Just wondering, what is the full stack trace of the splat? It sounds a bit surprising

> > to me that such type of EFI code is used from the idle thread.

> 

> Sorry! for the confusing commit message. Kernel warns about scheduling from idle 

> thread only when "efi_rts_wq" is used to invoke efi_runtime_services(). So, 

> presently, this doesn't happen on mainline kernel. Support for "efi_rts_wq" is 

> added by commit 3eb420e70d87 (efi: Use a work queue to invoke EFI Runtime 

> Services).


Ok, that makes a lot more sense!

Thanks,

	Ingo

Patch

diff --git a/arch/x86/platform/efi/quirks.c b/arch/x86/platform/efi/quirks.c
index 36c1f8b9f7e0..6af39dc40325 100644
--- a/arch/x86/platform/efi/quirks.c
+++ b/arch/x86/platform/efi/quirks.c
@@ -105,12 +105,11 @@  early_param("efi_no_storage_paranoia", setup_storage_paranoia);
 */
 void efi_delete_dummy_variable(void)
 {
-	efi.set_variable((efi_char16_t *)efi_dummy_name,
-			 &EFI_DUMMY_GUID,
-			 EFI_VARIABLE_NON_VOLATILE |
-			 EFI_VARIABLE_BOOTSERVICE_ACCESS |
-			 EFI_VARIABLE_RUNTIME_ACCESS,
-			 0, NULL);
+	efi.set_variable_nonblocking((efi_char16_t *)efi_dummy_name,
+				     &EFI_DUMMY_GUID,
+				     EFI_VARIABLE_NON_VOLATILE |
+				     EFI_VARIABLE_BOOTSERVICE_ACCESS |
+				     EFI_VARIABLE_RUNTIME_ACCESS, 0, NULL);
 }
 
 /*