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
This commit is contained in:
Brian Behlendorf 2011-03-31 10:05:58 -07:00
parent 7cb67b45f3
commit eec8164771

View File

@ -372,6 +372,19 @@ txg_sync_thread(dsl_pool_t *dp)
callb_cpr_t cpr; callb_cpr_t cpr;
uint64_t start, delta; 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); txg_thread_enter(tx, &cpr);
start = delta = 0; start = delta = 0;