]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blobdiff - kernel/kexec_core.c
Merge tag 'sched-psi-2022-10-14' of git://git.kernel.org/pub/scm/linux/kernel/git...
[mirror_ubuntu-kernels.git] / kernel / kexec_core.c
index acd029b307e42d32a5143bd03ab38f05dc094236..ca2743f9c634e4c94b4f4f30c19cd33549fb4cdf 100644 (file)
@@ -46,7 +46,7 @@
 #include <crypto/hash.h>
 #include "kexec_internal.h"
 
-DEFINE_MUTEX(kexec_mutex);
+atomic_t __kexec_lock = ATOMIC_INIT(0);
 
 /* Per cpu memory for storing cpu states in case of system crash. */
 note_buf_t __percpu *crash_notes;
@@ -809,7 +809,7 @@ static int kimage_load_normal_segment(struct kimage *image,
                if (result < 0)
                        goto out;
 
-               ptr = kmap(page);
+               ptr = kmap_local_page(page);
                /* Start with a clear page */
                clear_page(ptr);
                ptr += maddr & ~PAGE_MASK;
@@ -822,7 +822,7 @@ static int kimage_load_normal_segment(struct kimage *image,
                        memcpy(ptr, kbuf, uchunk);
                else
                        result = copy_from_user(ptr, buf, uchunk);
-               kunmap(page);
+               kunmap_local(ptr);
                if (result) {
                        result = -EFAULT;
                        goto out;
@@ -873,7 +873,7 @@ static int kimage_load_crash_segment(struct kimage *image,
                        goto out;
                }
                arch_kexec_post_alloc_pages(page_address(page), 1, 0);
-               ptr = kmap(page);
+               ptr = kmap_local_page(page);
                ptr += maddr & ~PAGE_MASK;
                mchunk = min_t(size_t, mbytes,
                                PAGE_SIZE - (maddr & ~PAGE_MASK));
@@ -889,7 +889,7 @@ static int kimage_load_crash_segment(struct kimage *image,
                else
                        result = copy_from_user(ptr, buf, uchunk);
                kexec_flush_icache_page(page);
-               kunmap(page);
+               kunmap_local(ptr);
                arch_kexec_pre_free_pages(page_address(page), 1);
                if (result) {
                        result = -EFAULT;
@@ -959,7 +959,7 @@ late_initcall(kexec_core_sysctl_init);
  */
 void __noclone __crash_kexec(struct pt_regs *regs)
 {
-       /* Take the kexec_mutex here to prevent sys_kexec_load
+       /* Take the kexec_lock here to prevent sys_kexec_load
         * running on one cpu from replacing the crash kernel
         * we are using after a panic on a different cpu.
         *
@@ -967,7 +967,7 @@ void __noclone __crash_kexec(struct pt_regs *regs)
         * of memory the xchg(&kexec_crash_image) would be
         * sufficient.  But since I reuse the memory...
         */
-       if (mutex_trylock(&kexec_mutex)) {
+       if (kexec_trylock()) {
                if (kexec_crash_image) {
                        struct pt_regs fixed_regs;
 
@@ -976,7 +976,7 @@ void __noclone __crash_kexec(struct pt_regs *regs)
                        machine_crash_shutdown(&fixed_regs);
                        machine_kexec(kexec_crash_image);
                }
-               mutex_unlock(&kexec_mutex);
+               kexec_unlock();
        }
 }
 STACK_FRAME_NON_STANDARD(__crash_kexec);
@@ -1004,14 +1004,17 @@ void crash_kexec(struct pt_regs *regs)
        }
 }
 
-size_t crash_get_memory_size(void)
+ssize_t crash_get_memory_size(void)
 {
-       size_t size = 0;
+       ssize_t size = 0;
+
+       if (!kexec_trylock())
+               return -EBUSY;
 
-       mutex_lock(&kexec_mutex);
        if (crashk_res.end != crashk_res.start)
                size = resource_size(&crashk_res);
-       mutex_unlock(&kexec_mutex);
+
+       kexec_unlock();
        return size;
 }
 
@@ -1022,7 +1025,8 @@ int crash_shrink_memory(unsigned long new_size)
        unsigned long old_size;
        struct resource *ram_res;
 
-       mutex_lock(&kexec_mutex);
+       if (!kexec_trylock())
+               return -EBUSY;
 
        if (kexec_crash_image) {
                ret = -ENOENT;
@@ -1060,7 +1064,7 @@ int crash_shrink_memory(unsigned long new_size)
        insert_resource(&iomem_resource, ram_res);
 
 unlock:
-       mutex_unlock(&kexec_mutex);
+       kexec_unlock();
        return ret;
 }
 
@@ -1132,7 +1136,7 @@ int kernel_kexec(void)
 {
        int error = 0;
 
-       if (!mutex_trylock(&kexec_mutex))
+       if (!kexec_trylock())
                return -EBUSY;
        if (!kexec_image) {
                error = -EINVAL;
@@ -1208,6 +1212,6 @@ int kernel_kexec(void)
 #endif
 
  Unlock:
-       mutex_unlock(&kexec_mutex);
+       kexec_unlock();
        return error;
 }