Re: [patch] Re: 2.6.16-rc4-mm1 (bugs and lockups)



Hello.

Andrew Morton wrote:
umm, actually it's wrong. i386's smp_prepare_boot_cpu() diddles with
per-cpu memory, and that's not initialised at that stage. See the call to
setup_per_cpu_areas() a few lines later.
So I'll drop that hunk. How important is it in practice?
It was important because it used to fix both the printk and
(completely accidentally!) the boot problem itself.

#ifdef CONFIG_SMP
cpu_set(smp_processor_id(), cpu_online_map); /* comment */
#endif
I don't even think #ifdef is needed. Having that for the UP
case may be useless, yet looks consistent to me.

right there in start_kernel()?
This is enough for printk but not for the boot lockup.
The attached patch is however enough. And it should be
correct, as it is consistent with an UP case.

(That assumes that smp_processor_id() works at that stage. Surely that's
true).
Looking into the arch-specific code, I can see that some
arches evaluate the boot-cpu number by some other means,
not by the smp_processor_id(). Still I am pretty sure the
patch won't hurt them.

With this patch and with the hotfixes, I've got the -mm
kernel working, thanks.

----

Register the boot-cpu in the cpu maps earlier to allow the
early printk to work, and to fix an obscure deadlock at boot.

Signed-off-by: Stas Sergeev <stsp@xxxxxxxx>

--- a/init/main.c 2006-02-21 10:36:04.000000000 +0300
+++ b/init/main.c 2006-02-22 11:30:01.000000000 +0300
@@ -440,6 +440,15 @@
* Activate the first processor.
*/

+static void boot_cpu_init(void)
+{
+ int cpu = smp_processor_id();
+ /* Mark the boot cpu "present", "online" etc for SMP and UP case */
+ cpu_set(cpu, cpu_online_map);
+ cpu_set(cpu, cpu_present_map);
+ cpu_set(cpu, cpu_possible_map);
+}
+
asmlinkage void __init start_kernel(void)
{
char * command_line;
@@ -449,17 +458,13 @@
* enable them
*/
lock_kernel();
+ boot_cpu_init();
page_address_init();
printk(KERN_NOTICE);
printk(linux_banner);
setup_arch(&command_line);
setup_per_cpu_areas();
-
- /*
- * Mark the boot cpu "online" so that it can call console drivers in
- * printk() and can access its per-cpu storage.
- */
- smp_prepare_boot_cpu();
+ smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */

/*
* Set up the scheduler prior starting any interrupts (such as the


Relevant Pages

  • Re: [RFC] Recursive printk
    ... Here is a set of two patches + a demo patch to enable recursive processing ... of a printf format string in vsnprintf, ... didn't go and add strange new semantics to printk. ...
    (Linux-Kernel)
  • Re: [PATCH 0/6] v2: Asynchronous function calls to speed up booting and more
    ... * added a second libata patch to scan the partition tables from inside ... This saves a ton of boot time for my box with 2 sata ... fastboot: Asynchronous function calls to speed up kernel boot ...
    (Linux-Kernel)
  • Re: Problems from tcpip.sys / eventid=2446 patch
    ... If you have not tried so yet see if you can boot into Safe Mode and then do ... a System Restore to a point in time before the patch was applied. ... version from the last windows update patch to this file in june). ...
    (microsoft.public.windowsxp.security_admin)
  • Re: [REGRESSION from 2.6.23-rc8] (was: Re: 2.6.23-rc4-mm1 and -rc6-mm1: boot fai
    ... patch and my collection of suspend patches applied, the box doesn't boot ... It is nothing else than adding "noapictimer" to the ... On i386 the noapictimer option not only disables the local APIC timer, ...
    (Linux-Kernel)
  • Re: BTX loader hangs after version info
    ... Try this patch. ... Specifically, when the boot ... This meant that we could end up invoking BIOS ... it still hangs just before presenting the menu. ...
    (freebsd-stable)