git: kernel - Fix callout race and panic

Matthew Dillon dillon at crater.dragonflybsd.org
Sun Aug 20 17:25:35 PDT 2017


commit 5596130dd4d89a15b19e1b2afd63c545942e89b2
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date:   Sun Aug 20 17:09:27 2017 -0700

    kernel - Fix callout race and panic
    
    * Fix race (found by ivadasz) related to the IPI/WAIT code unblocking
      before the IPI is able to finish adjusting the knode and callout.
      The wait code was only waiting for the IPI counter to reach 0 via
      IPI_MASK, it also had to wait for the ARMED bit to get cleared.
    
    * Avoid retesting c->c_flags to handle WAITING bit change races.  Instead,
      fully integrate the test-and-clear of the WAITING bit into
      callout_unpend_disarm().
    
    * Fix an issue where callout_terminate() fails to IPI the remote cpu
      due to the function dispatch code clearing the ARMED bit.  No
      longer clear the ARMED bit.  This ensures that a termination or stop
      waits for the callout to return.
    
      This change means that synchronous callout operations to other cpus will
      be more expensive.  However, the kernel generally does not do cross-cpu
      callouts any more so its generally non-problem.
    
    * Remove the now unused callout_maybe_clear_armed() inline.
    
    * Also clear kn->kn_hook for EVFILT_TIMER when removing a callout, as
      a safety.
    
    Reported-by: ivadasz (Imre Vadasz)

Summary of changes:
 sys/kern/kern_event.c   |  2 +-
 sys/kern/kern_timeout.c | 72 ++++++++++++++++++++++++++++---------------------
 2 files changed, 42 insertions(+), 32 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/5596130dd4d89a15b19e1b2afd63c545942e89b2


-- 
DragonFly BSD source repository



More information about the Commits mailing list