From 1acf749273f573280f2da97bc5bd70cab3702af0 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Thu, 3 Aug 2017 15:02:38 +0800 Subject: [PATCH] systimer: Adjust systimers on their owner cpus. --- sys/kern/kern_intr.c | 16 ++++++++++++---- sys/net/dummynet/ip_dummynet.c | 7 ++++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c index d53e48882a..d49fd19fbc 100644 --- a/sys/kern/kern_intr.c +++ b/sys/kern/kern_intr.c @@ -172,7 +172,7 @@ SYSCTL_PROC(_kern, OID_AUTO, emergency_intr_freq, CTLTYPE_INT | CTLFLAG_RW, static int sysctl_emergency_enable(SYSCTL_HANDLER_ARGS) { - int error, enabled, cpuid, freq; + int error, enabled, cpuid, freq, origcpu; enabled = emergency_intr_enable; error = sysctl_handle_int(oidp, &enabled, 0, req); @@ -184,15 +184,19 @@ sysctl_emergency_enable(SYSCTL_HANDLER_ARGS) else freq = 1; - for (cpuid = 0; cpuid < ncpus; ++cpuid) + origcpu = mycpuid; + for (cpuid = 0; cpuid < ncpus; ++cpuid) { + lwkt_migratecpu(cpuid); systimer_adjust_periodic(&emergency_intr_timer[cpuid], freq); + } + lwkt_migratecpu(origcpu); return 0; } static int sysctl_emergency_freq(SYSCTL_HANDLER_ARGS) { - int error, phz, cpuid, freq; + int error, phz, cpuid, freq, origcpu; phz = emergency_intr_freq; error = sysctl_handle_int(oidp, &phz, 0, req); @@ -209,8 +213,12 @@ sysctl_emergency_freq(SYSCTL_HANDLER_ARGS) else freq = 1; - for (cpuid = 0; cpuid < ncpus; ++cpuid) + origcpu = mycpuid; + for (cpuid = 0; cpuid < ncpus; ++cpuid) { + lwkt_migratecpu(cpuid); systimer_adjust_periodic(&emergency_intr_timer[cpuid], freq); + } + lwkt_migratecpu(origcpu); return 0; } diff --git a/sys/net/dummynet/ip_dummynet.c b/sys/net/dummynet/ip_dummynet.c index 50605c8e17..69ae7b9883 100644 --- a/sys/net/dummynet/ip_dummynet.c +++ b/sys/net/dummynet/ip_dummynet.c @@ -1884,7 +1884,7 @@ dummynet_clock(systimer_t info __unused, int in_ipi __unused, static int sysctl_dn_hz(SYSCTL_HANDLER_ARGS) { - int error, val; + int error, val, origcpu; val = dn_hz; error = sysctl_handle_int(oidp, &val, 0, req); @@ -1895,11 +1895,16 @@ sysctl_dn_hz(SYSCTL_HANDLER_ARGS) else if (val > DN_CALLOUT_FREQ_MAX) val = DN_CALLOUT_FREQ_MAX; + origcpu = mycpuid; + lwkt_migratecpu(ip_dn_cpu); + crit_enter(); dn_hz = val; systimer_adjust_periodic(&dn_clock, val); crit_exit(); + lwkt_migratecpu(origcpu); + return 0; } -- 2.41.0