|
@@ -999,6 +999,7 @@ SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments,
|
|
|
kimage_free(xchg(&kexec_crash_image, NULL));
|
|
|
result = kimage_crash_alloc(&image, entry,
|
|
|
nr_segments, segments);
|
|
|
+ crash_map_reserved_pages();
|
|
|
}
|
|
|
if (result)
|
|
|
goto out;
|
|
@@ -1015,6 +1016,8 @@ SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments,
|
|
|
goto out;
|
|
|
}
|
|
|
kimage_terminate(image);
|
|
|
+ if (flags & KEXEC_ON_CRASH)
|
|
|
+ crash_unmap_reserved_pages();
|
|
|
}
|
|
|
/* Install the new kernel, and Uninstall the old */
|
|
|
image = xchg(dest_image, image);
|
|
@@ -1026,6 +1029,18 @@ out:
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Add and remove page tables for crashkernel memory
|
|
|
+ *
|
|
|
+ * Provide an empty default implementation here -- architecture
|
|
|
+ * code may override this
|
|
|
+ */
|
|
|
+void __weak crash_map_reserved_pages(void)
|
|
|
+{}
|
|
|
+
|
|
|
+void __weak crash_unmap_reserved_pages(void)
|
|
|
+{}
|
|
|
+
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
asmlinkage long compat_sys_kexec_load(unsigned long entry,
|
|
|
unsigned long nr_segments,
|
|
@@ -1134,14 +1149,16 @@ int crash_shrink_memory(unsigned long new_size)
|
|
|
goto unlock;
|
|
|
}
|
|
|
|
|
|
- start = roundup(start, PAGE_SIZE);
|
|
|
- end = roundup(start + new_size, PAGE_SIZE);
|
|
|
+ start = roundup(start, KEXEC_CRASH_MEM_ALIGN);
|
|
|
+ end = roundup(start + new_size, KEXEC_CRASH_MEM_ALIGN);
|
|
|
|
|
|
+ crash_map_reserved_pages();
|
|
|
crash_free_reserved_phys_range(end, crashk_res.end);
|
|
|
|
|
|
if ((start == end) && (crashk_res.parent != NULL))
|
|
|
release_resource(&crashk_res);
|
|
|
crashk_res.end = end - 1;
|
|
|
+ crash_unmap_reserved_pages();
|
|
|
|
|
|
unlock:
|
|
|
mutex_unlock(&kexec_mutex);
|