summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/include/smp.h
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2002-12-22 20:50:23 +0000
committerjake <jake@FreeBSD.org>2002-12-22 20:50:23 +0000
commit02d82494717cab163d9865b5886923be8b7412ff (patch)
treed45e59df844abe5565f5ea76c12ac842b67521a1 /sys/sparc64/include/smp.h
parenta658b7f4f99cc87b1f1118c9f2a7944afb3998f5 (diff)
downloadFreeBSD-src-02d82494717cab163d9865b5886923be8b7412ff.zip
FreeBSD-src-02d82494717cab163d9865b5886923be8b7412ff.tar.gz
- Add a spin lock to single thread cache invalidation and tlb flush ipis,
which allows ipis to be sent outside of Giant. - Remove the ap boot mutex, which is unused.
Diffstat (limited to 'sys/sparc64/include/smp.h')
-rw-r--r--sys/sparc64/include/smp.h18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h
index b892976..270244b 100644
--- a/sys/sparc64/include/smp.h
+++ b/sys/sparc64/include/smp.h
@@ -84,9 +84,9 @@ void ipi_all_but_self(u_int ipi);
vm_offset_t mp_tramp_alloc(void);
-extern struct ipi_cache_args ipi_cache_args;
-extern struct ipi_level_args ipi_level_args;
-extern struct ipi_tlb_args ipi_tlb_args;
+extern struct mtx ipi_mtx;
+extern struct ipi_cache_args ipi_cache_args;
+extern struct ipi_tlb_args ipi_tlb_args;
extern vm_offset_t mp_tramp;
extern char *mp_tramp_code;
@@ -105,6 +105,8 @@ extern char tl_ipi_tlb_range_demap[];
#ifdef SMP
+#if defined(_MACHINE_PMAP_H_) && defined(_SYS_MUTEX_H_)
+
static __inline void *
ipi_dcache_page_inval(vm_offset_t pa)
{
@@ -113,6 +115,7 @@ ipi_dcache_page_inval(vm_offset_t pa)
if (smp_cpus == 1)
return (NULL);
ica = &ipi_cache_args;
+ mtx_lock_spin(&ipi_mtx);
ica->ica_mask = all_cpus;
ica->ica_pa = pa;
cpu_ipi_selected(PCPU_GET(other_cpus), 0,
@@ -128,6 +131,7 @@ ipi_icache_page_inval(vm_offset_t pa)
if (smp_cpus == 1)
return (NULL);
ica = &ipi_cache_args;
+ mtx_lock_spin(&ipi_mtx);
ica->ica_mask = all_cpus;
ica->ica_pa = pa;
cpu_ipi_selected(PCPU_GET(other_cpus), 0,
@@ -135,8 +139,6 @@ ipi_icache_page_inval(vm_offset_t pa)
return (&ica->ica_mask);
}
-#ifdef _MACHINE_PMAP_H_
-
static __inline void *
ipi_tlb_context_demap(struct pmap *pm)
{
@@ -148,6 +150,7 @@ ipi_tlb_context_demap(struct pmap *pm)
if ((cpus = (pm->pm_active & PCPU_GET(other_cpus))) == 0)
return (NULL);
ita = &ipi_tlb_args;
+ mtx_lock_spin(&ipi_mtx);
ita->ita_mask = cpus | PCPU_GET(cpumask);
ita->ita_pmap = pm;
cpu_ipi_selected(cpus, 0, (u_long)tl_ipi_tlb_context_demap,
@@ -166,6 +169,7 @@ ipi_tlb_page_demap(struct pmap *pm, vm_offset_t va)
if ((cpus = (pm->pm_active & PCPU_GET(other_cpus))) == 0)
return (NULL);
ita = &ipi_tlb_args;
+ mtx_lock_spin(&ipi_mtx);
ita->ita_mask = cpus | PCPU_GET(cpumask);
ita->ita_pmap = pm;
ita->ita_va = va;
@@ -184,6 +188,7 @@ ipi_tlb_range_demap(struct pmap *pm, vm_offset_t start, vm_offset_t end)
if ((cpus = (pm->pm_active & PCPU_GET(other_cpus))) == 0)
return (NULL);
ita = &ipi_tlb_args;
+ mtx_lock_spin(&ipi_mtx);
ita->ita_mask = cpus | PCPU_GET(cpumask);
ita->ita_pmap = pm;
ita->ita_start = start;
@@ -201,10 +206,11 @@ ipi_wait(void *cookie)
atomic_clear_int(mask, PCPU_GET(cpumask));
while (*mask != 0)
;
+ mtx_unlock_spin(&ipi_mtx);
}
}
-#endif
+#endif /* _MACHINE_PMAP_H_ && _SYS_MUTEX_H_ */
#else
OpenPOWER on IntegriCloud