summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2006-04-03 23:56:40 +0000
committermarcel <marcel@FreeBSD.org>2006-04-03 23:56:40 +0000
commitd28296b1997414783d48aaa593aa4c5ddc5dadb8 (patch)
treed83eb2cb1460e030cba6d488851c8ffcc5bfc21f /sys/ia64
parent8278e2d5fbf3b90494b259664803d77b2c5c2a96 (diff)
downloadFreeBSD-src-d28296b1997414783d48aaa593aa4c5ddc5dadb8.zip
FreeBSD-src-d28296b1997414783d48aaa593aa4c5ddc5dadb8.tar.gz
Improve handling of IPI_STOP:
o use atomic operations to fiddle with stopped_cpus and started_cpus. o disable interrupts while we're waiting to be started. o remove logic relating to cpustop_restartfunc as it's not used.
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/interrupt.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/sys/ia64/ia64/interrupt.c b/sys/ia64/ia64/interrupt.c
index dbd3d68..423cd86 100644
--- a/sys/ia64/ia64/interrupt.c
+++ b/sys/ia64/ia64/interrupt.c
@@ -220,20 +220,17 @@ interrupt(u_int64_t vector, struct trapframe *tf)
CTR1(KTR_SMP, "IPI_RENDEZVOUS, cpuid=%d", PCPU_GET(cpuid));
smp_rendezvous_action();
} else if (vector == ipi_vector[IPI_STOP]) {
- u_int32_t mybit = PCPU_GET(cpumask);
+ register_t intr;
+ cpumask_t mybit = PCPU_GET(cpumask);
- CTR1(KTR_SMP, "IPI_STOP, cpuid=%d", PCPU_GET(cpuid));
+ intr = intr_disable();
savectx(PCPU_GET(pcb));
- stopped_cpus |= mybit;
+ atomic_set_int(&stopped_cpus, mybit);
while ((started_cpus & mybit) == 0)
/* spin */;
- started_cpus &= ~mybit;
- stopped_cpus &= ~mybit;
- if (PCPU_GET(cpuid) == 0 && cpustop_restartfunc != NULL) {
- void (*f)(void) = cpustop_restartfunc;
- cpustop_restartfunc = NULL;
- (*f)();
- }
+ atomic_clear_int(&started_cpus, mybit);
+ atomic_clear_int(&stopped_cpus, mybit);
+ intr_restore(intr);
} else if (vector == ipi_vector[IPI_TEST]) {
CTR1(KTR_SMP, "IPI_TEST, cpuid=%d", PCPU_GET(cpuid));
mp_ipi_test++;
OpenPOWER on IntegriCloud