Commit de68e4da authored by Pavel Tatashin's avatar Pavel Tatashin Committed by Will Deacon
Browse files

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: default avatarPavel Tatashin <pasha.tatashin@soleen.com>
Acked-by: default avatarDave Young <dyoung@redhat.com>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent d42cc530
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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);

+6 −0
Original line number Diff line number Diff line
@@ -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)
+4 −0
Original line number Diff line number Diff line
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -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