void sun4m_cpu_pre_online(void *arg)
{ int cpuid = hard_smp_processor_id();
/* Allow master to continue. The master will then give us the *go-aheadbysettingthesmp_commenced_maskandwillwaitwithout *timeoutsuntiloursetupiscompletedfully(signifiedby *ourbitbeingsetinthecpu_online_mask).
*/
swap_ulong(&cpu_callin_map[cpuid], 1);
/* XXX: What's up with all the flushes? */
local_ops->cache_all();
local_ops->tlb_all();
/* Init receive/complete mapping, plus fire the IPI's off. */
{ registerint i;
cpumask_clear_cpu(smp_processor_id(), &mask);
cpumask_and(&mask, cpu_online_mask, &mask); for (i = 0; i < ncpus; i++) { if (cpumask_test_cpu(i, &mask)) {
ccall_info.processors_in[i] = 0;
ccall_info.processors_out[i] = 0;
sun4m_send_ipi(i, IRQ_CROSS_CALL);
} else {
ccall_info.processors_in[i] = 1;
ccall_info.processors_out[i] = 1;
}
}
}
{ registerint i;
i = 0; do { if (!cpumask_test_cpu(i, &mask)) continue; while (!ccall_info.processors_in[i])
barrier();
} while (++i < ncpus);
i = 0; do { if (!cpumask_test_cpu(i, &mask)) continue; while (!ccall_info.processors_out[i])
barrier();
} while (++i < ncpus);
}
spin_unlock_irqrestore(&cross_call_lock, flags);
}
/* Running cross calls. */ void smp4m_cross_call_irq(void)
{ void (*func)(unsignedlong, unsignedlong, unsignedlong, unsignedlong, unsignedlong) = ccall_info.func; int i = smp_processor_id();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.