kexec: add machine_kexec_post_load()
It is the same as machine_kexec_prepare(), but is called after segments are loaded. This way, can do processing work with already loaded relocation segments. One such example is arm64: it has to have segments loaded in order to create a page table, but it cannot do it during kexec time, because at that time allocations won't be possible anymore. Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> Acked-by: Dave Young <dyoung@redhat.com> Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
d42cc530b1
commit
de68e4daea
|
@ -159,6 +159,10 @@ static int do_kexec_load(unsigned long entry, unsigned long nr_segments,
|
|||
|
||||
kimage_terminate(image);
|
||||
|
||||
ret = machine_kexec_post_load(image);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* Install the new kernel and uninstall the old */
|
||||
image = xchg(dest_image, image);
|
||||
|
||||
|
|
|
@ -589,6 +589,12 @@ static void kimage_free_extra_pages(struct kimage *image)
|
|||
kimage_free_page_list(&image->unusable_pages);
|
||||
|
||||
}
|
||||
|
||||
int __weak machine_kexec_post_load(struct kimage *image)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void kimage_terminate(struct kimage *image)
|
||||
{
|
||||
if (*image->entry != 0)
|
||||
|
|
|
@ -441,6 +441,10 @@ SYSCALL_DEFINE5(kexec_file_load, int, kernel_fd, int, initrd_fd,
|
|||
|
||||
kimage_terminate(image);
|
||||
|
||||
ret = machine_kexec_post_load(image);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Free up any temporary buffers allocated which are not needed
|
||||
* after image has been loaded
|
||||
|
|
|
@ -13,6 +13,8 @@ void kimage_terminate(struct kimage *image);
|
|||
int kimage_is_destination_range(struct kimage *image,
|
||||
unsigned long start, unsigned long end);
|
||||
|
||||
int machine_kexec_post_load(struct kimage *image);
|
||||
|
||||
extern struct mutex kexec_mutex;
|
||||
|
||||
#ifdef CONFIG_KEXEC_FILE
|
||||
|
|
Loading…
Reference in New Issue