smp_call_function() gets called before cpu_online_map is initialized.
In order to tolerate this behavior the following appears to be necessary.
This method of resolving the issue has a precedent in smp_IPI_allbutself().
Cheers,
Bill
===== arch/i386/kernel/smp.c 1.17 vs edited =====
--- 1.17/arch/i386/kernel/smp.c Mon May 20 10:51:17 2002
+++ edited/arch/i386/kernel/smp.c Fri Jun 21 19:37:11 2002
@@ -567,9 +567,9 @@
*/
{
struct call_data_struct data;
- int cpus = num_online_cpus()-1;
+ int cpus = num_online_cpus();
- if (!cpus)
+ if (cpus <= 1)
return 0;
data.func = func;
@@ -586,11 +586,11 @@
send_IPI_allbutself(CALL_FUNCTION_VECTOR);
/* Wait for response */
- while (atomic_read(&data.started) != cpus)
+ while (atomic_read(&data.started) != cpus - 1)
barrier();
if (wait)
- while (atomic_read(&data.finished) != cpus)
+ while (atomic_read(&data.finished) != cpus - 1)
barrier();
spin_unlock(&call_lock);
-
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/
This archive was generated by hypermail 2b29 : Sun Jun 23 2002 - 22:00:25 EST