From eec8164771bee067c3cd55ed0a16dadeeba276de Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 31 Mar 2011 10:05:58 -0700 Subject: [PATCH] Fix ASSERTION(!dsl_pool_sync_context(tx->tx_pool)) Disable the normal reclaim path for the txg_sync thread. This ensures the thread will never enter dmu_tx_assign() which can otherwise occur due to direct reclaim. If this is allowed to happen the system can deadlock. Direct reclaim call path: ->shrink_icache_memory->prune_icache->dispose_list-> clear_inode->zpl_clear_inode->zfs_inactive->dmu_tx_assign --- module/zfs/txg.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/module/zfs/txg.c b/module/zfs/txg.c index 00c1c7d26..340c42ae8 100644 --- a/module/zfs/txg.c +++ b/module/zfs/txg.c @@ -372,6 +372,19 @@ txg_sync_thread(dsl_pool_t *dp) callb_cpr_t cpr; uint64_t start, delta; +#ifdef _KERNEL + /* + * Disable the normal reclaim path for the txg_sync thread. This + * ensures the thread will never enter dmu_tx_assign() which can + * otherwise occur due to direct reclaim. If this is allowed to + * happen the system can deadlock. Direct reclaim call path: + * + * ->shrink_icache_memory->prune_icache->dispose_list-> + * clear_inode->zpl_clear_inode->zfs_inactive->dmu_tx_assign + */ + current->flags |= PF_MEMALLOC; +#endif /* _KERNEL */ + txg_thread_enter(tx, &cpr); start = delta = 0;