|
@@ -449,6 +449,23 @@ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf,
|
|
|
return walk_system_ram_res(0, ULONG_MAX, kbuf, func);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * kexec_locate_mem_hole - find free memory for the purgatory or the next kernel
|
|
|
+ * @kbuf: Parameters for the memory search.
|
|
|
+ *
|
|
|
+ * On success, kbuf->mem will have the start address of the memory region found.
|
|
|
+ *
|
|
|
+ * Return: 0 on success, negative errno on error.
|
|
|
+ */
|
|
|
+int kexec_locate_mem_hole(struct kexec_buf *kbuf)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = arch_kexec_walk_mem(kbuf, locate_mem_hole_callback);
|
|
|
+
|
|
|
+ return ret == 1 ? 0 : -EADDRNOTAVAIL;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* kexec_add_buffer - place a buffer in a kexec segment
|
|
|
* @kbuf: Buffer contents and memory parameters.
|
|
@@ -489,11 +506,9 @@ int kexec_add_buffer(struct kexec_buf *kbuf)
|
|
|
kbuf->buf_align = max(kbuf->buf_align, PAGE_SIZE);
|
|
|
|
|
|
/* Walk the RAM ranges and allocate a suitable range for the buffer */
|
|
|
- ret = arch_kexec_walk_mem(kbuf, locate_mem_hole_callback);
|
|
|
- if (ret != 1) {
|
|
|
- /* A suitable memory range could not be found for buffer */
|
|
|
- return -EADDRNOTAVAIL;
|
|
|
- }
|
|
|
+ ret = kexec_locate_mem_hole(kbuf);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
/* Found a suitable memory range */
|
|
|
ksegment = &kbuf->image->segment[kbuf->image->nr_segments];
|