X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Ftxg.c;h=d0d2b1716e88688df4d05857f537d2af7f0feb39;hb=cddafdcbc55a38cdbdd3dc8c58f447b22bd847ee;hp=00c1c7d26abe64dbf96d27ececd1be5d8f542817;hpb=bfd214af01dd360417b1331d903655244979fe0f;p=zfs.git diff --git a/module/zfs/txg.c b/module/zfs/txg.c index 00c1c7d..d0d2b17 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; @@ -493,7 +506,7 @@ void txg_delay(dsl_pool_t *dp, uint64_t txg, int ticks) { tx_state_t *tx = &dp->dp_tx; - int timeout = ddi_get_lbolt() + ticks; + clock_t timeout = ddi_get_lbolt() + ticks; /* don't delay if this txg could transition to quiesing immediately */ if (tx->tx_open_txg > txg ||