summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/include/smp.h
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2013-01-23 22:52:20 +0000
committermarius <marius@FreeBSD.org>2013-01-23 22:52:20 +0000
commit6892c8a3befeed6ac18475f3b47fe5e621c613f2 (patch)
treeb3509aa07c2392071b525e3609bd5d09c8029f06 /sys/sparc64/include/smp.h
parentaf17a55dfd7a008dea74152e32f5d6c803b46bdd (diff)
downloadFreeBSD-src-6892c8a3befeed6ac18475f3b47fe5e621c613f2.zip
FreeBSD-src-6892c8a3befeed6ac18475f3b47fe5e621c613f2.tar.gz
Revert the part of r239864 which removed obtaining the SMP mutex around
reading registers from other CPUs. As it turns out, the hardware doesn't really like concurrent IPI'ing causing adverse effects. Also the thought deadlock when using this spin lock here and the targeted CPU(s) are also holding or in case of nested locks can't actually happen. This is due to the fact that on sparc64, spinlock_enter() only raises the PIL but doesn't disable interrupts completely. Thus direct cross calls as used for the register reading (and all other MD IPI needs) still will be executed by the targeted CPU(s) in that case. MFC after: 3 days
Diffstat (limited to 'sys/sparc64/include/smp.h')
-rw-r--r--sys/sparc64/include/smp.h20
1 files changed, 2 insertions, 18 deletions
diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h
index db17309..2e1110b 100644
--- a/sys/sparc64/include/smp.h
+++ b/sys/sparc64/include/smp.h
@@ -42,6 +42,7 @@
#include <sys/cpuset.h>
#include <sys/proc.h>
#include <sys/sched.h>
+#include <sys/smp.h>
#include <machine/intr_machdep.h>
#include <machine/pcb.h>
@@ -202,6 +203,7 @@ ipi_rd(u_int cpu, void *func, u_long *val)
return (NULL);
sched_pin();
ira = &ipi_rd_args;
+ mtx_lock_spin(&smp_ipi_mtx);
CPU_SETOF(cpu, &ira->ira_mask);
ira->ira_val = val;
cpu_ipi_single(cpu, 0, (u_long)func, (u_long)ira);
@@ -298,18 +300,6 @@ ipi_wait(void *cookie)
}
}
-static __inline void
-ipi_wait_unlocked(void *cookie)
-{
- volatile cpuset_t *mask;
-
- if ((mask = cookie) != NULL) {
- while (!CPU_EMPTY(mask))
- ;
- sched_unpin();
- }
-}
-
#endif /* _MACHINE_PMAP_H_ && _SYS_MUTEX_H_ */
#endif /* !LOCORE */
@@ -368,12 +358,6 @@ ipi_wait(void *cookie __unused)
}
static __inline void
-ipi_wait_unlocked(void *cookie __unused)
-{
-
-}
-
-static __inline void
tl_ipi_cheetah_dcache_page_inval(void)
{
OpenPOWER on IntegriCloud