X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Ftxg.c;h=340c42ae84a395333d314507616ec4eb6deba848;hb=e2448b0e62f73f8b9574d74c5b327707b67b703a;hp=5afb139ddfb0b87710bd2805326acf06ad0943a8;hpb=54a179e7b80413bd48cd2cd259110fb493d0215e;p=zfs.git diff --git a/module/zfs/txg.c b/module/zfs/txg.c index 5afb139..340c42a 100644 --- a/module/zfs/txg.c +++ b/module/zfs/txg.c @@ -166,10 +166,10 @@ txg_thread_wait(tx_state_t *tx, callb_cpr_t *cpr, kcondvar_t *cv, uint64_t time) CALLB_CPR_SAFE_BEGIN(cpr); if (time) - (void) cv_timedwait(cv, &tx->tx_sync_lock, + (void) cv_timedwait_interruptible(cv, &tx->tx_sync_lock, ddi_get_lbolt() + time); else - cv_wait(cv, &tx->tx_sync_lock); + cv_wait_interruptible(cv, &tx->tx_sync_lock); CALLB_CPR_SAFE_END(cpr, &tx->tx_sync_lock); } @@ -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;