]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - kernel/kexec_core.c
kexec: add helper __crash_shrink_memory()
[thirdparty/linux.git] / kernel / kexec_core.c
index 69fe92141b0b62d408042cce4c196eb8b34145b1..f7ff7de94a6133acf6ab19a9c819bb54d0824cb9 100644 (file)
@@ -1105,11 +1105,38 @@ ssize_t crash_get_memory_size(void)
        return size;
 }
 
+static int __crash_shrink_memory(struct resource *old_res,
+                                unsigned long new_size)
+{
+       struct resource *ram_res;
+
+       ram_res = kzalloc(sizeof(*ram_res), GFP_KERNEL);
+       if (!ram_res)
+               return -ENOMEM;
+
+       ram_res->start = old_res->start + new_size;
+       ram_res->end   = old_res->end;
+       ram_res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
+       ram_res->name  = "System RAM";
+
+       if (!new_size) {
+               release_resource(old_res);
+               old_res->start = 0;
+               old_res->end   = 0;
+       } else {
+               crashk_res.end = ram_res->start - 1;
+       }
+
+       crash_free_reserved_phys_range(ram_res->start, ram_res->end);
+       insert_resource(&iomem_resource, ram_res);
+
+       return 0;
+}
+
 int crash_shrink_memory(unsigned long new_size)
 {
        int ret = 0;
        unsigned long old_size;
-       struct resource *ram_res;
 
        if (!kexec_trylock())
                return -EBUSY;
@@ -1125,27 +1152,7 @@ int crash_shrink_memory(unsigned long new_size)
                goto unlock;
        }
 
-       ram_res = kzalloc(sizeof(*ram_res), GFP_KERNEL);
-       if (!ram_res) {
-               ret = -ENOMEM;
-               goto unlock;
-       }
-
-       ram_res->start = crashk_res.start + new_size;
-       ram_res->end = crashk_res.end;
-       ram_res->flags = IORESOURCE_BUSY | IORESOURCE_SYSTEM_RAM;
-       ram_res->name = "System RAM";
-
-       if (!new_size) {
-               release_resource(&crashk_res);
-               crashk_res.start = 0;
-               crashk_res.end = 0;
-       } else {
-               crashk_res.end = ram_res->start - 1;
-       }
-
-       crash_free_reserved_phys_range(ram_res->start, ram_res->end);
-       insert_resource(&iomem_resource, ram_res);
+       ret = __crash_shrink_memory(&crashk_res, new_size);
 
 unlock:
        kexec_unlock();