Index: sys/arch/mips/cavium/octeon_intr.c =================================================================== RCS file: /cvsroot/src/sys/arch/mips/cavium/octeon_intr.c,v retrieving revision 1.7 diff -u -p -r1.7 octeon_intr.c --- sys/arch/mips/cavium/octeon_intr.c 20 Aug 2016 06:31:15 -0000 1.7 +++ sys/arch/mips/cavium/octeon_intr.c 31 Oct 2016 12:12:06 -0000 @@ -74,7 +74,7 @@ static const struct ipl_sr_map octeon_ip [IPL_SOFTNET] = MIPS_SOFT_INT_MASK, [IPL_VM] = MIPS_SOFT_INT_MASK | MIPS_INT_MASK_0, [IPL_SCHED] = MIPS_SOFT_INT_MASK | MIPS_INT_MASK_0 - | MIPS_INT_MASK_5, + | MIPS_INT_MASK_1 | MIPS_INT_MASK_5, [IPL_DDB] = MIPS_SOFT_INT_MASK | MIPS_INT_MASK_0 | MIPS_INT_MASK_1 | MIPS_INT_MASK_5, [IPL_HIGH] = MIPS_INT_MASK, @@ -326,7 +326,7 @@ octeon_intr_init(struct cpu_info *ci) #ifdef MULTIPROCESSOR // Enable the IPIs - cpu->cpu_int0_enable0 |= __BIT(_CIU_INT_MBOX_15_0_SHIFT); + cpu->cpu_int1_enable0 |= __BIT(_CIU_INT_MBOX_15_0_SHIFT); cpu->cpu_int2_enable0 |= __BIT(_CIU_INT_MBOX_31_16_SHIFT); #endif Index: sys/arch/mips/include/cpu.h =================================================================== RCS file: /cvsroot/src/sys/arch/mips/include/cpu.h,v retrieving revision 1.120 diff -u -p -r1.120 cpu.h --- sys/arch/mips/include/cpu.h 16 Jul 2016 01:59:05 -0000 1.120 +++ sys/arch/mips/include/cpu.h 31 Oct 2016 12:12:07 -0000 @@ -150,6 +150,9 @@ struct cpu_info { #define CPUF_RUNNING 0x04 /* CPU is running */ #define CPUF_PAUSED 0x08 /* CPU is paused */ #define CPUF_USERPMAP 0x20 /* CPU has a user pmap activated */ + kcpuset_t *ci_multicastcpus; + kcpuset_t *ci_watchcpus; + kcpuset_t *ci_ddbcpus; #endif }; Index: sys/arch/mips/mips/cpu_subr.c =================================================================== RCS file: /cvsroot/src/sys/arch/mips/mips/cpu_subr.c,v retrieving revision 1.29 diff -u -p -r1.29 cpu_subr.c --- sys/arch/mips/mips/cpu_subr.c 23 Aug 2016 07:29:46 -0000 1.29 +++ sys/arch/mips/mips/cpu_subr.c 31 Oct 2016 12:12:08 -0000 @@ -285,6 +285,10 @@ cpu_attach_common(device_t self, struct * Initialize IPI framework for this cpu instance */ ipi_init(ci); + + kcpuset_create(&ci->ci_multicastcpus, true); + kcpuset_create(&ci->ci_watchcpus, true); + kcpuset_create(&ci->ci_ddbcpus, true); #endif } @@ -659,18 +663,17 @@ void cpu_multicast_ipi(const kcpuset_t *kcp, int tag) { struct cpu_info * const ci = curcpu(); - kcpuset_t *kcp2; + kcpuset_t *kcp2 = ci->ci_multicastcpus; if (kcpuset_match(cpus_running, ci->ci_data.cpu_kcpuset)) return; - kcpuset_clone(&kcp2, kcp); + kcpuset_copy(kcp2, kcp); kcpuset_remove(kcp2, ci->ci_data.cpu_kcpuset); for (cpuid_t cii; (cii = kcpuset_ffs(kcp2)) != 0; ) { kcpuset_clear(kcp2, --cii); (void)cpu_send_ipi(cpu_lookup(cii), tag); } - kcpuset_destroy(kcp2); } int @@ -684,8 +687,8 @@ static void cpu_ipi_wait(const char *s, const kcpuset_t *watchset, const kcpuset_t *wanted) { bool done = false; - kcpuset_t *kcp; - kcpuset_create(&kcp, false); + struct cpu_info * const ci = curcpu(); + kcpuset_t *kcp = ci->ci_watchcpus; /* some finite amount of time */ @@ -708,8 +711,6 @@ cpu_ipi_wait(const char *s, const kcpuse printf("\n"); } } - - kcpuset_destroy(kcp); } /* @@ -797,19 +798,17 @@ void cpu_pause_others(void) { struct cpu_info * const ci = curcpu(); - kcpuset_t *kcp; - if (cold || kcpuset_match(cpus_running, ci->ci_data.cpu_kcpuset)) return; - kcpuset_clone(&kcp, cpus_running); + kcpuset_t *kcp = ci->ci_ddbcpus; + + kcpuset_copy(kcp, cpus_running); kcpuset_remove(kcp, ci->ci_data.cpu_kcpuset); kcpuset_remove(kcp, cpus_paused); cpu_broadcast_ipi(IPI_SUSPEND); cpu_ipi_wait("pause", cpus_paused, kcp); - - kcpuset_destroy(kcp); } /* @@ -818,19 +817,17 @@ cpu_pause_others(void) void cpu_resume(cpuid_t cii) { - kcpuset_t *kcp; - if (__predict_false(cold)) return; - kcpuset_create(&kcp, true); + struct cpu_info * const ci = curcpu(); + kcpuset_t *kcp = ci->ci_ddbcpus; + kcpuset_set(kcp, cii); kcpuset_atomicly_remove(cpus_resumed, cpus_resumed); kcpuset_atomic_clear(cpus_paused, cii); cpu_ipi_wait("resume", cpus_resumed, kcp); - - kcpuset_destroy(kcp); } /* @@ -839,19 +836,18 @@ cpu_resume(cpuid_t cii) void cpu_resume_others(void) { - kcpuset_t *kcp; - if (__predict_false(cold)) return; + struct cpu_info * const ci = curcpu(); + kcpuset_t *kcp = ci->ci_ddbcpus; + kcpuset_atomicly_remove(cpus_resumed, cpus_resumed); - kcpuset_clone(&kcp, cpus_paused); + kcpuset_copy(kcp, cpus_paused); kcpuset_atomicly_remove(cpus_paused, cpus_paused); /* CPUs awake on cpus_paused clear */ cpu_ipi_wait("resume", cpus_resumed, kcp); - - kcpuset_destroy(kcp); } bool Index: sys/uvm/pmap/pmap_tlb.c =================================================================== RCS file: /cvsroot/src/sys/uvm/pmap/pmap_tlb.c,v retrieving revision 1.19 diff -u -p -r1.19 pmap_tlb.c --- sys/uvm/pmap/pmap_tlb.c 9 Oct 2016 14:51:50 -0000 1.19 +++ sys/uvm/pmap/pmap_tlb.c 31 Oct 2016 12:12:13 -0000 @@ -538,9 +538,8 @@ pmap_tlb_shootdown_process(void) #endif KASSERT(cpu_intr_p()); - KASSERTMSG(ci->ci_cpl >= IPL_SCHED, - "%s: cpl (%d) < IPL_SCHED (%d)", - __func__, ci->ci_cpl, IPL_SCHED); + KASSERTMSG(ci->ci_cpl >= IPL_SCHED, "%s: ci %p cpl (%d) < IPL_SCHED (%d)", + __func__, ci, ci->ci_cpl, IPL_SCHED); TLBINFO_LOCK(ti);