diff options
author | Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> | 2016-11-29 07:45:47 -0500 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-11-30 07:14:57 -0500 |
commit | 60fe3910bb029e3671ce7ac080a7acb7e032b9e0 (patch) | |
tree | 89bd58b4985af7713e59f34933c11a450b1677fa /kernel/kexec_file.c | |
parent | 0ab5171b8971282d7562b77f9b14137a827117fc (diff) |
kexec_file: Allow arch-specific memory walking for kexec_add_buffer
Allow architectures to specify a different memory walking function for
kexec_add_buffer. x86 uses iomem to track reserved memory ranges, but
PowerPC uses the memblock subsystem.
Signed-off-by: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
Acked-by: Dave Young <dyoung@redhat.com>
Acked-by: Balbir Singh <bsingharora@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'kernel/kexec_file.c')
-rw-r--r-- | kernel/kexec_file.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 037c321c5618..f865674bff51 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c | |||
@@ -428,6 +428,27 @@ static int locate_mem_hole_callback(u64 start, u64 end, void *arg) | |||
428 | return locate_mem_hole_bottom_up(start, end, kbuf); | 428 | return locate_mem_hole_bottom_up(start, end, kbuf); |
429 | } | 429 | } |
430 | 430 | ||
431 | /** | ||
432 | * arch_kexec_walk_mem - call func(data) on free memory regions | ||
433 | * @kbuf: Context info for the search. Also passed to @func. | ||
434 | * @func: Function to call for each memory region. | ||
435 | * | ||
436 | * Return: The memory walk will stop when func returns a non-zero value | ||
437 | * and that value will be returned. If all free regions are visited without | ||
438 | * func returning non-zero, then zero will be returned. | ||
439 | */ | ||
440 | int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, | ||
441 | int (*func)(u64, u64, void *)) | ||
442 | { | ||
443 | if (kbuf->image->type == KEXEC_TYPE_CRASH) | ||
444 | return walk_iomem_res_desc(crashk_res.desc, | ||
445 | IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, | ||
446 | crashk_res.start, crashk_res.end, | ||
447 | kbuf, func); | ||
448 | else | ||
449 | return walk_system_ram_res(0, ULONG_MAX, kbuf, func); | ||
450 | } | ||
451 | |||
431 | /* | 452 | /* |
432 | * Helper function for placing a buffer in a kexec segment. This assumes | 453 | * Helper function for placing a buffer in a kexec segment. This assumes |
433 | * that kexec_mutex is held. | 454 | * that kexec_mutex is held. |
@@ -474,14 +495,7 @@ int kexec_add_buffer(struct kimage *image, char *buffer, unsigned long bufsz, | |||
474 | kbuf->top_down = top_down; | 495 | kbuf->top_down = top_down; |
475 | 496 | ||
476 | /* Walk the RAM ranges and allocate a suitable range for the buffer */ | 497 | /* Walk the RAM ranges and allocate a suitable range for the buffer */ |
477 | if (image->type == KEXEC_TYPE_CRASH) | 498 | ret = arch_kexec_walk_mem(kbuf, locate_mem_hole_callback); |
478 | ret = walk_iomem_res_desc(crashk_res.desc, | ||
479 | IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, | ||
480 | crashk_res.start, crashk_res.end, kbuf, | ||
481 | locate_mem_hole_callback); | ||
482 | else | ||
483 | ret = walk_system_ram_res(0, -1, kbuf, | ||
484 | locate_mem_hole_callback); | ||
485 | if (ret != 1) { | 499 | if (ret != 1) { |
486 | /* A suitable memory range could not be found for buffer */ | 500 | /* A suitable memory range could not be found for buffer */ |
487 | return -EADDRNOTAVAIL; | 501 | return -EADDRNOTAVAIL; |