Fix zvol deadlock
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 26 Apr 2011 19:56:35 +0000 (12:56 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 26 Apr 2011 19:56:35 +0000 (12:56 -0700)
It's possible for a zvol_write thread to enter direct memory reclaim
while holding open a transaction group.  This results in the system
attempting to write out data to the disk to free memory.  Unfortunately,
this can't succeed because the the thread doing reclaim is holding open
the txg which must be closed to be synced to disk.  To prevent this
the offending allocation is marked KM_PUSHPAGE which will prevent it
from attempting writeback.

Closes #191

module/zfs/zil.c

index ad11fd6..79f519f 100644 (file)
@@ -1075,7 +1075,8 @@ zil_itx_create(uint64_t txtype, size_t lrsize)
 
        lrsize = P2ROUNDUP_TYPED(lrsize, sizeof (uint64_t), size_t);
 
-       itx = kmem_alloc(offsetof(itx_t, itx_lr) + lrsize, KM_SLEEP|KM_NODEBUG);
+       itx = kmem_alloc(offsetof(itx_t, itx_lr) + lrsize,
+           KM_PUSHPAGE | KM_NODEBUG);
        itx->itx_lr.lrc_txtype = txtype;
        itx->itx_lr.lrc_reclen = lrsize;
        itx->itx_sod = lrsize; /* if write & WR_NEED_COPY will be increased */