"Martin J. Bligh" wrote: > > > I'm working with a (approximately) 2.4.17 kernel from the mips-linux > > tree (oss.sgi.com). > > > > I'd like to propose removing the "__init" designation from init_idle in > > kernel/sched.c, since this is called from rest_init via cpu_idle. > > Notice that rest_init isn't in an init section, and explicitly mentions > > that it's avoiding a race with free_initmem. In my kernel (an SMP > > kernel running on a system with only 1 available CPU), cpu_idle isn't > > getting called until after free_initmem(). > > > > My CPU is MIPS, but it looks like x86 could experience the same problem. > > I fixed something in this area for x86, looks like the same code path > for MIPS unless I'm misreading. > > smp_init spins waiting on wait_init_idle until every cpu has done > init_idle. rest_init() isn't called until smp_init returns, so I'm not sure > how you could hit this (possibly there's a minute window after init_idle > clears the bit, but before it returns?). This synchronization doesn't help: cpu0 (even in the multi-cpu case) calls init_idle twice -- once from smp_init (through smp_boot_cpus), and then again from cpu_idle. In my failing case (CONFIG_SMP=y, but only 1 cpu in the system) the second call, the one from cpu_idle, doesn't happen until long after the init kernel thread has been running and has freed the initmem. Maybe a better fix is to avoid this double calling of init_idle for the "master" CPU? From my reading the code, x86 seems to behave the same. Kip