Re: [PATCH] x86: revert "x86: Fix S4 regression"

From: Takao Indoh
Date: Mon Jul 16 2012 - 23:19:16 EST


Hi Cong,

When I tested kdump with 3.5.0-rc6 kernel, I found a problem of kdump
kernel's panic in find_early_table_space().

init_memory_mapping: [mem 0x00000000-0x36ffafff]
Kernel panic - not syncing: Cannot find space for the kernel page tables
Pid: 0, comm: swapper Not tainted 3.5.0-rc6 #17
Call Trace:
[<ffffffff8158549b>] panic+0xb8/0x1c8
[<ffffffff8158565d>] ? printk+0x48/0x4a
[<ffffffff8157304c>] init_memory_mapping+0x46c/0x530
[<ffffffff818a73c7>] setup_arch+0x669/0xb0e
[<ffffffff8158565d>] ? printk+0x48/0x4a
[<ffffffff818a3a1f>] start_kernel+0x9b/0x34a
[<ffffffff818a332d>] x86_64_start_reservations+0x131/0x136
[<ffffffff818a341f>] x86_64_start_kernel+0xed/0xf4

In find_early_table_space(), a kernel tries to find free area below 512M
for pgtable using memblock_find_in_range, but it fails because kdump
kernel does not have enough free space below 512M due to the memmap
restriction. This is the memmap option specified against kdump kernel
when crashkernel=128M.

memmap=560K@64K memmap=130492K@770608K

Only 560KB area is available and it is not sufficient for pgtable (it
seems that about 1.8MB area is needed for pgtable). This problem is
fixed by your revert patch. I hope this patch gets merged.

Thanks,
Takao Indoh

(2012/06/12 14:21), Cong Wang wrote:
> From: Cong Wang <xiyou.wangcong@xxxxxxxxx>
>
> This reverts the following commit:
>
> commit 8548c84da2f47e71bbbe300f55edb768492575f7
> Author: Takashi Iwai <tiwai@xxxxxxx>
> Date: Sun Oct 23 23:19:12 2011 +0200
>
> x86: Fix S4 regression
>
> Commit 4b239f458 ("x86-64, mm: Put early page table high") causes a S4
> regression since 2.6.39, namely the machine reboots occasionally at S4
> resume. It doesn't happen always, overall rate is about 1/20. But,
> like other bugs, once when this happens, it continues to happen.
>
> This patch fixes the problem by essentially reverting the memory
> assignment in the older way.
>
> According to the previous discussion:
> http://marc.info/?l=linux-kernel&m=133161674120253&w=2
> it seems that so far the best solution is just reverting it.
>
> Takashi, could you help to test if the S4 regression is still
> there after this patch?
>
> Reported-by: CAI Qian <caiqian@xxxxxxxxxx>
> Cc: Dave Young <dyoung@xxxxxxxxxx>
> Cc: "H. Peter Anvin" <hpa@xxxxxxxxx>
> Cc: Rafael J. Wysocki <rjw@xxxxxxx>
> Cc: Yinghai Lu <yinghai.lu@xxxxxxxxxx>
> Cc: Takashi Iwai <tiwai@xxxxxxx>
> Signed-off-by: Cong Wang <xiyou.wangcong@xxxxxxxxx>
>
> ---
> arch/x86/mm/init.c | 3 ++-
> 1 files changed, 2 insertions(+), 1 deletions(-)
>
> diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
> index bc4e9d8..7ab7975 100644
> --- a/arch/x86/mm/init.c
> +++ b/arch/x86/mm/init.c
> @@ -74,8 +74,9 @@ static void __init find_early_table_space(struct map_range *mr, unsigned long en
> #ifdef CONFIG_X86_32
> /* for fixmap */
> tables += roundup(__end_of_fixed_addresses * sizeof(pte_t), PAGE_SIZE);
> -#endif
> +
> good_end = max_pfn_mapped << PAGE_SHIFT;
> +#endif
>
> base = memblock_find_in_range(start, good_end, tables, PAGE_SIZE);
> if (!base)
>
[ 0.000000] Linux version 3.5.0-rc6 (root@localhost) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #17 SMP Thu Jul 12 13:49:46 JST 2012
[ 0.000000] Command line: ro root=UUID=1893a13e-19af-439b-9d39-0a42260f3eaa rd_NO_LUKS rd_NO_MD KEYBOARDTYPE=pc KEYTABLE=jp106 LANG=ja_JP.UTF-8 rd_NO_LVM rd_NO_DM loglevel=7 earlyprintk=serial,ttyS0,19200n8 irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off memmap=exactmap memmap=560K@64K memmap=130492K@770608K elfcorehdr=901100K memmap=64K$0K memmap=16K$624K memmap=112K$912K memmap=32832K$3103360K memmap=40K#3136192K memmap=4K#3136232K memmap=9492K$3136236K memmap=262144K$3670016K memmap=1024K$4173824K memmap=4K$4175872K memmap=17408K$4176896K
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000100-0x000000000009bfff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009c000-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e4000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bd69ffff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000bd6a0000-0x00000000bf6affff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000bf6b0000-0x00000000bf6b9fff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x00000000bf6ba000-0x00000000bf6bafff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x00000000bf6bb000-0x00000000bfffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fecfffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000ffa00000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000043fffffff] usable
[ 0.000000] bootconsole [earlyser0] enabled
[ 0.000000] e820: last_pfn = 0x440000 max_arch_pfn = 0x400000000
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] e820: user-defined physical RAM map:
[ 0.000000] user: [mem 0x0000000000000000-0x000000000000ffff] reserved
[ 0.000000] user: [mem 0x0000000000010000-0x000000000009bfff] usable
[ 0.000000] user: [mem 0x000000000009c000-0x000000000009ffff] reserved
[ 0.000000] user: [mem 0x00000000000e4000-0x00000000000fffff] reserved
[ 0.000000] user: [mem 0x000000002f08c000-0x0000000036ffafff] usable
[ 0.000000] user: [mem 0x00000000bd6a0000-0x00000000bf6affff] reserved
[ 0.000000] user: [mem 0x00000000bf6b0000-0x00000000bf6bafff] ACPI data
[ 0.000000] user: [mem 0x00000000bf6bb000-0x00000000bfffffff] reserved
[ 0.000000] user: [mem 0x00000000e0000000-0x00000000efffffff] reserved
[ 0.000000] user: [mem 0x00000000fec00000-0x00000000fecfffff] reserved
[ 0.000000] user: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] user: [mem 0x00000000fef00000-0x00000000ffffffff] reserved
[ 0.000000] DMI present.
[ 0.000000] No AGP bridge found
[ 0.000000] e820: last_pfn = 0x36ffb max_arch_pfn = 0x400000000
[ 0.000000] x86 PAT enabled: cpu 0, old 0x7010600070106, new 0x7010600070106
[ 0.000000] found SMP MP-table at [mem 0x000f7ef0-0x000f7eff] mapped at [ffff8800000f7ef0]
[ 0.000000] Using GB pages for direct mapping
[ 0.000000] init_memory_mapping: [mem 0x00000000-0x36ffafff]
[ 0.000000] Kernel panic - not syncing: Cannot find space for the kernel page tables
[ 0.000000] Pid: 0, comm: swapper Not tainted 3.5.0-rc6 #17
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff8158549b>] panic+0xb8/0x1c8
[ 0.000000] [<ffffffff8158565d>] ? printk+0x48/0x4a
[ 0.000000] [<ffffffff8157304c>] init_memory_mapping+0x46c/0x530
[ 0.000000] [<ffffffff818a73c7>] setup_arch+0x669/0xb0e
[ 0.000000] [<ffffffff8158565d>] ? printk+0x48/0x4a
[ 0.000000] [<ffffffff818a3a1f>] start_kernel+0x9b/0x34a
[ 0.000000] [<ffffffff818a332d>] x86_64_start_reservations+0x131/0x136
[ 0.000000] [<ffffffff818a341f>] x86_64_start_kernel+0xed/0xf4
PANIC: early exception 0d rip 10:ffffffff8158556d error 77b cr2 0
[ 0.000000] Pid: 0, comm: swapper Not tainted 3.5.0-rc6 #17
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff8158556d>] ? panic+0x18a/0x1c8
[ 0.000000] [<ffffffff818a3184>] early_idt_handler+0x64/0x94
[ 0.000000] [<ffffffff8158556d>] ? panic+0x18a/0x1c8
[ 0.000000] [<ffffffff815854d0>] ? panic+0xed/0x1c8
[ 0.000000] [<ffffffff8158565d>] ? printk+0x48/0x4a
[ 0.000000] [<ffffffff8157304c>] init_memory_mapping+0x46c/0x530
[ 0.000000] [<ffffffff818a73c7>] setup_arch+0x669/0xb0e
[ 0.000000] [<ffffffff8158565d>] ? printk+0x48/0x4a
[ 0.000000] [<ffffffff818a3a1f>] start_kernel+0x9b/0x34a
[ 0.000000] [<ffffffff818a332d>] x86_64_start_reservations+0x131/0x136
[ 0.000000] [<ffffffff818a341f>] x86_64_start_kernel+0xed/0xf4
[ 0.000000] RIP 0x0