Skip to content

Commit 6ecd016

Browse files
hbathinimpe
authored andcommitted
powerpc/kexec_file: Add appropriate regions for memory reserve map
While initrd, elfcorehdr and backup regions are already added to the reserve map, there are a few missing regions that need to be added to the memory reserve map. Add them here. And now that all the changes to load panic kernel are in place, claim likewise. Signed-off-by: Hari Bathini <[email protected]> Tested-by: Pingfan Liu <[email protected]> Reviewed-by: Thiago Jung Bauermann <[email protected]> Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/159602300473.575379.4218568032039284448.stgit@hbathini
1 parent cb350c1 commit 6ecd016

File tree

1 file changed

+53
-5
lines changed

1 file changed

+53
-5
lines changed

arch/powerpc/kexec/file_load_64.c

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,34 @@ static int get_crash_memory_ranges(struct crash_mem **mem_ranges)
205205
return ret;
206206
}
207207

208+
/**
209+
* get_reserved_memory_ranges - Get reserve memory ranges. This list includes
210+
* memory regions that should be added to the
211+
* memory reserve map to ensure the region is
212+
* protected from any mischief.
213+
* @mem_ranges: Range list to add the memory ranges to.
214+
*
215+
* Returns 0 on success, negative errno on error.
216+
*/
217+
static int get_reserved_memory_ranges(struct crash_mem **mem_ranges)
218+
{
219+
int ret;
220+
221+
ret = add_rtas_mem_range(mem_ranges);
222+
if (ret)
223+
goto out;
224+
225+
ret = add_tce_mem_ranges(mem_ranges);
226+
if (ret)
227+
goto out;
228+
229+
ret = add_reserved_mem_ranges(mem_ranges);
230+
out:
231+
if (ret)
232+
pr_err("Failed to setup reserved memory ranges\n");
233+
return ret;
234+
}
235+
208236
/**
209237
* __locate_mem_hole_top_down - Looks top down for a large enough memory hole
210238
* in the memory regions between buf_min & buf_max
@@ -897,8 +925,8 @@ int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
897925
unsigned long initrd_load_addr,
898926
unsigned long initrd_len, const char *cmdline)
899927
{
900-
struct crash_mem *umem = NULL;
901-
int ret;
928+
struct crash_mem *umem = NULL, *rmem = NULL;
929+
int i, nr_ranges, ret;
902930

903931
ret = setup_new_fdt(image, fdt, initrd_load_addr, initrd_len, cmdline);
904932
if (ret)
@@ -941,7 +969,27 @@ int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
941969
}
942970
}
943971

972+
/* Update memory reserve map */
973+
ret = get_reserved_memory_ranges(&rmem);
974+
if (ret)
975+
goto out;
976+
977+
nr_ranges = rmem ? rmem->nr_ranges : 0;
978+
for (i = 0; i < nr_ranges; i++) {
979+
u64 base, size;
980+
981+
base = rmem->ranges[i].start;
982+
size = rmem->ranges[i].end - base + 1;
983+
ret = fdt_add_mem_rsv(fdt, base, size);
984+
if (ret) {
985+
pr_err("Error updating memory reserve map: %s\n",
986+
fdt_strerror(ret));
987+
goto out;
988+
}
989+
}
990+
944991
out:
992+
kfree(rmem);
945993
kfree(umem);
946994
return ret;
947995
}
@@ -1024,10 +1072,10 @@ int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
10241072

10251073
/* Get exclude memory ranges needed for setting up kdump segments */
10261074
ret = get_exclude_memory_ranges(&(image->arch.exclude_ranges));
1027-
if (ret)
1075+
if (ret) {
10281076
pr_err("Failed to setup exclude memory ranges for buffer lookup\n");
1029-
/* Return this until all changes for panic kernel are in */
1030-
return -EOPNOTSUPP;
1077+
return ret;
1078+
}
10311079
}
10321080

10331081
return kexec_image_probe_default(image, buf, buf_len);

0 commit comments

Comments
 (0)