diff options
-rw-r--r-- | arch/arm64/kernel/efi.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c index 5d188c6c44d74d..1c86a891f6d78e 100644 --- a/arch/arm64/kernel/efi.c +++ b/arch/arm64/kernel/efi.c @@ -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); } |