diff options
author | John Baldwin <jhb@FreeBSD.org> | 2008-09-12 21:07:22 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2008-09-12 21:07:22 +0000 |
commit | 36618d6bfb2182d69c61fcb77cf84d3a44a5ac2b (patch) | |
tree | 65755a9da6b736f70bed22bc3659a0be01b3d6cc | |
parent | c0b37a7029152fb217fbeed1c345a4a79a72c5ad (diff) |
Notes
-rw-r--r-- | sys/kern/subr_smp.c | 22 |
1 files changed, 8 insertions, 14 deletions
diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c index 54e042d2a9bf..f32df2b171db 100644 --- a/sys/kern/subr_smp.c +++ b/sys/kern/subr_smp.c @@ -107,7 +107,7 @@ SYSCTL_INT(_kern_smp, OID_AUTO, forward_roundrobin_enabled, CTLFLAG_RW, "Forwarding of roundrobin to all other CPUs"); /* Variables needed for SMP rendezvous. */ -static volatile cpumask_t smp_rv_cpumask; +static volatile int smp_rv_ncpus; static void (*volatile smp_rv_setup_func)(void *arg); static void (*volatile smp_rv_action_func)(void *arg); static void (*volatile smp_rv_teardown_func)(void *arg); @@ -302,20 +302,14 @@ restart_cpus(cpumask_t map) void smp_rendezvous_action(void) { - cpumask_t map = smp_rv_cpumask; - int i, ncpus = 0; void* local_func_arg = smp_rv_func_arg; void (*local_setup_func)(void*) = smp_rv_setup_func; void (*local_action_func)(void*) = smp_rv_action_func; void (*local_teardown_func)(void*) = smp_rv_teardown_func; - for (i = 0; i < MAXCPU; i++) - if (((1 << i) & map) != 0 && pcpu_find(i) != NULL) - ncpus++; - /* Ensure we have up-to-date values. */ atomic_add_acq_int(&smp_rv_waiters[0], 1); - while (smp_rv_waiters[0] < ncpus) + while (smp_rv_waiters[0] < smp_rv_ncpus) cpu_spinwait(); /* setup function */ @@ -325,7 +319,7 @@ smp_rendezvous_action(void) /* spin on entry rendezvous */ atomic_add_int(&smp_rv_waiters[1], 1); - while (smp_rv_waiters[1] < ncpus) + while (smp_rv_waiters[1] < smp_rv_ncpus) cpu_spinwait(); } @@ -337,7 +331,7 @@ smp_rendezvous_action(void) atomic_add_int(&smp_rv_waiters[2], 1); if (local_teardown_func == smp_no_rendevous_barrier) return; - while (smp_rv_waiters[2] < ncpus) + while (smp_rv_waiters[2] < smp_rv_ncpus) cpu_spinwait(); /* teardown function */ @@ -364,15 +358,15 @@ smp_rendezvous_cpus(cpumask_t map, return; } - for (i = 0; i < MAXCPU; i++) - if (((1 << i) & map) != 0 && pcpu_find(i) != NULL) + for (i = 0; i < mp_maxid; i++) + if (((1 << i) & map) != 0 && !CPU_ABSENT(i)) ncpus++; - + /* obtain rendezvous lock */ mtx_lock_spin(&smp_ipi_mtx); /* set static function pointers */ - smp_rv_cpumask = map; + smp_rv_ncpus = ncpus; smp_rv_setup_func = setup_func; smp_rv_action_func = action_func; smp_rv_teardown_func = teardown_func; |