diff options
| author | Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com> | 2016-11-29 23:45:47 +1100 | 
|---|---|---|
| committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-11-30 23:14:57 +1100 | 
| 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)  	return locate_mem_hole_bottom_up(start, end, kbuf);  } +/** + * arch_kexec_walk_mem - call func(data) on free memory regions + * @kbuf:	Context info for the search. Also passed to @func. + * @func:	Function to call for each memory region. + * + * Return: The memory walk will stop when func returns a non-zero value + * and that value will be returned. If all free regions are visited without + * func returning non-zero, then zero will be returned. + */ +int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, +			       int (*func)(u64, u64, void *)) +{ +	if (kbuf->image->type == KEXEC_TYPE_CRASH) +		return walk_iomem_res_desc(crashk_res.desc, +					   IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, +					   crashk_res.start, crashk_res.end, +					   kbuf, func); +	else +		return walk_system_ram_res(0, ULONG_MAX, kbuf, func); +} +  /*   * Helper function for placing a buffer in a kexec segment. This assumes   * that kexec_mutex is held. @@ -474,14 +495,7 @@ int kexec_add_buffer(struct kimage *image, char *buffer, unsigned long bufsz,  	kbuf->top_down = top_down;  	/* Walk the RAM ranges and allocate a suitable range for the buffer */ -	if (image->type == KEXEC_TYPE_CRASH) -		ret = walk_iomem_res_desc(crashk_res.desc, -				IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, -				crashk_res.start, crashk_res.end, kbuf, -				locate_mem_hole_callback); -	else -		ret = walk_system_ram_res(0, -1, kbuf, -					  locate_mem_hole_callback); +	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; | 
