Commit bf8be1c3 authored by Jiri Bohac's avatar Jiri Bohac Committed by Andrew Morton
Browse files

x86: implement crashkernel cma reservation

Implement the crashkernel CMA reservation for x86:
- enable parsing of the cma suffix by parse_crashkernel()
- reserve memory with reserve_crashkernel_cma()
- add the CMA-reserved ranges to the e820 map for the crash kernel
- exclude the CMA-reserved ranges from vmcore

Link: https://lkml.kernel.org/r/aEqp1LD2og4QeBw9@dwarf.suse.cz


Signed-off-by: default avatarJiri Bohac <jbohac@suse.cz>
Cc: Baoquan He <bhe@redhat.com>
Cc: Dave Young <dyoung@redhat.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Donald Dutile <ddutile@redhat.com>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Philipp Rudo <prudo@redhat.com>
Cc: Pingfan Liu <piliu@redhat.com>
Cc: Tao Liu <ltao@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent e1280f30
Loading
Loading
Loading
Loading
+22 −4
Original line number Diff line number Diff line
@@ -163,10 +163,10 @@ static struct crash_mem *fill_up_crash_elf_data(void)
		return NULL;

	/*
	 * Exclusion of crash region and/or crashk_low_res may cause
	 * another range split. So add extra two slots here.
	 * Exclusion of crash region, crashk_low_res and/or crashk_cma_ranges
	 * may cause range splits. So add extra slots here.
	 */
	nr_ranges += 2;
	nr_ranges += 2 + crashk_cma_cnt;
	cmem = vzalloc(struct_size(cmem, ranges, nr_ranges));
	if (!cmem)
		return NULL;
@@ -184,6 +184,7 @@ static struct crash_mem *fill_up_crash_elf_data(void)
static int elf_header_exclude_ranges(struct crash_mem *cmem)
{
	int ret = 0;
	int i;

	/* Exclude the low 1M because it is always reserved */
	ret = crash_exclude_mem_range(cmem, 0, SZ_1M - 1);
@@ -198,10 +199,19 @@ static int elf_header_exclude_ranges(struct crash_mem *cmem)
	if (crashk_low_res.end)
		ret = crash_exclude_mem_range(cmem, crashk_low_res.start,
					      crashk_low_res.end);
	if (ret)
		return ret;

	for (i = 0; i < crashk_cma_cnt; ++i) {
		ret = crash_exclude_mem_range(cmem, crashk_cma_ranges[i].start,
					      crashk_cma_ranges[i].end);
		if (ret)
			return ret;
	}

	return 0;
}

static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg)
{
	struct crash_mem *cmem = arg;
@@ -374,6 +384,14 @@ int crash_setup_memmap_entries(struct kimage *image, struct boot_params *params)
		add_e820_entry(params, &ei);
	}

	for (i = 0; i < crashk_cma_cnt; ++i) {
		ei.addr = crashk_cma_ranges[i].start;
		ei.size = crashk_cma_ranges[i].end -
			  crashk_cma_ranges[i].start + 1;
		ei.type = E820_TYPE_RAM;
		add_e820_entry(params, &ei);
	}

out:
	vfree(cmem);
	return ret;
+3 −2
Original line number Diff line number Diff line
@@ -599,7 +599,7 @@ static void __init memblock_x86_reserve_range_setup_data(void)

static void __init arch_reserve_crashkernel(void)
{
	unsigned long long crash_base, crash_size, low_size = 0;
	unsigned long long crash_base, crash_size, low_size = 0, cma_size = 0;
	bool high = false;
	int ret;

@@ -608,7 +608,7 @@ static void __init arch_reserve_crashkernel(void)

	ret = parse_crashkernel(boot_command_line, memblock_phys_mem_size(),
				&crash_size, &crash_base,
				&low_size, NULL, &high);
				&low_size, &cma_size, &high);
	if (ret)
		return;

@@ -618,6 +618,7 @@ static void __init arch_reserve_crashkernel(void)
	}

	reserve_crashkernel_generic(crash_size, crash_base, low_size, high);
	reserve_crashkernel_cma(cma_size);
}

static struct resource standard_io_resources[] = {