* linux-next: reservetop fix disables mem=
@ 2009-08-24 16:45 Hugh Dickins
2009-08-24 17:38 ` Yinghai Lu
0 siblings, 1 reply; 15+ messages in thread
From: Hugh Dickins @ 2009-08-24 16:45 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Xiao Guangrong, Andrew Morton, yinghai, linux-kernel
I find the "mem=" boot parameter disabled in today's linux-next:
reverting the tip commit below fixes that.
Hugh
From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Date: Thu, 20 Aug 2009 12:23:11 +0000 (+0800)
Subject: x86: Fix system crash when loading with "reservetop" parameter
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fmingo%2Flinux-2.6-x86.git;a=commitdiff_plain;h=8126dec32738421afa362114337331337b4be17f
x86: Fix system crash when loading with "reservetop" parameter
The system will die if the kernel is booted with "reservetop"
parameter, in present code, parse "reservetop" parameter after
early_ioremap_init(), and some function still use
early_ioremap() after it.
The problem is, "reservetop" parameter can modify
'FIXADDR_TOP', then the virtual address got by early_ioremap()
is base on old 'FIXADDR_TOP', but the page mapping is base on
new 'FIXADDR_TOP', it will occur page fault, and the IDT is not
prepare yet, so, the system is dead.
So, put parse_early_param() in the front of
early_ioremap_init() in this patch.
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: yinghai@kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>
LKML-Reference: <4A8D402F.4080805@cn.fujitsu.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 63f32d2..02643cc 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -711,6 +711,11 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_INFO "Command line: %s\n", boot_command_line);
#endif
+ strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
+ *cmdline_p = command_line;
+
+ parse_early_param();
+
/* VMI may relocate the fixmap; do this before touching ioremap area */
vmi_init();
@@ -793,11 +798,6 @@ void __init setup_arch(char **cmdline_p)
#endif
#endif
- strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
- *cmdline_p = command_line;
-
- parse_early_param();
-
#ifdef CONFIG_X86_64
check_efer();
#endif
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-08-24 16:45 linux-next: reservetop fix disables mem= Hugh Dickins
@ 2009-08-24 17:38 ` Yinghai Lu
2009-08-24 18:27 ` Ingo Molnar
2009-08-26 1:13 ` linux-next: reservetop fix disables mem= Xiao Guangrong
0 siblings, 2 replies; 15+ messages in thread
From: Yinghai Lu @ 2009-08-24 17:38 UTC (permalink / raw)
To: Hugh Dickins, Ingo Molnar, Linus Torvalds, Zachary Amsden,
H. Peter Anvin
Cc: Xiao Guangrong, Andrew Morton, linux-kernel
Hugh Dickins wrote:
> I find the "mem=" boot parameter disabled in today's linux-next:
> reverting the tip commit below fixes that.
>
> Hugh
>
> From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> Date: Thu, 20 Aug 2009 12:23:11 +0000 (+0800)
> Subject: x86: Fix system crash when loading with "reservetop" parameter
> X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fmingo%2Flinux-2.6-x86.git;a=commitdiff_plain;h=8126dec32738421afa362114337331337b4be17f
>
> x86: Fix system crash when loading with "reservetop" parameter
>
> The system will die if the kernel is booted with "reservetop"
> parameter, in present code, parse "reservetop" parameter after
> early_ioremap_init(), and some function still use
> early_ioremap() after it.
>
> The problem is, "reservetop" parameter can modify
> 'FIXADDR_TOP', then the virtual address got by early_ioremap()
> is base on old 'FIXADDR_TOP', but the page mapping is base on
> new 'FIXADDR_TOP', it will occur page fault, and the IDT is not
> prepare yet, so, the system is dead.
>
> So, put parse_early_param() in the front of
> early_ioremap_init() in this patch.
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> Cc: yinghai@kernel.org
> Cc: Andrew Morton <akpm@linux-foundation.org>
> LKML-Reference: <4A8D402F.4080805@cn.fujitsu.com>
> Signed-off-by: Ingo Molnar <mingo@elte.hu>
> ---
>
> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> index 63f32d2..02643cc 100644
> --- a/arch/x86/kernel/setup.c
> +++ b/arch/x86/kernel/setup.c
> @@ -711,6 +711,11 @@ void __init setup_arch(char **cmdline_p)
> printk(KERN_INFO "Command line: %s\n", boot_command_line);
> #endif
>
> + strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
> + *cmdline_p = command_line;
> +
> + parse_early_param();
> +
> /* VMI may relocate the fixmap; do this before touching ioremap area */
> vmi_init();
>
> @@ -793,11 +798,6 @@ void __init setup_arch(char **cmdline_p)
> #endif
> #endif
>
> - strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
> - *cmdline_p = command_line;
> -
> - parse_early_param();
> -
> #ifdef CONFIG_X86_64
> check_efer();
> #endif
yes, that patch will break other built-in command too.
need drop that patch.
also the problem was caused by vmi patch, and that commit should be reverted.
commit ae8d04e2ecbb233926860e9ce145eac19c7835dc
Author: Zachary Amsden <zach@vmware.com>
Date: Sat Dec 13 12:36:58 2008 -0800
x86 Fix VMI crash on boot in 2.6.28-rc8
VMI initialiation can relocate the fixmap, causing early_ioremap to
malfunction if it is initialized before the relocation. To fix this,
VMI activation is split into two phases; the detection, which must
happen before setting up ioremap, and the activation, which must happen
after parsing early boot parameters.
This fixes a crash on boot when VMI is enabled under VMware.
Signed-off-by: Zachary Amsden <zach@vmware.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 9d5674f..bdec76e 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -794,6 +794,9 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_INFO "Command line: %s\n", boot_command_line);
#endif
+ /* VMI may relocate the fixmap; do this before touching ioremap area */
+ vmi_init();
+
early_cpu_init();
early_ioremap_init();
@@ -880,13 +883,8 @@ void __init setup_arch(char **cmdline_p)
check_efer();
#endif
-#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
- /*
- * Must be before kernel pagetables are setup
- * or fixmap area is touched.
- */
- vmi_init();
-#endif
+ /* Must be before kernel pagetables are setup */
+ vmi_activate();
/* after early param, so could get panic from serial */
reserve_early_setup_data();
and according to
http://lkml.org/lkml/2008/12/10/388
http://lkml.org/lkml/2008/12/10/456
Zachary should split reserve_top_address() to two functions... before sending that patch to Linus
YH
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-08-24 17:38 ` Yinghai Lu
@ 2009-08-24 18:27 ` Ingo Molnar
2009-08-28 19:28 ` Yinghai Lu
` (2 more replies)
2009-08-26 1:13 ` linux-next: reservetop fix disables mem= Xiao Guangrong
1 sibling, 3 replies; 15+ messages in thread
From: Ingo Molnar @ 2009-08-24 18:27 UTC (permalink / raw)
To: Yinghai Lu
Cc: Hugh Dickins, Linus Torvalds, Zachary Amsden, H. Peter Anvin,
Xiao Guangrong, Andrew Morton, linux-kernel
* Yinghai Lu <yinghai@kernel.org> wrote:
> Hugh Dickins wrote:
> > I find the "mem=" boot parameter disabled in today's linux-next:
> > reverting the tip commit below fixes that.
> >
> > Hugh
> >
> > From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> > Date: Thu, 20 Aug 2009 12:23:11 +0000 (+0800)
> > Subject: x86: Fix system crash when loading with "reservetop" parameter
> > X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fmingo%2Flinux-2.6-x86.git;a=commitdiff_plain;h=8126dec32738421afa362114337331337b4be17f
> >
> > x86: Fix system crash when loading with "reservetop" parameter
> >
> > The system will die if the kernel is booted with "reservetop"
> > parameter, in present code, parse "reservetop" parameter after
> > early_ioremap_init(), and some function still use
> > early_ioremap() after it.
> >
> > The problem is, "reservetop" parameter can modify
> > 'FIXADDR_TOP', then the virtual address got by early_ioremap()
> > is base on old 'FIXADDR_TOP', but the page mapping is base on
> > new 'FIXADDR_TOP', it will occur page fault, and the IDT is not
> > prepare yet, so, the system is dead.
> >
> > So, put parse_early_param() in the front of
> > early_ioremap_init() in this patch.
> >
> > Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> > Cc: yinghai@kernel.org
> > Cc: Andrew Morton <akpm@linux-foundation.org>
> > LKML-Reference: <4A8D402F.4080805@cn.fujitsu.com>
> > Signed-off-by: Ingo Molnar <mingo@elte.hu>
> > ---
> >
> > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> > index 63f32d2..02643cc 100644
> > --- a/arch/x86/kernel/setup.c
> > +++ b/arch/x86/kernel/setup.c
> > @@ -711,6 +711,11 @@ void __init setup_arch(char **cmdline_p)
> > printk(KERN_INFO "Command line: %s\n", boot_command_line);
> > #endif
> >
> > + strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
> > + *cmdline_p = command_line;
> > +
> > + parse_early_param();
> > +
> > /* VMI may relocate the fixmap; do this before touching ioremap area */
> > vmi_init();
> >
> > @@ -793,11 +798,6 @@ void __init setup_arch(char **cmdline_p)
> > #endif
> > #endif
> >
> > - strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
> > - *cmdline_p = command_line;
> > -
> > - parse_early_param();
> > -
> > #ifdef CONFIG_X86_64
> > check_efer();
> > #endif
>
> yes, that patch will break other built-in command too.
>
> need drop that patch.
done. Was nervous about the patch already:
http://lkml.org/lkml/2009/8/21/127
> also the problem was caused by vmi patch, and that commit should
> be reverted.
>
> commit ae8d04e2ecbb233926860e9ce145eac19c7835dc
> Author: Zachary Amsden <zach@vmware.com>
> Date: Sat Dec 13 12:36:58 2008 -0800
>
> x86 Fix VMI crash on boot in 2.6.28-rc8
>
> VMI initialiation can relocate the fixmap, causing early_ioremap to
> malfunction if it is initialized before the relocation. To fix this,
> VMI activation is split into two phases; the detection, which must
> happen before setting up ioremap, and the activation, which must happen
> after parsing early boot parameters.
>
> This fixes a crash on boot when VMI is enabled under VMware.
>
> Signed-off-by: Zachary Amsden <zach@vmware.com>
> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
>
> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> index 9d5674f..bdec76e 100644
> --- a/arch/x86/kernel/setup.c
> +++ b/arch/x86/kernel/setup.c
> @@ -794,6 +794,9 @@ void __init setup_arch(char **cmdline_p)
> printk(KERN_INFO "Command line: %s\n", boot_command_line);
> #endif
>
> + /* VMI may relocate the fixmap; do this before touching ioremap area */
> + vmi_init();
> +
> early_cpu_init();
> early_ioremap_init();
>
> @@ -880,13 +883,8 @@ void __init setup_arch(char **cmdline_p)
> check_efer();
> #endif
>
> -#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
> - /*
> - * Must be before kernel pagetables are setup
> - * or fixmap area is touched.
> - */
> - vmi_init();
> -#endif
> + /* Must be before kernel pagetables are setup */
> + vmi_activate();
>
> /* after early param, so could get panic from serial */
> reserve_early_setup_data();
>
>
> and according to
> http://lkml.org/lkml/2008/12/10/388
> http://lkml.org/lkml/2008/12/10/456
>
> Zachary should split reserve_top_address() to two functions...
> before sending that patch to Linus
mind looking at this yourself if interested? Zachary has not been
active for quite some time.
Ingo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-08-24 17:38 ` Yinghai Lu
2009-08-24 18:27 ` Ingo Molnar
@ 2009-08-26 1:13 ` Xiao Guangrong
2009-09-01 7:55 ` [RFC][PATCH] x86: introduce parse_early_param_alone() to parse param early (Was Re: linux-next: reservetop fix disables mem= ) Xiao Guangrong
1 sibling, 1 reply; 15+ messages in thread
From: Xiao Guangrong @ 2009-08-26 1:13 UTC (permalink / raw)
To: Yinghai Lu
Cc: Hugh Dickins, Ingo Molnar, Linus Torvalds, Zachary Amsden,
H. Peter Anvin, Xiao Guangrong, Andrew Morton, linux-kernel
Yinghai Lu wrote:
>
> yes, that patch will break other built-in command too.
>
> need drop that patch.
>
Sorry for trouble you all by my stupid patch.
The main problem is that can't parse 'reservetop' and 'mem'/'memmap'
parameters at the same time, because we should parse 'mem'/'memmap'
after e820 map detected, and it might use early_memremap() during
e820 map detecting, so we should call early_ioremap_init() before it,
'reservetop' parameter can change 'FIXADDR_TOP', so we parse
'reservetop' first,
like below sequences:
......
___parse 'reservetop'___ ->
early_ioremap_init() ->
setup_memory_map(); /* might call early_memremap()*/ ->
parse_setup_data(); /* might call early_memremap()*/ ->
e820_reserve_setup_data(); ->
___parse 'mem'/'memmap' and other parameters___
......
(the same as 'early_ioremap_debug' parameter)
So, I'm afraid that we need separate parse 'reservetop'/
'early_ioremap_debug' parameters early
Thanks,
Xiao
> also the problem was caused by vmi patch, and that commit should be reverted.
>
> commit ae8d04e2ecbb233926860e9ce145eac19c7835dc
> Author: Zachary Amsden <zach@vmware.com>
> Date: Sat Dec 13 12:36:58 2008 -0800
>
> x86 Fix VMI crash on boot in 2.6.28-rc8
>
> VMI initialiation can relocate the fixmap, causing early_ioremap to
> malfunction if it is initialized before the relocation. To fix this,
> VMI activation is split into two phases; the detection, which must
> happen before setting up ioremap, and the activation, which must happen
> after parsing early boot parameters.
>
> This fixes a crash on boot when VMI is enabled under VMware.
>
> Signed-off-by: Zachary Amsden <zach@vmware.com>
> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
>
> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> index 9d5674f..bdec76e 100644
> --- a/arch/x86/kernel/setup.c
> +++ b/arch/x86/kernel/setup.c
> @@ -794,6 +794,9 @@ void __init setup_arch(char **cmdline_p)
> printk(KERN_INFO "Command line: %s\n", boot_command_line);
> #endif
>
> + /* VMI may relocate the fixmap; do this before touching ioremap area */
> + vmi_init();
> +
> early_cpu_init();
> early_ioremap_init();
>
> @@ -880,13 +883,8 @@ void __init setup_arch(char **cmdline_p)
> check_efer();
> #endif
>
> -#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
> - /*
> - * Must be before kernel pagetables are setup
> - * or fixmap area is touched.
> - */
> - vmi_init();
> -#endif
> + /* Must be before kernel pagetables are setup */
> + vmi_activate();
>
> /* after early param, so could get panic from serial */
> reserve_early_setup_data();
>
>
> and according to
> http://lkml.org/lkml/2008/12/10/388
> http://lkml.org/lkml/2008/12/10/456
>
> Zachary should split reserve_top_address() to two functions... before sending that patch to Linus
>
>
> YH
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-08-24 18:27 ` Ingo Molnar
@ 2009-08-28 19:28 ` Yinghai Lu
2009-09-06 6:56 ` Yinghai Lu
2009-09-16 0:23 ` Hugh Dickins
2 siblings, 0 replies; 15+ messages in thread
From: Yinghai Lu @ 2009-08-28 19:28 UTC (permalink / raw)
To: Ingo Molnar, Rusty Russell
Cc: Hugh Dickins, Linus Torvalds, Zachary Amsden, H. Peter Anvin,
Xiao Guangrong, Andrew Morton, linux-kernel
Ingo Molnar wrote:
>> and according to
>> http://lkml.org/lkml/2008/12/10/388
>> http://lkml.org/lkml/2008/12/10/456
>>
>> Zachary should split reserve_top_address() to two functions...
>> before sending that patch to Linus
>
> mind looking at this yourself if interested? Zachary has not been
> active for quite some time.
>
other ways is to revive the Rusty Russell's patchset that move paramater early...
YH
^ permalink raw reply [flat|nested] 15+ messages in thread
* [RFC][PATCH] x86: introduce parse_early_param_alone() to parse param early (Was Re: linux-next: reservetop fix disables mem= )
2009-08-26 1:13 ` linux-next: reservetop fix disables mem= Xiao Guangrong
@ 2009-09-01 7:55 ` Xiao Guangrong
2009-09-01 15:17 ` Américo Wang
0 siblings, 1 reply; 15+ messages in thread
From: Xiao Guangrong @ 2009-09-01 7:55 UTC (permalink / raw)
To: Ingo Molnar
Cc: Hugh Dickins, Yinghai Lu, Linus Torvalds, Zachary Amsden,
H. Peter Anvin, Andrew Morton, linux-kernel
Hi Ingo,
I find the broken patch is still in -tip tree:
Commit-ID: 8126dec32738421afa362114337331337b4be17f
Gitweb: http://git.kernel.org/tip/8126dec32738421afa362114337331337b4be17f
Author: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
AuthorDate: Thu, 20 Aug 2009 20:23:11 +0800
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Fri, 21 Aug 2009 16:40:30 +0200
x86: Fix system crash when loading with "reservetop" parameter
So, this patch is base on it.
---------------------------------------------
Subject: [RFC][PATCH] x86: introduce parse_early_param_alone() to parse param before parse_early_param()
Sometimes, we should parse specific boot parameter alone before
parse_early_param(), such as "reservetop" and "early_ioremap_debug",
like below:
> The main problem is that can't parse 'reservetop' and 'mem'/'memmap'
> parameters at the same time, because we should parse 'mem'/'memmap'
> after e820 map detected, and it might use early_memremap() during
> e820 map detecting, so we should call early_ioremap_init() before it,
> 'reservetop' parameter can change 'FIXADDR_TOP', so we parse
> 'reservetop' first,
>
> like below sequences:
> ......
> ___parse 'reservetop'___ ->
> early_ioremap_init() ->
> setup_memory_map(); /* might call early_memremap()*/ ->
> parse_setup_data(); /* might call early_memremap()*/ ->
> e820_reserve_setup_data(); ->
> ___parse 'mem'/'memmap' and other parameters___
> ......
>
> (the same as 'early_ioremap_debug' parameter)
>
> So, I'm afraid that we need separate parse 'reservetop'/
> 'early_ioremap_debug' parameters early
>
This patch introduce a new api named parse_early_param_alone() to
do this.
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
---
arch/x86/kernel/setup.c | 33 ++++++++++++++++++------------
include/linux/init.h | 1 +
init/main.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 71 insertions(+), 13 deletions(-)
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 83ea092..f241c12 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -696,10 +696,28 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_INFO "Command line: %s\n", boot_command_line);
#endif
+#ifdef CONFIG_CMDLINE_BOOL
+#ifdef CONFIG_CMDLINE_OVERRIDE
+ strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+#else
+ if (builtin_cmdline[0]) {
+ /* append boot loader cmdline to builtin */
+ strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
+ strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
+ strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+ }
+#endif
+#endif
+
strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
*cmdline_p = command_line;
- parse_early_param();
+ /*
+ * We should parse "reservetop" and "early_ioremap_debug" before
+ * early_ioremap_init().
+ */
+ parse_early_param_alone("reservetop");
+ parse_early_param_alone("early_ioremap_debug");
/* VMI may relocate the fixmap; do this before touching ioremap area */
vmi_init();
@@ -770,18 +788,7 @@ void __init setup_arch(char **cmdline_p)
bss_resource.start = virt_to_phys(&__bss_start);
bss_resource.end = virt_to_phys(&__bss_stop)-1;
-#ifdef CONFIG_CMDLINE_BOOL
-#ifdef CONFIG_CMDLINE_OVERRIDE
- strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
-#else
- if (builtin_cmdline[0]) {
- /* append boot loader cmdline to builtin */
- strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
- strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
- strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
- }
-#endif
-#endif
+ parse_early_param();
#ifdef CONFIG_X86_64
check_efer();
diff --git a/include/linux/init.h b/include/linux/init.h
index b30f694..4e0082a 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -242,6 +242,7 @@ struct obs_kernel_param {
__setup_param(str, fn, fn, 1)
/* Relies on boot_command_line being set */
+void __init parse_early_param_alone(char * param);
void __init parse_early_param(void);
void __init parse_early_options(char *cmdline);
#endif /* __ASSEMBLY__ */
diff --git a/init/main.c b/init/main.c
index 0ec75ce..d7d155b 100644
--- a/init/main.c
+++ b/init/main.c
@@ -477,6 +477,11 @@ static int __init do_early_param(char *param, char *val)
struct obs_kernel_param *p;
for (p = __setup_start; p < __setup_end; p++) {
+
+ /* Skip it if it has been parsed in do_early_param_alone() */
+ if (unlikely(p->early == -1))
+ continue;
+
if ((p->early && strcmp(param, p->str) == 0) ||
(strcmp(param, "console") == 0 &&
strcmp(p->str, "earlycon") == 0)
@@ -490,6 +495,51 @@ static int __init do_early_param(char *param, char *val)
return 0;
}
+static char *alone_param __initdata;
+
+static int __init do_early_param_alone(char *param, char *val)
+{
+ struct obs_kernel_param *p;
+
+ BUG_ON(!alone_param);
+
+ if (strcmp(param, alone_param))
+ return 0;
+
+ for (p = __setup_start; p < __setup_end; p++) {
+ if (p->early && strcmp(param, p->str) == 0) {
+
+ WARN(p->early != 1, "%s is not a early param or "
+ "it has been parsed\n", p->str);
+
+ if (p->setup_func(val) != 0)
+ printk(KERN_WARNING
+ "Malformed early option '%s'\n", param);
+ /*
+ * Set p->early to -1 to avoid parse_early_param()
+ * and obsolete_checksetup() parse it again.
+ */
+ p->early = -1;
+ }
+ }
+ /* We accept everything at this stage. */
+ return 0;
+}
+
+/*
+ * Parse specific boot parameter alone before parse_early_param().
+ * Note: only early params can do this.
+ */
+void __init parse_early_param_alone(char *param)
+{
+ static __initdata char tmp_cmdline[COMMAND_LINE_SIZE];
+
+ alone_param = param;
+ strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
+ parse_args("early param alone", tmp_cmdline, NULL, 0,
+ do_early_param_alone);
+}
+
void __init parse_early_options(char *cmdline)
{
parse_args("early options", cmdline, NULL, 0, do_early_param);
--
1.6.1.2
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [RFC][PATCH] x86: introduce parse_early_param_alone() to parse param early (Was Re: linux-next: reservetop fix disables mem= )
2009-09-01 7:55 ` [RFC][PATCH] x86: introduce parse_early_param_alone() to parse param early (Was Re: linux-next: reservetop fix disables mem= ) Xiao Guangrong
@ 2009-09-01 15:17 ` Américo Wang
2009-09-03 6:04 ` Xiao Guangrong
0 siblings, 1 reply; 15+ messages in thread
From: Américo Wang @ 2009-09-01 15:17 UTC (permalink / raw)
To: Xiao Guangrong
Cc: Ingo Molnar, Hugh Dickins, Yinghai Lu, Linus Torvalds,
Zachary Amsden, H. Peter Anvin, Andrew Morton, linux-kernel
On Tue, Sep 01, 2009 at 03:55:14PM +0800, Xiao Guangrong wrote:
>Hi Ingo,
>
>I find the broken patch is still in -tip tree:
>
>Commit-ID: 8126dec32738421afa362114337331337b4be17f
>Gitweb: http://git.kernel.org/tip/8126dec32738421afa362114337331337b4be17f
>Author: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
>AuthorDate: Thu, 20 Aug 2009 20:23:11 +0800
>Committer: Ingo Molnar <mingo@elte.hu>
>CommitDate: Fri, 21 Aug 2009 16:40:30 +0200
>
>x86: Fix system crash when loading with "reservetop" parameter
>
>So, this patch is base on it.
>---------------------------------------------
>Subject: [RFC][PATCH] x86: introduce parse_early_param_alone() to parse param before parse_early_param()
>
>Sometimes, we should parse specific boot parameter alone before
>parse_early_param(), such as "reservetop" and "early_ioremap_debug",
>like below:
>
>> The main problem is that can't parse 'reservetop' and 'mem'/'memmap'
>> parameters at the same time, because we should parse 'mem'/'memmap'
>> after e820 map detected, and it might use early_memremap() during
>> e820 map detecting, so we should call early_ioremap_init() before it,
>> 'reservetop' parameter can change 'FIXADDR_TOP', so we parse
>> 'reservetop' first,
>>
>> like below sequences:
>> ......
>> ___parse 'reservetop'___ ->
>> early_ioremap_init() ->
>> setup_memory_map(); /* might call early_memremap()*/ ->
>> parse_setup_data(); /* might call early_memremap()*/ ->
>> e820_reserve_setup_data(); ->
>> ___parse 'mem'/'memmap' and other parameters___
>> ......
>>
>> (the same as 'early_ioremap_debug' parameter)
>>
>> So, I'm afraid that we need separate parse 'reservetop'/
>> 'early_ioremap_debug' parameters early
>>
>
>This patch introduce a new api named parse_early_param_alone() to
>do this.
>
>Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
>---
> arch/x86/kernel/setup.c | 33 ++++++++++++++++++------------
> include/linux/init.h | 1 +
> init/main.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 71 insertions(+), 13 deletions(-)
>
>diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
>index 83ea092..f241c12 100644
>--- a/arch/x86/kernel/setup.c
>+++ b/arch/x86/kernel/setup.c
>@@ -696,10 +696,28 @@ void __init setup_arch(char **cmdline_p)
> printk(KERN_INFO "Command line: %s\n", boot_command_line);
> #endif
>
>+#ifdef CONFIG_CMDLINE_BOOL
>+#ifdef CONFIG_CMDLINE_OVERRIDE
>+ strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
>+#else
>+ if (builtin_cmdline[0]) {
>+ /* append boot loader cmdline to builtin */
>+ strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
>+ strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
>+ strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
>+ }
>+#endif
>+#endif
This seems ugly.
CMDLINE_OVERRIDE depends on CMDLINE_BOOL, right? So the outer #ifdef
can be removed. :)
--
Live like a child, think like the god.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [RFC][PATCH] x86: introduce parse_early_param_alone() to parse param early (Was Re: linux-next: reservetop fix disables mem= )
2009-09-01 15:17 ` Américo Wang
@ 2009-09-03 6:04 ` Xiao Guangrong
0 siblings, 0 replies; 15+ messages in thread
From: Xiao Guangrong @ 2009-09-03 6:04 UTC (permalink / raw)
To: Américo Wang
Cc: Ingo Molnar, Hugh Dickins, Yinghai Lu, Linus Torvalds,
Zachary Amsden, H. Peter Anvin, Andrew Morton, linux-kernel
Américo Wang wrote:
>> +#ifdef CONFIG_CMDLINE_BOOL
>> +#ifdef CONFIG_CMDLINE_OVERRIDE
>> + strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
>> +#else
>> + if (builtin_cmdline[0]) {
>> + /* append boot loader cmdline to builtin */
>> + strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
>> + strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
>> + strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
>> + }
>> +#endif
>> +#endif
>
>
> This seems ugly.
>
> CMDLINE_OVERRIDE depends on CMDLINE_BOOL, right? So the outer #ifdef
> can be removed. :)
>
Thanks for your review, but I think we can't do that.
Yeah, CMDLINE_OVERRIDE depends on CMDLINE_BOOL, but we don't know whether
CONFIG_CMDLINE_BOOL is defined if CONFIG_CMDLINE_OVERRIDE is not defined,
like below:
#ifdef CONFIG_CMDLINE_OVERRIDE
strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
#else
/* There have two cases:
* 1: if CONFIG_CMDLINE_BOOL is defined, it's OK
* 2: if CONFIG_CMDLINE_BOOL is not defined, builtin_cmdline
* is not defined, so, the compiler will complain with it
*/
if (builtin_cmdline[0]) {
/* append boot loader cmdline to builtin */
strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
}
#endif
Thanks,
Xiao
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-08-24 18:27 ` Ingo Molnar
2009-08-28 19:28 ` Yinghai Lu
@ 2009-09-06 6:56 ` Yinghai Lu
2009-09-16 0:23 ` Hugh Dickins
2 siblings, 0 replies; 15+ messages in thread
From: Yinghai Lu @ 2009-09-06 6:56 UTC (permalink / raw)
To: Ingo Molnar
Cc: Hugh Dickins, Linus Torvalds, Zachary Amsden, H. Peter Anvin,
Xiao Guangrong, Andrew Morton, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 5054 bytes --]
On Mon, Aug 24, 2009 at 11:27 AM, Ingo Molnar<mingo@elte.hu> wrote:
>
> * Yinghai Lu <yinghai@kernel.org> wrote:
>
>> Hugh Dickins wrote:
>> > I find the "mem=" boot parameter disabled in today's linux-next:
>> > reverting the tip commit below fixes that.
>> >
>> > Hugh
>> >
>> > From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
>> > Date: Thu, 20 Aug 2009 12:23:11 +0000 (+0800)
>> > Subject: x86: Fix system crash when loading with "reservetop" parameter
>> > X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fmingo%2Flinux-2.6-x86.git;a=commitdiff_plain;h=8126dec32738421afa362114337331337b4be17f
>> >
>> > x86: Fix system crash when loading with "reservetop" parameter
>> >
>> > The system will die if the kernel is booted with "reservetop"
>> > parameter, in present code, parse "reservetop" parameter after
>> > early_ioremap_init(), and some function still use
>> > early_ioremap() after it.
>> >
>> > The problem is, "reservetop" parameter can modify
>> > 'FIXADDR_TOP', then the virtual address got by early_ioremap()
>> > is base on old 'FIXADDR_TOP', but the page mapping is base on
>> > new 'FIXADDR_TOP', it will occur page fault, and the IDT is not
>> > prepare yet, so, the system is dead.
>> >
>> > So, put parse_early_param() in the front of
>> > early_ioremap_init() in this patch.
>> >
>> > Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
>> > Cc: yinghai@kernel.org
>> > Cc: Andrew Morton <akpm@linux-foundation.org>
>> > LKML-Reference: <4A8D402F.4080805@cn.fujitsu.com>
>> > Signed-off-by: Ingo Molnar <mingo@elte.hu>
>> > ---
>> >
>> > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
>> > index 63f32d2..02643cc 100644
>> > --- a/arch/x86/kernel/setup.c
>> > +++ b/arch/x86/kernel/setup.c
>> > @@ -711,6 +711,11 @@ void __init setup_arch(char **cmdline_p)
>> > printk(KERN_INFO "Command line: %s\n", boot_command_line);
>> > #endif
>> >
>> > + strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
>> > + *cmdline_p = command_line;
>> > +
>> > + parse_early_param();
>> > +
>> > /* VMI may relocate the fixmap; do this before touching ioremap area */
>> > vmi_init();
>> >
>> > @@ -793,11 +798,6 @@ void __init setup_arch(char **cmdline_p)
>> > #endif
>> > #endif
>> >
>> > - strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
>> > - *cmdline_p = command_line;
>> > -
>> > - parse_early_param();
>> > -
>> > #ifdef CONFIG_X86_64
>> > check_efer();
>> > #endif
>>
>> yes, that patch will break other built-in command too.
>>
>> need drop that patch.
>
> done. Was nervous about the patch already:
>
> http://lkml.org/lkml/2009/8/21/127
>
>> also the problem was caused by vmi patch, and that commit should
>> be reverted.
>>
>> commit ae8d04e2ecbb233926860e9ce145eac19c7835dc
>> Author: Zachary Amsden <zach@vmware.com>
>> Date: Sat Dec 13 12:36:58 2008 -0800
>>
>> x86 Fix VMI crash on boot in 2.6.28-rc8
>>
>> VMI initialiation can relocate the fixmap, causing early_ioremap to
>> malfunction if it is initialized before the relocation. To fix this,
>> VMI activation is split into two phases; the detection, which must
>> happen before setting up ioremap, and the activation, which must happen
>> after parsing early boot parameters.
>>
>> This fixes a crash on boot when VMI is enabled under VMware.
>>
>> Signed-off-by: Zachary Amsden <zach@vmware.com>
>> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
>>
>> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
>> index 9d5674f..bdec76e 100644
>> --- a/arch/x86/kernel/setup.c
>> +++ b/arch/x86/kernel/setup.c
>> @@ -794,6 +794,9 @@ void __init setup_arch(char **cmdline_p)
>> printk(KERN_INFO "Command line: %s\n", boot_command_line);
>> #endif
>>
>> + /* VMI may relocate the fixmap; do this before touching ioremap area */
>> + vmi_init();
>> +
>> early_cpu_init();
>> early_ioremap_init();
>>
>> @@ -880,13 +883,8 @@ void __init setup_arch(char **cmdline_p)
>> check_efer();
>> #endif
>>
>> -#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
>> - /*
>> - * Must be before kernel pagetables are setup
>> - * or fixmap area is touched.
>> - */
>> - vmi_init();
>> -#endif
>> + /* Must be before kernel pagetables are setup */
>> + vmi_activate();
>>
>> /* after early param, so could get panic from serial */
>> reserve_early_setup_data();
>>
>>
>> and according to
>> http://lkml.org/lkml/2008/12/10/388
>> http://lkml.org/lkml/2008/12/10/456
>>
>> Zachary should split reserve_top_address() to two functions...
>> before sending that patch to Linus
>
> mind looking at this yourself if interested? Zachary has not been
> active for quite some time.
>
please check attached patch...
still need to make early_dbgp and early_console that would use early_ioremap?
YH
[-- Attachment #2: fix_early_param.patch --]
[-- Type: text/x-patch, Size: 6200 bytes --]
[PATCH] x86: fix early_param hanle moved more early
the patch the move early_param_parse early to make reservetop to work again,
it is reported to break mem=...
after close looking, it will break
1. some cpu feature in early stage too, like cpu_has_x2apic
2. will break built-in-command line
3. will break other memmap= and mem=
4. early_dbgp and early_console that will use early_ioremap to access mmio (?)
so try to
1. move early_cpu_init early
2. move built-in-command copying early
3. add userdef_mem_size to remember mem=
. add e820_user to remember memmap
to use userdef_mem_size and e820_user in finalize_map
4: ?
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/kernel/e820.c | 52 ++++++++++++++++++++++++++++++++----------------
arch/x86/kernel/setup.c | 39 ++++++++++++++++++------------------
2 files changed, 55 insertions(+), 36 deletions(-)
Index: linux-2.6/arch/x86/kernel/e820.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/e820.c
+++ linux-2.6/arch/x86/kernel/e820.c
@@ -44,6 +44,7 @@
*/
struct e820map e820;
struct e820map e820_saved;
+static struct e820map e820_user __initdata;
/* For PCI or other memory-mapped resources */
unsigned long pci_mem_start = 0xaeedbabe;
@@ -1227,11 +1228,11 @@ static void early_panic(char *msg)
}
static int userdef __initdata;
+static u64 userdef_mem_size __initdata;
/* "mem=nopentium" disables the 4MB page tables. */
static int __init parse_memopt(char *p)
{
- u64 mem_size;
if (!p)
return -EINVAL;
@@ -1244,13 +1245,13 @@ static int __init parse_memopt(char *p)
#endif
userdef = 1;
- mem_size = memparse(p, &p);
- e820_remove_range(mem_size, ULLONG_MAX - mem_size, E820_RAM, 1);
+ userdef_mem_size = memparse(p, &p);
return 0;
}
early_param("mem", parse_memopt);
+static int userdef_exactmap __initdata;
static int __init parse_memmap_opt(char *p)
{
char *oldp;
@@ -1260,16 +1261,9 @@ static int __init parse_memmap_opt(char
return -EINVAL;
if (!strncmp(p, "exactmap", 8)) {
-#ifdef CONFIG_CRASH_DUMP
- /*
- * If we are doing a crash dump, we still need to know
- * the real mem size before original memory map is
- * reset.
- */
- saved_max_pfn = e820_end_of_ram_pfn();
-#endif
- e820.nr_map = 0;
+ e820_user.nr_map = 0;
userdef = 1;
+ userdef_exactmap = 1;
return 0;
}
@@ -1281,15 +1275,16 @@ static int __init parse_memmap_opt(char
userdef = 1;
if (*p == '@') {
start_at = memparse(p+1, &p);
- e820_add_region(start_at, mem_size, E820_RAM);
+ __e820_add_region(&e820_user, start_at, mem_size, E820_RAM);
} else if (*p == '#') {
start_at = memparse(p+1, &p);
- e820_add_region(start_at, mem_size, E820_ACPI);
+ __e820_add_region(&e820_user, start_at, mem_size, E820_ACPI);
} else if (*p == '$') {
start_at = memparse(p+1, &p);
- e820_add_region(start_at, mem_size, E820_RESERVED);
+ __e820_add_region(&e820_user, start_at, mem_size,
+ E820_RESERVED);
} else
- e820_remove_range(mem_size, ULLONG_MAX - mem_size, E820_RAM, 1);
+ userdef_mem_size = mem_size;
return *p == '\0' ? 0 : -EINVAL;
}
@@ -1298,7 +1293,30 @@ early_param("memmap", parse_memmap_opt);
void __init finish_e820_parsing(void)
{
if (userdef) {
- u32 nr = e820.nr_map;
+ u32 nr;
+
+ if (userdef_exactmap) {
+#ifdef CONFIG_CRASH_DUMP
+ /*
+ * If we are doing a crash dump, we still need to know
+ * the real mem size before original memory map is
+ * reset.
+ */
+ saved_max_pfn = e820_end_of_ram_pfn();
+#endif
+ /* good, just use e820_user instead */
+ memcpy(&e820, &e820_user, sizeof(struct e820map));
+ } else {
+ /* ok, need to append e820_user to e820 */
+ __append_e820_map(e820_user.map, e820_user.nr_map);
+ }
+
+ nr = e820.nr_map;
+
+ if (userdef_mem_size)
+ e820_remove_range(userdef_mem_size,
+ ULLONG_MAX - userdef_mem_size,
+ E820_RAM, 1);
if (sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &nr) < 0)
early_panic("Invalid user supplied memory map");
Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup.c
+++ linux-2.6/arch/x86/kernel/setup.c
@@ -693,13 +693,28 @@ void __init setup_arch(char **cmdline_p)
#ifdef CONFIG_X86_32
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
visws_early_detect();
+#endif
+
+#ifdef CONFIG_CMDLINE_BOOL
+#ifdef CONFIG_CMDLINE_OVERRIDE
+ strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
#else
- printk(KERN_INFO "Command line: %s\n", boot_command_line);
+ if (builtin_cmdline[0]) {
+ /* append boot loader cmdline to builtin */
+ strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
+ strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
+ strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
+ }
+#endif
#endif
+ printk(KERN_INFO "Command line: %s\n", boot_command_line);
+
strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
*cmdline_p = command_line;
+ early_cpu_init();
+
#ifdef CONFIG_X86_64
/*
* Must call this twice: Once just to detect whether hardware doesn't
@@ -712,10 +727,13 @@ void __init setup_arch(char **cmdline_p)
parse_early_param();
+#ifdef CONFIG_X86_64
+ check_efer();
+#endif
+
/* VMI may relocate the fixmap; do this before touching ioremap area */
vmi_init();
- early_cpu_init();
early_ioremap_init();
ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev);
@@ -781,23 +799,6 @@ void __init setup_arch(char **cmdline_p)
bss_resource.start = virt_to_phys(&__bss_start);
bss_resource.end = virt_to_phys(&__bss_stop)-1;
-#ifdef CONFIG_CMDLINE_BOOL
-#ifdef CONFIG_CMDLINE_OVERRIDE
- strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
-#else
- if (builtin_cmdline[0]) {
- /* append boot loader cmdline to builtin */
- strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE);
- strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE);
- strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE);
- }
-#endif
-#endif
-
-#ifdef CONFIG_X86_64
- check_efer();
-#endif
-
/* Must be before kernel pagetables are setup */
vmi_activate();
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-08-24 18:27 ` Ingo Molnar
2009-08-28 19:28 ` Yinghai Lu
2009-09-06 6:56 ` Yinghai Lu
@ 2009-09-16 0:23 ` Hugh Dickins
2009-09-19 17:55 ` Ingo Molnar
2 siblings, 1 reply; 15+ messages in thread
From: Hugh Dickins @ 2009-09-16 0:23 UTC (permalink / raw)
To: Ingo Molnar
Cc: Yinghai Lu, Hugh Dickins, Linus Torvalds, Zachary Amsden,
H. Peter Anvin, Xiao Guangrong, Andrew Morton, linux-kernel
On Mon, 24 Aug 2009, Ingo Molnar wrote:
> * Yinghai Lu <yinghai@kernel.org> wrote:
> > Hugh Dickins wrote:
> > > I find the "mem=" boot parameter disabled in today's linux-next:
> > > reverting the tip commit below fixes that.
> > >
> > > Hugh
> > >
> > > From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> > > Date: Thu, 20 Aug 2009 12:23:11 +0000 (+0800)
> > > Subject: x86: Fix system crash when loading with "reservetop" parameter
> > > X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fmingo%2Flinux-2.6-x86.git;a=commitdiff_plain;h=8126dec32738421afa362114337331337b4be17f
> > >
> > > x86: Fix system crash when loading with "reservetop" parameter
> > >
> > > The system will die if the kernel is booted with "reservetop"
> > > parameter, in present code, parse "reservetop" parameter after
> > > early_ioremap_init(), and some function still use
> > > early_ioremap() after it.
> > >
> > > The problem is, "reservetop" parameter can modify
> > > 'FIXADDR_TOP', then the virtual address got by early_ioremap()
> > > is base on old 'FIXADDR_TOP', but the page mapping is base on
> > > new 'FIXADDR_TOP', it will occur page fault, and the IDT is not
> > > prepare yet, so, the system is dead.
> > >
> > > So, put parse_early_param() in the front of
> > > early_ioremap_init() in this patch.
> > >
> > > Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> > > Cc: yinghai@kernel.org
> > > Cc: Andrew Morton <akpm@linux-foundation.org>
> > > LKML-Reference: <4A8D402F.4080805@cn.fujitsu.com>
> > > Signed-off-by: Ingo Molnar <mingo@elte.hu>
> > > ---
> > >
> > > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> > > index 63f32d2..02643cc 100644
> > > --- a/arch/x86/kernel/setup.c
> > > +++ b/arch/x86/kernel/setup.c
> > > @@ -711,6 +711,11 @@ void __init setup_arch(char **cmdline_p)
> > > printk(KERN_INFO "Command line: %s\n", boot_command_line);
> > > #endif
> > >
> > > + strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
> > > + *cmdline_p = command_line;
> > > +
> > > + parse_early_param();
> > > +
> > > /* VMI may relocate the fixmap; do this before touching ioremap area */
> > > vmi_init();
> > >
> > > @@ -793,11 +798,6 @@ void __init setup_arch(char **cmdline_p)
> > > #endif
> > > #endif
> > >
> > > - strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
> > > - *cmdline_p = command_line;
> > > -
> > > - parse_early_param();
> > > -
> > > #ifdef CONFIG_X86_64
> > > check_efer();
> > > #endif
> >
> > yes, that patch will break other built-in command too.
> >
> > need drop that patch.
>
> done. Was nervous about the patch already:
Somehow it seems to have undropped itself, so mem= stopped working
again in recent mmotm/linux-next; and it looks like today the
undropped patch has made its way to Linus - I've not built current
git to check, but I think you'll find mem= is now broken there.
Hugh
>
> http://lkml.org/lkml/2009/8/21/127
>
> > also the problem was caused by vmi patch, and that commit should
> > be reverted.
> >
> > commit ae8d04e2ecbb233926860e9ce145eac19c7835dc
> > Author: Zachary Amsden <zach@vmware.com>
> > Date: Sat Dec 13 12:36:58 2008 -0800
> >
> > x86 Fix VMI crash on boot in 2.6.28-rc8
> >
> > VMI initialiation can relocate the fixmap, causing early_ioremap to
> > malfunction if it is initialized before the relocation. To fix this,
> > VMI activation is split into two phases; the detection, which must
> > happen before setting up ioremap, and the activation, which must happen
> > after parsing early boot parameters.
> >
> > This fixes a crash on boot when VMI is enabled under VMware.
> >
> > Signed-off-by: Zachary Amsden <zach@vmware.com>
> > Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
> >
> > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> > index 9d5674f..bdec76e 100644
> > --- a/arch/x86/kernel/setup.c
> > +++ b/arch/x86/kernel/setup.c
> > @@ -794,6 +794,9 @@ void __init setup_arch(char **cmdline_p)
> > printk(KERN_INFO "Command line: %s\n", boot_command_line);
> > #endif
> >
> > + /* VMI may relocate the fixmap; do this before touching ioremap area */
> > + vmi_init();
> > +
> > early_cpu_init();
> > early_ioremap_init();
> >
> > @@ -880,13 +883,8 @@ void __init setup_arch(char **cmdline_p)
> > check_efer();
> > #endif
> >
> > -#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
> > - /*
> > - * Must be before kernel pagetables are setup
> > - * or fixmap area is touched.
> > - */
> > - vmi_init();
> > -#endif
> > + /* Must be before kernel pagetables are setup */
> > + vmi_activate();
> >
> > /* after early param, so could get panic from serial */
> > reserve_early_setup_data();
> >
> >
> > and according to
> > http://lkml.org/lkml/2008/12/10/388
> > http://lkml.org/lkml/2008/12/10/456
> >
> > Zachary should split reserve_top_address() to two functions...
> > before sending that patch to Linus
>
> mind looking at this yourself if interested? Zachary has not been
> active for quite some time.
>
> Ingo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-09-16 0:23 ` Hugh Dickins
@ 2009-09-19 17:55 ` Ingo Molnar
2009-09-19 18:02 ` Yinghai Lu
0 siblings, 1 reply; 15+ messages in thread
From: Ingo Molnar @ 2009-09-19 17:55 UTC (permalink / raw)
To: Hugh Dickins
Cc: Yinghai Lu, Linus Torvalds, Zachary Amsden, H. Peter Anvin,
Xiao Guangrong, Andrew Morton, linux-kernel
* Hugh Dickins <hugh.dickins@tiscali.co.uk> wrote:
> On Mon, 24 Aug 2009, Ingo Molnar wrote:
> > * Yinghai Lu <yinghai@kernel.org> wrote:
> > > Hugh Dickins wrote:
> > > > I find the "mem=" boot parameter disabled in today's linux-next:
> > > > reverting the tip commit below fixes that.
> > > >
> > > > Hugh
> > > >
> > > > From: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> > > > Date: Thu, 20 Aug 2009 12:23:11 +0000 (+0800)
> > > > Subject: x86: Fix system crash when loading with "reservetop" parameter
> > > > X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fmingo%2Flinux-2.6-x86.git;a=commitdiff_plain;h=8126dec32738421afa362114337331337b4be17f
> > > >
> > > > x86: Fix system crash when loading with "reservetop" parameter
> > > >
> > > > The system will die if the kernel is booted with "reservetop"
> > > > parameter, in present code, parse "reservetop" parameter after
> > > > early_ioremap_init(), and some function still use
> > > > early_ioremap() after it.
> > > >
> > > > The problem is, "reservetop" parameter can modify
> > > > 'FIXADDR_TOP', then the virtual address got by early_ioremap()
> > > > is base on old 'FIXADDR_TOP', but the page mapping is base on
> > > > new 'FIXADDR_TOP', it will occur page fault, and the IDT is not
> > > > prepare yet, so, the system is dead.
> > > >
> > > > So, put parse_early_param() in the front of
> > > > early_ioremap_init() in this patch.
> > > >
> > > > Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> > > > Cc: yinghai@kernel.org
> > > > Cc: Andrew Morton <akpm@linux-foundation.org>
> > > > LKML-Reference: <4A8D402F.4080805@cn.fujitsu.com>
> > > > Signed-off-by: Ingo Molnar <mingo@elte.hu>
> > > > ---
> > > >
> > > > diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> > > > index 63f32d2..02643cc 100644
> > > > --- a/arch/x86/kernel/setup.c
> > > > +++ b/arch/x86/kernel/setup.c
> > > > @@ -711,6 +711,11 @@ void __init setup_arch(char **cmdline_p)
> > > > printk(KERN_INFO "Command line: %s\n", boot_command_line);
> > > > #endif
> > > >
> > > > + strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
> > > > + *cmdline_p = command_line;
> > > > +
> > > > + parse_early_param();
> > > > +
> > > > /* VMI may relocate the fixmap; do this before touching ioremap area */
> > > > vmi_init();
> > > >
> > > > @@ -793,11 +798,6 @@ void __init setup_arch(char **cmdline_p)
> > > > #endif
> > > > #endif
> > > >
> > > > - strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
> > > > - *cmdline_p = command_line;
> > > > -
> > > > - parse_early_param();
> > > > -
> > > > #ifdef CONFIG_X86_64
> > > > check_efer();
> > > > #endif
> > >
> > > yes, that patch will break other built-in command too.
> > >
> > > need drop that patch.
> >
> > done. Was nervous about the patch already:
>
> Somehow it seems to have undropped itself, so mem= stopped working
> again in recent mmotm/linux-next; and it looks like today the
> undropped patch has made its way to Linus - I've not built current git
> to check, but I think you'll find mem= is now broken there.
I thoroughly zapped it. Do you know about any commit ID where it snuck
in?
Ingo
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-09-19 17:55 ` Ingo Molnar
@ 2009-09-19 18:02 ` Yinghai Lu
2009-09-19 18:07 ` Yinghai Lu
0 siblings, 1 reply; 15+ messages in thread
From: Yinghai Lu @ 2009-09-19 18:02 UTC (permalink / raw)
To: Ingo Molnar
Cc: Hugh Dickins, Linus Torvalds, Zachary Amsden, H. Peter Anvin,
Xiao Guangrong, Andrew Morton, linux-kernel
Ingo Molnar wrote:
> I thoroughly zapped it. Do you know about any commit ID where it snuck
> in?
after close looking, it will break
1. some cpu feature in early stage too, like cpu_has_x2apic
2. will break built-in-command line
3. will break other memmap= and mem=
4. early_dbgp and early_console that will use early_ioremap to access mmio (?)
YH
commit 8126dec32738421afa362114337331337b4be17f
Author: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Date: Thu Aug 20 20:23:11 2009 +0800
x86: Fix system crash when loading with "reservetop" parameter
The system will die if the kernel is booted with "reservetop"
parameter, in present code, parse "reservetop" parameter after
early_ioremap_init(), and some function still use
early_ioremap() after it.
The problem is, "reservetop" parameter can modify
'FIXADDR_TOP', then the virtual address got by early_ioremap()
is base on old 'FIXADDR_TOP', but the page mapping is base on
new 'FIXADDR_TOP', it will occur page fault, and the IDT is not
prepare yet, so, the system is dead.
So, put parse_early_param() in the front of
early_ioremap_init() in this patch.
Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: yinghai@kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>
LKML-Reference: <4A8D402F.4080805@cn.fujitsu.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 63f32d2..02643cc 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -711,6 +711,11 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_INFO "Command line: %s\n", boot_command_line);
#endif
+ strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
+ *cmdline_p = command_line;
+
+ parse_early_param();
+
/* VMI may relocate the fixmap; do this before touching ioremap area */
vmi_init();
@@ -793,11 +798,6 @@ void __init setup_arch(char **cmdline_p)
#endif
#endif
- strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
- *cmdline_p = command_line;
-
- parse_early_param();
-
#ifdef CONFIG_X86_64
check_efer();
#endif
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-09-19 18:02 ` Yinghai Lu
@ 2009-09-19 18:07 ` Yinghai Lu
2009-09-19 18:32 ` Ingo Molnar
2009-09-19 18:33 ` [tip:x86/urgent] Revert 'x86: Fix system crash when loading with "reservetop" parameter' tip-bot for Yinghai Lu
0 siblings, 2 replies; 15+ messages in thread
From: Yinghai Lu @ 2009-09-19 18:07 UTC (permalink / raw)
To: Ingo Molnar
Cc: Hugh Dickins, Linus Torvalds, H. Peter Anvin, Thomas Gleixner,
Andrew Morton, linux-kernel
Yinghai Lu wrote:
> Ingo Molnar wrote:
>> I thoroughly zapped it. Do you know about any commit ID where it snuck
>> in?
>
> after close looking, it will break
> 1. some cpu feature in early stage too, like cpu_has_x2apic
> 2. will break built-in-command line
> 3. will break other memmap= and mem=
> 4. early_dbgp and early_console that will use early_ioremap to access mmio (?)
>
> YH
>
> commit 8126dec32738421afa362114337331337b4be17f
> Author: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> Date: Thu Aug 20 20:23:11 2009 +0800
>
> x86: Fix system crash when loading with "reservetop" parameter
>
> The system will die if the kernel is booted with "reservetop"
> parameter, in present code, parse "reservetop" parameter after
> early_ioremap_init(), and some function still use
> early_ioremap() after it.
>
> The problem is, "reservetop" parameter can modify
> 'FIXADDR_TOP', then the virtual address got by early_ioremap()
> is base on old 'FIXADDR_TOP', but the page mapping is base on
> new 'FIXADDR_TOP', it will occur page fault, and the IDT is not
> prepare yet, so, the system is dead.
>
> So, put parse_early_param() in the front of
> early_ioremap_init() in this patch.
>
> Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
> Cc: yinghai@kernel.org
> Cc: Andrew Morton <akpm@linux-foundation.org>
> LKML-Reference: <4A8D402F.4080805@cn.fujitsu.com>
> Signed-off-by: Ingo Molnar <mingo@elte.hu>
>
after revet it, it seem mem=32g etc still broken, maybe some other commit about x86 platform support from Thomas broke it.
YH
---
arch/x86/kernel/setup.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup.c
+++ linux-2.6/arch/x86/kernel/setup.c
@@ -697,21 +697,6 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_INFO "Command line: %s\n", boot_command_line);
#endif
- strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
- *cmdline_p = command_line;
-
-#ifdef CONFIG_X86_64
- /*
- * Must call this twice: Once just to detect whether hardware doesn't
- * support NX (so that the early EHCI debug console setup can safely
- * call set_fixmap(), and then again after parsing early parameters to
- * honor the respective command line option.
- */
- check_efer();
-#endif
-
- parse_early_param();
-
/* VMI may relocate the fixmap; do this before touching ioremap area */
vmi_init();
@@ -794,6 +779,21 @@ void __init setup_arch(char **cmdline_p)
#endif
#endif
+ strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
+ *cmdline_p = command_line;
+
+#ifdef CONFIG_X86_64
+ /*
+ * Must call this twice: Once just to detect whether hardware doesn't
+ * support NX (so that the early EHCI debug console setup can safely
+ * call set_fixmap(), and then again after parsing early parameters to
+ * honor the respective command line option.
+ */
+ check_efer();
+#endif
+
+ parse_early_param();
+
#ifdef CONFIG_X86_64
check_efer();
#endif
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: linux-next: reservetop fix disables mem=
2009-09-19 18:07 ` Yinghai Lu
@ 2009-09-19 18:32 ` Ingo Molnar
2009-09-19 18:33 ` [tip:x86/urgent] Revert 'x86: Fix system crash when loading with "reservetop" parameter' tip-bot for Yinghai Lu
1 sibling, 0 replies; 15+ messages in thread
From: Ingo Molnar @ 2009-09-19 18:32 UTC (permalink / raw)
To: Yinghai Lu
Cc: Hugh Dickins, Linus Torvalds, H. Peter Anvin, Thomas Gleixner,
Andrew Morton, linux-kernel
* Yinghai Lu <yinghai@kernel.org> wrote:
> Yinghai Lu wrote:
> > Ingo Molnar wrote:
> >> I thoroughly zapped it. Do you know about any commit ID where it snuck
> >> in?
> >
> > after close looking, it will break
> > 1. some cpu feature in early stage too, like cpu_has_x2apic
> > 2. will break built-in-command line
> > 3. will break other memmap= and mem=
> > 4. early_dbgp and early_console that will use early_ioremap to access mmio (?)
thanks Yinghai - i have queued up your revert. Thanks Hugh for noticing
it!
> after revet it, it seem mem=32g etc still broken, maybe some other
> commit about x86 platform support from Thomas broke it.
Thomas?
Ingo
^ permalink raw reply [flat|nested] 15+ messages in thread
* [tip:x86/urgent] Revert 'x86: Fix system crash when loading with "reservetop" parameter'
2009-09-19 18:07 ` Yinghai Lu
2009-09-19 18:32 ` Ingo Molnar
@ 2009-09-19 18:33 ` tip-bot for Yinghai Lu
1 sibling, 0 replies; 15+ messages in thread
From: tip-bot for Yinghai Lu @ 2009-09-19 18:33 UTC (permalink / raw)
To: linux-tip-commits; +Cc: linux-kernel, hpa, mingo, yinghai, tglx, mingo
Commit-ID: eda6da9286ad5b35b1eb70f6368958a8ee41a9dd
Gitweb: http://git.kernel.org/tip/eda6da9286ad5b35b1eb70f6368958a8ee41a9dd
Author: Yinghai Lu <yinghai@kernel.org>
AuthorDate: Sat, 19 Sep 2009 11:07:57 -0700
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Sat, 19 Sep 2009 20:31:33 +0200
Revert 'x86: Fix system crash when loading with "reservetop" parameter'
After close looking, commit 8126dec3 will break:
1. some cpu feature in early stage too, like cpu_has_x2apic
2. will break built-in-command line
3. will break other memmap= and mem=
4. early_dbgp and early_console that will use early_ioremap to access mmio (?)
So revert it.
Reported-by: Hugh Dickins <hugh.dickins@tiscali.co.uk>,
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Cc: Andrew Morton <akpm@linux-foundation.org>,
LKML-Reference: <4AB51DFD.2000904@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
arch/x86/kernel/setup.c | 30 +++++++++++++++---------------
1 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 19f15c4..f5baa2a 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -712,21 +712,6 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_INFO "Command line: %s\n", boot_command_line);
#endif
- strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
- *cmdline_p = command_line;
-
-#ifdef CONFIG_X86_64
- /*
- * Must call this twice: Once just to detect whether hardware doesn't
- * support NX (so that the early EHCI debug console setup can safely
- * call set_fixmap(), and then again after parsing early parameters to
- * honor the respective command line option.
- */
- check_efer();
-#endif
-
- parse_early_param();
-
/* VMI may relocate the fixmap; do this before touching ioremap area */
vmi_init();
@@ -809,6 +794,21 @@ void __init setup_arch(char **cmdline_p)
#endif
#endif
+ strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
+ *cmdline_p = command_line;
+
+#ifdef CONFIG_X86_64
+ /*
+ * Must call this twice: Once just to detect whether hardware doesn't
+ * support NX (so that the early EHCI debug console setup can safely
+ * call set_fixmap(), and then again after parsing early parameters to
+ * honor the respective command line option.
+ */
+ check_efer();
+#endif
+
+ parse_early_param();
+
#ifdef CONFIG_X86_64
check_efer();
#endif
^ permalink raw reply related [flat|nested] 15+ messages in thread
end of thread, other threads:[~2009-09-19 18:34 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-24 16:45 linux-next: reservetop fix disables mem= Hugh Dickins
2009-08-24 17:38 ` Yinghai Lu
2009-08-24 18:27 ` Ingo Molnar
2009-08-28 19:28 ` Yinghai Lu
2009-09-06 6:56 ` Yinghai Lu
2009-09-16 0:23 ` Hugh Dickins
2009-09-19 17:55 ` Ingo Molnar
2009-09-19 18:02 ` Yinghai Lu
2009-09-19 18:07 ` Yinghai Lu
2009-09-19 18:32 ` Ingo Molnar
2009-09-19 18:33 ` [tip:x86/urgent] Revert 'x86: Fix system crash when loading with "reservetop" parameter' tip-bot for Yinghai Lu
2009-08-26 1:13 ` linux-next: reservetop fix disables mem= Xiao Guangrong
2009-09-01 7:55 ` [RFC][PATCH] x86: introduce parse_early_param_alone() to parse param early (Was Re: linux-next: reservetop fix disables mem= ) Xiao Guangrong
2009-09-01 15:17 ` Américo Wang
2009-09-03 6:04 ` Xiao Guangrong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox