DragonFly BSD
DragonFly commits List (threaded) for 2011-01
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

git: kernel - Fix deadlock assertion panic with mmap/read combos


From: Matthew Dillon <dillon@xxxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 19 Jan 2011 14:18:15 -0800 (PST)

commit 283b944850fbb3421a77ef06aa121d066f5c8cad
Author: Matthew Dillon <dillon@apollo.backplane.com>
Date:   Wed Jan 19 14:11:10 2011 -0800

    kernel - Fix deadlock assertion panic with mmap/read combos
    
    * Normally the uiomove() is called with the buffer locked.  When
      uiomove()ing into mmap'd memory this can cause a lock recursion and
      panic, or a deadlock.
    
    * Fix the problem by adding bqhold() and bqdrop() and adjusting the use
      of the b_refs field to prevent the buffer from being invalidated,
      allowing VFS VOP_READ operations to release the buffer prior to the
      uiomove() into user memory.
    
    * Adjust brelse() and getnewbuf() to do the right thing.  Note that there
      are two cases where b_refs can transition from 0->1.  The VFS
      release/uiomove case will only transition b_refs while the buffer is
      locked while findblk() will transition b_refs at any time (while holding
      the spin lock).  We only care about retaining the VM pages in the
      transition-during-locked case.
    
    * Original problem reproducable with
    
      grep -r --mmap SomeString /usr/pkgsrc
    
    Reported-by: YONETANI Tomokazu <qhwt.dfly@les.ath.cx>

Summary of changes:
 sys/kern/vfs_bio.c            |   92 ++++++++++++++++++++++++++++-------------
 sys/sys/buf.h                 |    7 ++-
 sys/vfs/hammer/hammer_vnops.c |   16 ++++++-
 3 files changed, 80 insertions(+), 35 deletions(-)

http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/283b944850fbb3421a77ef06aa121d066f5c8cad


-- 
DragonFly BSD source repository



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]