git: kernel - Fix callout race and panic (2)
Matthew Dillon
dillon at crater.dragonflybsd.org
Tue Aug 22 09:37:17 PDT 2017
commit 7b045ca837e37d7065b8971267d2c95362cd6276
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Tue Aug 22 09:26:27 2017 -0700
kernel - Fix callout race and panic (2)
* Previous fix couldn't handle a callout_stop() vs callout_reset() race
on different cpus. When this race occurred, the callout_stop() would
get stuck waiting for the ARMED bit to clear, which it never would
because a new callout_reset() re-armed it.
* Refactor the callout code to clean it up. Remove the ARMED flag, instead
a callout is considered ARMED if the IPI_MASK counter bits are not zero
or PENDING is set. Use these rules to lock-in the owning cpu with an
atomic op
* Integrate all flags settings in IPIs with the atomic decrement of the
IPI_MASK count, rather than as separate operations.
* callout_stop() now just waits for the IPI sequence to end. callout_reset()
now re-tests whether the callout is still armed or not after callout_stop()
returns (since it needs to know for sure) before it tries to take over
the callout. This fixes the race.
Summary of changes:
sys/kern/kern_timeout.c | 547 ++++++++++++++++++------------------------------
sys/sys/callout.h | 65 ++++--
2 files changed, 250 insertions(+), 362 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/7b045ca837e37d7065b8971267d2c95362cd6276
--
DragonFly BSD source repository
More information about the Commits
mailing list