summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/include/smp.h
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2010-08-08 00:09:22 +0000
committermarius <marius@FreeBSD.org>2010-08-08 00:09:22 +0000
commit68af74e7b381973f6d4a73db790ef572d6e1b388 (patch)
tree0bf6b363db2f70acc3c831cf99cd2ab5a5c59e07 /sys/sparc64/include/smp.h
parent8a9a5f2db29769e70049747f3ca37cf4449c1fba (diff)
downloadFreeBSD-src-68af74e7b381973f6d4a73db790ef572d6e1b388.zip
FreeBSD-src-68af74e7b381973f6d4a73db790ef572d6e1b388.tar.gz
- Introduce a cpu_ipi_single() function pointer in order to send IPIs
to single CPUs more efficiently with Cheetah(-class) and Jalapeno CPUs. Besides being used to implement the ipi_cpu() introduced in r210939, cpu_ipi_single() will also be used internally by the sparc64 MD code. - Factor out the Jalapeno support from the Cheetah IPI send functions in order to be able to more easily and efficiently implement support for more than 32 target CPUs as well as a workaround for Cheetah+ erratum 25 for the latter.
Diffstat (limited to 'sys/sparc64/include/smp.h')
-rw-r--r--sys/sparc64/include/smp.h11
1 files changed, 5 insertions, 6 deletions
diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h
index 315e5f6..dcefabf 100644
--- a/sys/sparc64/include/smp.h
+++ b/sys/sparc64/include/smp.h
@@ -98,6 +98,8 @@ void cpu_mp_shutdown(void);
typedef void cpu_ipi_selected_t(u_int, u_long, u_long, u_long);
extern cpu_ipi_selected_t *cpu_ipi_selected;
+typedef void cpu_ipi_single_t(u_int, u_long, u_long, u_long);
+extern cpu_ipi_single_t *cpu_ipi_single;
void mp_init(u_int cpu_impl);
@@ -139,11 +141,7 @@ static __inline void
ipi_cpu(int cpu, u_int ipi)
{
- /*
- * XXX: Not ideal, but would require more work to add a cpu_ipi_cpu
- * function pointer.
- */
- cpu_ipi_selected(1 << cpu, 0, (u_long)tl_ipi_level, ipi);
+ cpu_ipi_single(cpu, 0, (u_long)tl_ipi_level, ipi);
}
#if defined(_MACHINE_PMAP_H_) && defined(_SYS_MUTEX_H_)
@@ -243,7 +241,8 @@ ipi_tlb_range_demap(struct pmap *pm, vm_offset_t start, vm_offset_t end)
ita->ita_pmap = pm;
ita->ita_start = start;
ita->ita_end = end;
- cpu_ipi_selected(cpus, 0, (u_long)tl_ipi_tlb_range_demap, (u_long)ita);
+ cpu_ipi_selected(cpus, 0, (u_long)tl_ipi_tlb_range_demap,
+ (u_long)ita);
return (&ita->ita_mask);
}
OpenPOWER on IntegriCloud