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 24 Aug 2016 07:35:09 -0000 @@ -150,6 +155,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 24 Aug 2016 07:35:11 -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