From 5725aadb3786d9aadc53ad14bf1fef07fa822d5c Mon Sep 17 00:00:00 2001 From: marius Date: Wed, 15 Jun 2011 22:41:55 +0000 Subject: Don't include curcpu in the mask which is used as the IPI cookie as we have to ignore it when sending the IPI anyway. Actually I can't think of a good reason why this ever was done that way in the first place as it's not even usefull for debugging. While at it replace the use of pc_other_cpus as it's slated for deorbit. --- sys/sparc64/include/smp.h | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/sys/sparc64/include/smp.h b/sys/sparc64/include/smp.h index 1ba0d9e..a519e01 100644 --- a/sys/sparc64/include/smp.h +++ b/sys/sparc64/include/smp.h @@ -1,5 +1,6 @@ /*- * Copyright (c) 2001 Jake Burkholder. + * Copyright (c) 2007 - 2011 Marius Strobl * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -136,8 +137,11 @@ extern char tl_ipi_tlb_range_demap[]; static __inline void ipi_all_but_self(u_int ipi) { + cpuset_t cpus; - cpu_ipi_selected(PCPU_GET(other_cpus), 0, (u_long)tl_ipi_level, ipi); + cpus = all_cpus; + CPU_CLR(PCPU_GET(cpuid), &cpus); + cpu_ipi_selected(cpus, 0, (u_long)tl_ipi_level, ipi); } static __inline void @@ -167,8 +171,9 @@ ipi_dcache_page_inval(void *func, vm_paddr_t pa) ica = &ipi_cache_args; mtx_lock_spin(&ipi_mtx); ica->ica_mask = all_cpus; + CPU_CLR(PCPU_GET(cpuid), &ica->ica_mask); ica->ica_pa = pa; - cpu_ipi_selected(PCPU_GET(other_cpus), 0, (u_long)func, (u_long)ica); + cpu_ipi_selected(ica->ica_mask, 0, (u_long)func, (u_long)ica); return (&ica->ica_mask); } @@ -183,8 +188,9 @@ ipi_icache_page_inval(void *func, vm_paddr_t pa) ica = &ipi_cache_args; mtx_lock_spin(&ipi_mtx); ica->ica_mask = all_cpus; + CPU_CLR(PCPU_GET(cpuid), &ica->ica_mask); ica->ica_pa = pa; - cpu_ipi_selected(PCPU_GET(other_cpus), 0, (u_long)func, (u_long)ica); + cpu_ipi_selected(ica->ica_mask, 0, (u_long)func, (u_long)ica); return (&ica->ica_mask); } @@ -198,8 +204,7 @@ ipi_rd(u_int cpu, void *func, u_long *val) sched_pin(); ira = &ipi_rd_args; mtx_lock_spin(&ipi_mtx); - ira->ira_mask = PCPU_GET(cpumask); - CPU_SET(cpu, &ira->ira_mask); + CPU_SETOF(cpu, &ira->ira_mask); ira->ira_val = val; cpu_ipi_single(cpu, 0, (u_long)func, (u_long)ira); return (&ira->ira_mask); @@ -215,7 +220,8 @@ ipi_tlb_context_demap(struct pmap *pm) return (NULL); sched_pin(); cpus = pm->pm_active; - CPU_AND(&cpus, PCPU_PTR(other_cpus)); + CPU_AND(&cpus, &all_cpus); + CPU_CLR(PCPU_GET(cpuid), &cpus); if (CPU_EMPTY(&cpus)) { sched_unpin(); return (NULL); @@ -223,7 +229,6 @@ ipi_tlb_context_demap(struct pmap *pm) ita = &ipi_tlb_args; mtx_lock_spin(&ipi_mtx); ita->ita_mask = cpus; - CPU_OR(&ita->ita_mask, PCPU_PTR(cpumask)); ita->ita_pmap = pm; cpu_ipi_selected(cpus, 0, (u_long)tl_ipi_tlb_context_demap, (u_long)ita); @@ -240,7 +245,8 @@ ipi_tlb_page_demap(struct pmap *pm, vm_offset_t va) return (NULL); sched_pin(); cpus = pm->pm_active; - CPU_AND(&cpus, PCPU_PTR(other_cpus)); + CPU_AND(&cpus, &all_cpus); + CPU_CLR(PCPU_GET(cpuid), &cpus); if (CPU_EMPTY(&cpus)) { sched_unpin(); return (NULL); @@ -248,7 +254,6 @@ ipi_tlb_page_demap(struct pmap *pm, vm_offset_t va) ita = &ipi_tlb_args; mtx_lock_spin(&ipi_mtx); ita->ita_mask = cpus; - CPU_OR(&ita->ita_mask, PCPU_PTR(cpumask)); ita->ita_pmap = pm; ita->ita_va = va; cpu_ipi_selected(cpus, 0, (u_long)tl_ipi_tlb_page_demap, (u_long)ita); @@ -265,7 +270,8 @@ ipi_tlb_range_demap(struct pmap *pm, vm_offset_t start, vm_offset_t end) return (NULL); sched_pin(); cpus = pm->pm_active; - CPU_AND(&cpus, PCPU_PTR(other_cpus)); + CPU_AND(&cpus, &all_cpus); + CPU_CLR(PCPU_GET(cpuid), &cpus); if (CPU_EMPTY(&cpus)) { sched_unpin(); return (NULL); @@ -273,7 +279,6 @@ ipi_tlb_range_demap(struct pmap *pm, vm_offset_t start, vm_offset_t end) ita = &ipi_tlb_args; mtx_lock_spin(&ipi_mtx); ita->ita_mask = cpus; - CPU_OR(&ita->ita_mask, PCPU_PTR(cpumask)); ita->ita_pmap = pm; ita->ita_start = start; ita->ita_end = end; @@ -288,7 +293,6 @@ ipi_wait(void *cookie) volatile cpuset_t *mask; if ((mask = cookie) != NULL) { - CPU_NAND_ATOMIC(mask, PCPU_PTR(cpumask)); while (!CPU_EMPTY(mask)) ; mtx_unlock_spin(&ipi_mtx); -- cgit v1.1