Switch KM_SLEEP to KM_PUSHPAGE
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 19 Sep 2012 18:50:22 +0000 (11:50 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 19 Sep 2012 18:52:36 +0000 (11:52 -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 #973

module/zfs/ddt.c

index f93024d..895422b 100644 (file)
@@ -653,7 +653,7 @@ ddt_alloc(const ddt_key_t *ddk)
        ddt_entry_t *dde;
 
        /* XXX: Move to a slab */
-       dde = kmem_zalloc(sizeof (ddt_entry_t), KM_SLEEP);
+       dde = kmem_zalloc(sizeof (ddt_entry_t), KM_PUSHPAGE);
        cv_init(&dde->dde_cv, NULL, CV_DEFAULT, NULL);
 
        dde->dde_key = *ddk;
@@ -802,7 +802,7 @@ ddt_table_alloc(spa_t *spa, enum zio_checksum c)
        ddt_t *ddt;
 
        /* XXX: Move to a slab */
-       ddt = kmem_zalloc(sizeof (*ddt), KM_SLEEP | KM_NODEBUG);
+       ddt = kmem_zalloc(sizeof (*ddt), KM_PUSHPAGE | KM_NODEBUG);
 
        mutex_init(&ddt->ddt_lock, NULL, MUTEX_DEFAULT, NULL);
        avl_create(&ddt->ddt_tree, ddt_entry_compare,
@@ -904,7 +904,7 @@ ddt_class_contains(spa_t *spa, enum ddt_class max_class, const blkptr_t *bp)
                return (B_TRUE);
 
        ddt = spa->spa_ddt[BP_GET_CHECKSUM(bp)];
-       dde = kmem_alloc(sizeof(ddt_entry_t), KM_SLEEP);
+       dde = kmem_alloc(sizeof(ddt_entry_t), KM_PUSHPAGE);
 
        ddt_key_fill(&(dde->dde_key), bp);