Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 03 Aug 2018 14:27:40 +0000
From:      bugzilla-noreply@freebsd.org
To:        bugs@FreeBSD.org
Subject:   [Bug 229106] intr_event_handle is unsafe with respect to interrupt handler list
Message-ID:  <bug-229106-227-JIlevqDvp3@https.bugs.freebsd.org/bugzilla/>
In-Reply-To: <bug-229106-227@https.bugs.freebsd.org/bugzilla/>
References:  <bug-229106-227@https.bugs.freebsd.org/bugzilla/>

next in thread | previous in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D229106

--- Comment #15 from commit-hook@freebsd.org ---
A commit references this bug:

Author: avg
Date: Fri Aug  3 14:27:29 UTC 2018
New revision: 337255
URL: https://svnweb.freebsd.org/changeset/base/337255

Log:
  safer wait-free iteration of shared interrupt handlers

  The code that iterates a list of interrupt handlers for a (shared)
  interrupt, whether in the ISR context or in the context of an interrupt
  thread, does so in a lock-free fashion.   Thus, the routines that modify
  the list need to take special steps to ensure that the iterating code
  has a consistent view of the list.  Previously, those routines tried to
  play nice only with the code running in the ithread context.  The
  iteration in the ISR context was left to a chance.

  After commit r336635 atomic operations and memory fences are used to
  ensure that ie_handlers list is always safe to navigate with respect to
  inserting and removal of list elements.

  There is still a question of when it is safe to actually free a removed
  element.

  The idea of this change is somewhat similar to the idea of the epoch
  based reclamation.  There are some simplifications comparing to the
  general epoch based reclamation.  All writers are serialized using a
  mutex, so we do not need to worry about concurrent modifications.  Also,
  all read accesses from the open context are serialized too.

  So, we can get away just two epochs / phases.  When a thread removes an
  element it switches the global phase from the current phase to the other
  and then drains the previous phase.  Only after the draining the removed
  element gets actually freed. The code that iterates the list in the ISR
  context takes a snapshot of the global phase and then increments the use
  count of that phase before iterating the list.  The use count (in the
  same phase) is decremented after the iteration.  This should ensure that
  there should be no iteration over the removed element when its gets
  freed.

  This commit also simplifies the coordination with the interrupt thread
  context.  Now we always schedule the interrupt thread when removing one
  of handlers for its interrupt.  This makes the code both simpler and
  safer as the interrupt thread masks the interrupt thus ensuring that
  there is no interaction with the ISR context.

  P.S.  This change matters only for shared interrupts and I realize that
  those are becoming a thing of the past (and quickly).  I also understand
  that the problem that I am trying to solve is extremely rare.

  PR:           229106
  Reviewed by:  cem
  Discussed with:       Samy Al Bahra
  MFC after:    5 weeks
  Differential Revision: https://reviews.freebsd.org/D15905

Changes:
  head/sys/kern/kern_intr.c
  head/sys/sys/interrupt.h

--=20
You are receiving this mail because:
You are the assignee for the bug.=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-229106-227-JIlevqDvp3>