git: nvme - Fix BUF_KERNPROC() SMP race

Matthew Dillon dillon at crater.dragonflybsd.org
Thu Jul 21 22:53:02 PDT 2016


commit a391a14a3472200021bf4616938068c5e9ee2b58
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date:   Wed Jul 20 19:29:06 2016 -0700

    nvme - Fix BUF_KERNPROC() SMP race
    
    * BUF_KERNPROC() must be issued before we submit the request.  The subq
      lock is not sufficient to interlock request completion (which only needs
      the comq lock).
    
    * Only occurs under extreme loads, probably due to an IPI or Xinvltlb
      causing enough of a pause that the completion can run.  NVMe is so fast,
      probably no other controller would hit this particular race condition.
    
    * Also fix a bio queueing race which can leave a bio hanging.  If no
      requests are available (which can only happen under very heavy I/O
      loads), the signaling to the admin thread on the next I/O completion
      can race the queueing of the bio.  Fix the race by making sure the
      admin thread is signalled *after* queueing the bio.

Summary of changes:
 sys/dev/disk/nvme/nvme.c      |  7 +++----
 sys/dev/disk/nvme/nvme_disk.c | 18 ++++++++++++++++--
 2 files changed, 19 insertions(+), 6 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/a391a14a3472200021bf4616938068c5e9ee2b58


-- 
DragonFly BSD source repository



More information about the Commits mailing list