- Fix divide-by-zero panic when SMP kernel is used on UP system[1].

- Avoid possible divide-by-zero panic on SMP system when the CPUID is
disabled, unsupported, or buggy.

Submitted by:	pluknet (pluknet at gmail dot com)[1]
This commit is contained in:
Jung-uk Kim 2009-04-30 22:10:04 +00:00
parent 54b43614e7
commit 788399cbd9
2 changed files with 14 additions and 2 deletions

View File

@ -292,6 +292,10 @@ topo_probe_0x4(void)
static void static void
topo_probe(void) topo_probe(void)
{ {
static int cpu_topo_probed = 0;
if (cpu_topo_probed)
return;
logical_cpus = logical_cpus_mask = 0; logical_cpus = logical_cpus_mask = 0;
if (cpu_high >= 0xb) if (cpu_high >= 0xb)
@ -299,9 +303,10 @@ topo_probe(void)
else if (cpu_high) else if (cpu_high)
topo_probe_0x4(); topo_probe_0x4();
if (cpu_cores == 0) if (cpu_cores == 0)
cpu_cores = mp_ncpus; cpu_cores = mp_ncpus > 0 ? mp_ncpus : 1;
if (cpu_logical == 0) if (cpu_logical == 0)
cpu_logical = 1; cpu_logical = 1;
cpu_topo_probed = 1;
} }
struct cpu_group * struct cpu_group *
@ -313,6 +318,7 @@ cpu_topo(void)
* Determine whether any threading flags are * Determine whether any threading flags are
* necessry. * necessry.
*/ */
topo_probe();
if (cpu_logical > 1 && hyperthreading_cpus) if (cpu_logical > 1 && hyperthreading_cpus)
cg_flags = CG_FLAG_HTT; cg_flags = CG_FLAG_HTT;
else if (cpu_logical > 1) else if (cpu_logical > 1)

View File

@ -345,6 +345,10 @@ topo_probe_0x4(void)
static void static void
topo_probe(void) topo_probe(void)
{ {
static int cpu_topo_probed = 0;
if (cpu_topo_probed)
return;
logical_cpus = logical_cpus_mask = 0; logical_cpus = logical_cpus_mask = 0;
if (cpu_high >= 0xb) if (cpu_high >= 0xb)
@ -352,9 +356,10 @@ topo_probe(void)
else if (cpu_high) else if (cpu_high)
topo_probe_0x4(); topo_probe_0x4();
if (cpu_cores == 0) if (cpu_cores == 0)
cpu_cores = mp_ncpus; cpu_cores = mp_ncpus > 0 ? mp_ncpus : 1;
if (cpu_logical == 0) if (cpu_logical == 0)
cpu_logical = 1; cpu_logical = 1;
cpu_topo_probed = 1;
} }
struct cpu_group * struct cpu_group *
@ -366,6 +371,7 @@ cpu_topo(void)
* Determine whether any threading flags are * Determine whether any threading flags are
* necessry. * necessry.
*/ */
topo_probe();
if (cpu_logical > 1 && hyperthreading_cpus) if (cpu_logical > 1 && hyperthreading_cpus)
cg_flags = CG_FLAG_HTT; cg_flags = CG_FLAG_HTT;
else if (cpu_logical > 1) else if (cpu_logical > 1)