summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_clocksource.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-09-18 07:18:30 +0000
committermav <mav@FreeBSD.org>2010-09-18 07:18:30 +0000
commita1682974694d69a29fe86e5c0eb7a45c603e97ef (patch)
tree50d5a6daedd1bdc37b0e67f9bbebd449ac51b43b /sys/kern/kern_clocksource.c
parent84d6709378a676b1f5728650db4f04b8e41f5bab (diff)
downloadFreeBSD-src-a1682974694d69a29fe86e5c0eb7a45c603e97ef.zip
FreeBSD-src-a1682974694d69a29fe86e5c0eb7a45c603e97ef.tar.gz
When global timer used at SMP system, update nextevent field on BSP before
sending IPI to other CPUs. Otherwise, other CPUs will try to honor stale value, programming timer for zero interval. If timer is fast enough, it caused extra interrupt before timer correctly reprogrammed by BSP.
Diffstat (limited to 'sys/kern/kern_clocksource.c')
-rw-r--r--sys/kern/kern_clocksource.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/kern/kern_clocksource.c b/sys/kern/kern_clocksource.c
index e366ef9..eb20a40 100644
--- a/sys/kern/kern_clocksource.c
+++ b/sys/kern/kern_clocksource.c
@@ -335,15 +335,15 @@ timercb(struct eventtimer *et, void *arg)
bcast = 0;
if ((et->et_flags & ET_FLAGS_PERCPU) == 0 && smp_started) {
CPU_FOREACH(cpu) {
- if (curcpu == cpu)
- continue;
state = DPCPU_ID_PTR(cpu, timerstate);
ET_HW_LOCK(state);
state->now = now;
if (bintime_cmp(&now, &state->nextevent, >=)) {
state->nextevent.sec++;
- state->ipi = 1;
- bcast = 1;
+ if (curcpu != cpu) {
+ state->ipi = 1;
+ bcast = 1;
+ }
}
ET_HW_UNLOCK(state);
}
OpenPOWER on IntegriCloud