Switch KM_SLEEP to KM_PUSHPAGE
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 4 Sep 2012 22:52:36 +0000 (15:52 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 4 Sep 2012 23:00:06 +0000 (16:00 -0700)
This warning indicates the incorrect use of KM_SLEEP in a call
path which must use KM_PUSHPAGE to avoid deadlocking in direct
reclaim.  See commit b8d06fca089fae4680c3a552fc55c512bfb02202
for additional details.

  SPL: Fixing allocation for task txg_sync (6093) which
  used GFP flags 0x297bda7c with PF_NOFS set

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #917

include/sys/zfs_context.h
module/zfs/zfs_vnops.c

index 98b216f..8982c00 100644 (file)
@@ -391,6 +391,7 @@ typedef struct taskq_ent {
 
 #define        TQ_SLEEP        KM_SLEEP        /* Can block for memory */
 #define        TQ_NOSLEEP      KM_NOSLEEP      /* cannot block for memory; may fail */
+#define        TQ_PUSHPAGE     KM_PUSHPAGE     /* Cannot perform I/O */
 #define        TQ_NOQUEUE      0x02            /* Do not enqueue if can't dispatch */
 #define        TQ_FRONT        0x08            /* Queue in front */
 
index 755d057..7561434 100644 (file)
@@ -868,7 +868,7 @@ iput_async(struct inode *ip, taskq_t *taskq)
 {
        ASSERT(atomic_read(&ip->i_count) > 0);
        if (atomic_read(&ip->i_count) == 1)
-               taskq_dispatch(taskq, (task_func_t *)iput, ip, TQ_SLEEP);
+               taskq_dispatch(taskq, (task_func_t *)iput, ip, TQ_PUSHPAGE);
        else
                iput(ip);
 }
@@ -934,7 +934,7 @@ zfs_get_data(void *arg, lr_write_t *lr, char *buf, zio_t *zio)
                return (ENOENT);
        }
 
-       zgd = (zgd_t *)kmem_zalloc(sizeof (zgd_t), KM_SLEEP);
+       zgd = (zgd_t *)kmem_zalloc(sizeof (zgd_t), KM_PUSHPAGE);
        zgd->zgd_zilog = zsb->z_log;
        zgd->zgd_private = zp;