git: kernel - Fix rare IPIQ freezes
Matthew Dillon
dillon at crater.dragonflybsd.org
Fri Jul 29 01:33:51 PDT 2011
commit da0b0e8b56caa72ea92647df9f1a7c5663384fe2
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Fri Jul 29 01:25:46 2011 -0700
kernel - Fix rare IPIQ freezes
* Ensure that an IPI interrupt is sent went waiting for an IPIQ
to drain. The IPIQ can be pushed up by passive IPIs and not
necessarily have a signal pending on the target cpu, so we
have to put the check in our drain loop rather than outside
the loop.
* Add a cpu_pause() to reduce power use for the IPIQ drain case.
* Normalize the use of gd_intr_nesting_level and clean up the
code syntax for the ipiq_optimized case.
* Remove the previous temporary IPI interrupt signaling fix, it
was incomplete.
* Fix a missing crit_exit() in the ENOENT case for
lwkt_send_ipiq3_nowait().
* Track cpu's which are in the middle of ipiq processing and
assert that a cpu is not in an IPIQ processing loop when
switching between threads.
* Normalize the use of ip->ip_npoll in the IPIQ code. This
field is used to avoid unnecessary IPI interrupts.
Summary of changes:
sys/kern/lwkt_ipiq.c | 81 +++++++++++++++--------------
sys/kern/lwkt_thread.c | 3 +
sys/platform/vkernel64/x86_64/cpu_regs.c | 6 ++-
sys/platform/vkernel64/x86_64/mp.c | 3 +-
sys/sys/globaldata.h | 2 +-
5 files changed, 53 insertions(+), 42 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/da0b0e8b56caa72ea92647df9f1a7c5663384fe2
--
DragonFly BSD source repository
More information about the Commits
mailing list