systimer: Adjust systimers on their owner cpus.
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 3 Aug 2017 07:02:38 +0000 (15:02 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 3 Aug 2017 07:02:38 +0000 (15:02 +0800)
sys/kern/kern_intr.c
sys/net/dummynet/ip_dummynet.c

index d53e488..d49fd19 100644 (file)
@@ -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;
 }
 
index 50605c8..69ae7b9 100644 (file)
@@ -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;
 }