On Thu, Jan 03, 2013 at 04:48:23PM -0800, Yinghai Lu wrote: > Trampoline code is executed by APs with kernel low mapping. > We need to set trampoline code to EXEC early before we do smp > AP bootings.
"... before we boot the APs." > > Found the problem after switching to #PF handler set page table, > and we do not set initial kernel low mapping with EXEC anymore in "...table, since we do not make initial kernel low mapping executable anymore, in ..." > arch/x86/kernel/head_64.S. > > Change to use early_initcall instead that will make sure tramopline trampoline > will have EXEC set. > > Signed-off-by: Yinghai Lu <ying...@kernel.org> > --- > arch/x86/realmode/init.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c > index 8045026..b96fe6f 100644 > --- a/arch/x86/realmode/init.c > +++ b/arch/x86/realmode/init.c > @@ -111,5 +111,9 @@ static int __init set_real_mode_permissions(void) > > return 0; > } > - > -arch_initcall(set_real_mode_permissions); > +/* > + * Trampoline will be executed by APs with SMP. > + * So we need to set it to EXEC in do_pre_smp_initcalls() at least, > + * and that needs early_initcall(). > + */ > +early_initcall(set_real_mode_permissions); Now you have two conflicting comments, one over set_real_mode_permissions() the one you're adding here. Let's merge them into one (the diff is ontop of your patch). -- diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c index b96fe6f54d2f..9eb0fa95881e 100644 --- a/arch/x86/realmode/init.c +++ b/arch/x86/realmode/init.c @@ -84,10 +84,11 @@ void __init setup_real_mode(void) } /* - * set_real_mode_permissions() gets called very early, to guarantee the - * availability of low memory. This is before the proper kernel page - * tables are set up, so we cannot set page permissions in that - * function. Thus, we use an arch_initcall instead. + * This function gets called very early to guarantee the availability + * of low memory. This is even before the proper kernel page tables are + * set up, so we cannot set page permissions in that function. However, + * trampoline code will be executed by APs so we need it to be marked + * executable at pre-SMP time, thus run it as a early_initcall(). */ static int __init set_real_mode_permissions(void) { @@ -111,9 +112,4 @@ static int __init set_real_mode_permissions(void) return 0; } -/* - * Trampoline will be executed by APs with SMP. - * So we need to set it to EXEC in do_pre_smp_initcalls() at least, - * and that needs early_initcall(). - */ early_initcall(set_real_mode_permissions); -- Regards/Gruss, Boris. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/