* Overlapping reserved regions at boot
@ 2011-11-29 14:01 Petr Tesarik
2011-12-07 14:22 ` Petr Tesarik
0 siblings, 1 reply; 3+ messages in thread
From: Petr Tesarik @ 2011-11-29 14:01 UTC (permalink / raw)
To: Tony Luck, Fenghua Yu, linux-ia64; +Cc: linux-kernel
Hello,
while working on the upcoming SLES11 SP2, I ran into an issue with booting the
panic kernel on a kernel crash. In the first iteration I found out that the
initial register backing store gets overwritten with zeroes, causing a kernel
crash shortly afterwards.
Further investigation revealed that rsvd_region[] contains overlapping
entries: find_memmap_space() returns a pointer which lies between KERNEL_START
and _end. This is correct with the EFI memmap as patched by the kexec
purgatory code. That code removes vmlinux LOAD segments from the usable map,
but there is a pretty large hole between the gate section and the per-cpu
section.
With the following patch, the panic kernel can boot and save the crash dump.
Signed-off-by: Petr Tesarik <ptesarik@suse.cz>
--- a/arch/ia64/kernel/setup.c
+++ b/arch/ia64/kernel/setup.c
@@ -225,6 +225,23 @@
}
}
+/* merge overlaps */
+static int __init
+merge_regions (struct rsvd_region *rsvd_region, int max)
+{
+ int i;
+ for (i = 1; i < max; ++i) {
+ if (rsvd_region[i].start >= rsvd_region[i-1].end)
+ continue;
+ if (rsvd_region[i].end > rsvd_region[i-1].end)
+ rsvd_region[i-1].end = rsvd_region[i].end;
+ --max;
+ memmove(&rsvd_region[i], &rsvd_region[i+1],
+ (max - i) * sizeof(struct rsvd_region));
+ }
+ return max;
+}
+
/*
* Request address space for all standard resources
*/
@@ -275,6 +292,7 @@
if (ret == 0 && size > 0) {
if (!base) {
sort_regions(rsvd_region, *n);
+ *n = merge_regions(rsvd_region, *n);
base = kdump_find_rsvd_region(size,
rsvd_region, *n);
}
@@ -392,6 +410,7 @@
BUG_ON(IA64_MAX_RSVD_REGIONS + 1 < n);
sort_regions(rsvd_region, num_rsvd_regions);
+ num_rsvd_regions = merge_regions(rsvd_region, num_rsvd_regions);
}
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: Overlapping reserved regions at boot
2011-11-29 14:01 Overlapping reserved regions at boot Petr Tesarik
@ 2011-12-07 14:22 ` Petr Tesarik
2011-12-09 23:10 ` Luck, Tony
0 siblings, 1 reply; 3+ messages in thread
From: Petr Tesarik @ 2011-12-07 14:22 UTC (permalink / raw)
To: Tony Luck; +Cc: Fenghua Yu, linux-ia64, linux-kernel
Dne Út 29. listopadu 2011 15:01:51 Petr Tesarik napsal(a):
> Hello,
>
> while working on the upcoming SLES11 SP2, I ran into an issue with booting
> the panic kernel on a kernel crash. In the first iteration I found out
> that the initial register backing store gets overwritten with zeroes,
> causing a kernel crash shortly afterwards.
>
> Further investigation revealed that rsvd_region[] contains overlapping
> entries: find_memmap_space() returns a pointer which lies between
> KERNEL_START and _end. This is correct with the EFI memmap as patched by
> the kexec purgatory code. That code removes vmlinux LOAD segments from the
> usable map, but there is a pretty large hole between the gate section and
> the per-cpu section.
>
> With the following patch, the panic kernel can boot and save the crash
> dump.
OK guys, I take it that nobody is interested in ia64 any longer, but assuming
that there will probably be no other fix to the issue, can you at least
confirm that the fix is acceptable?
TIA,
Petr Tesarik
> Signed-off-by: Petr Tesarik <ptesarik@suse.cz>
>
> --- a/arch/ia64/kernel/setup.c
> +++ b/arch/ia64/kernel/setup.c
> @@ -225,6 +225,23 @@
> }
> }
>
> +/* merge overlaps */
> +static int __init
> +merge_regions (struct rsvd_region *rsvd_region, int max)
> +{
> + int i;
> + for (i = 1; i < max; ++i) {
> + if (rsvd_region[i].start >= rsvd_region[i-1].end)
> + continue;
> + if (rsvd_region[i].end > rsvd_region[i-1].end)
> + rsvd_region[i-1].end = rsvd_region[i].end;
> + --max;
> + memmove(&rsvd_region[i], &rsvd_region[i+1],
> + (max - i) * sizeof(struct rsvd_region));
> + }
> + return max;
> +}
> +
> /*
> * Request address space for all standard resources
> */
> @@ -275,6 +292,7 @@
> if (ret == 0 && size > 0) {
> if (!base) {
> sort_regions(rsvd_region, *n);
> + *n = merge_regions(rsvd_region, *n);
> base = kdump_find_rsvd_region(size,
> rsvd_region, *n);
> }
> @@ -392,6 +410,7 @@
> BUG_ON(IA64_MAX_RSVD_REGIONS + 1 < n);
>
> sort_regions(rsvd_region, num_rsvd_regions);
> + num_rsvd_regions = merge_regions(rsvd_region, num_rsvd_regions);
> }
^ permalink raw reply [flat|nested] 3+ messages in thread* RE: Overlapping reserved regions at boot
2011-12-07 14:22 ` Petr Tesarik
@ 2011-12-09 23:10 ` Luck, Tony
0 siblings, 0 replies; 3+ messages in thread
From: Luck, Tony @ 2011-12-09 23:10 UTC (permalink / raw)
To: Petr Tesarik
Cc: Yu, Fenghua, linux-ia64@vger.kernel.org,
linux-kernel@vger.kernel.org
> OK guys, I take it that nobody is interested in ia64 any longer, but assuming
> that there will probably be no other fix to the issue, can you at least
> confirm that the fix is acceptable?
Sorry - way behind on my mail list reading.
It might be better to not make the overlap to begin with - but I can see
that would have a rather larger code impact. So this looks good.
Queued for 3.3 merge
-Tony
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-12-09 23:10 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-29 14:01 Overlapping reserved regions at boot Petr Tesarik
2011-12-07 14:22 ` Petr Tesarik
2011-12-09 23:10 ` Luck, Tony
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox