@@ -164,12 +164,19 @@ asmlinkage efi_status_t efi_handle_corrupted_x18(efi_status_t s, const char *f)
return s;
}
-static DEFINE_RAW_SPINLOCK(efi_rt_lock);
+static DEFINE_SEMAPHORE(efi_rt_lock, 1);
bool arch_efi_call_virt_setup(void)
{
+ /*
+ * This might be called from a non-sleepable context so try to take the
+ * lock but don't block on it. This should never occur in practice, as
+ * all EFI runtime calls are serialized under the efi_runtime_lock.
+ */
+ if (WARN_ON(down_trylock(&efi_rt_lock)))
+ return false;
+
efi_virtmap_load();
- raw_spin_lock(&efi_rt_lock);
__efi_fpsimd_begin();
return true;
}
@@ -177,8 +184,8 @@ bool arch_efi_call_virt_setup(void)
void arch_efi_call_virt_teardown(void)
{
__efi_fpsimd_end();
- raw_spin_unlock(&efi_rt_lock);
efi_virtmap_unload();
+ up(&efi_rt_lock);
}
asmlinkage u64 *efi_rt_stack_top __ro_after_init;