@@ -10,6 +10,7 @@
#include <linux/efi.h>
#include <linux/init.h>
#include <linux/kmemleak.h>
+#include <linux/kthread.h>
#include <linux/screen_info.h>
#include <linux/vmalloc.h>
@@ -176,7 +177,12 @@ bool arch_efi_call_virt_setup(void)
if (WARN_ON(down_trylock(&efi_rt_lock)))
return false;
- efi_virtmap_load();
+ if (preemptible() && (current->flags & PF_KTHREAD)) {
+ migrate_disable();
+ kthread_use_mm(&efi_mm);
+ } else {
+ efi_virtmap_load();
+ }
uaccess_ttbr0_enable();
post_ttbr_update_workaround();
__efi_fpsimd_begin();
@@ -186,7 +192,12 @@ bool arch_efi_call_virt_setup(void)
void arch_efi_call_virt_teardown(void)
{
__efi_fpsimd_end();
- efi_virtmap_unload();
+ if (preemptible() && (current->flags & PF_KTHREAD)) {
+ kthread_unuse_mm(&efi_mm);
+ migrate_enable();
+ } else {
+ efi_virtmap_unload();
+ }
uaccess_ttbr0_disable();
up(&efi_rt_lock);
}