summaryrefslogtreecommitdiffstats
path: root/module/zfs
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2011-03-31 10:05:58 -0700
committerBrian Behlendorf <[email protected]>2011-04-07 09:52:16 -0700
commiteec8164771bee067c3cd55ed0a16dadeeba276de (patch)
treeff2bb2ff5e551aad021dd1f0b157bd363f224ce7 /module/zfs
parent7cb67b45f33fd7a61af24c675c7347eb5264b38c (diff)
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
Diffstat (limited to 'module/zfs')
-rw-r--r--module/zfs/txg.c13
1 files changed, 13 insertions, 0 deletions
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;