txg_hold_open(dsl_pool_t *dp, txg_handle_t *th)
{
tx_state_t *tx = &dp->dp_tx;
- tx_cpu_t *tc = &tx->tx_cpu[CPU_SEQID];
+ tx_cpu_t *tc;
uint64_t txg;
+ /*
+ * It appears the processor id is simply used as a "random"
+ * number to index into the array, and there isn't any other
+ * significance to the chosen tx_cpu. Because.. Why not use
+ * the current cpu to index into the array?
+ */
+ kpreempt_disable();
+ tc = &tx->tx_cpu[CPU_SEQID];
+ kpreempt_enable();
+
mutex_enter(&tc->tc_lock);
txg = tx->tx_open_txg;
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;
(void) cv_timedwait(&tx->tx_quiesce_more_cv, &tx->tx_sync_lock,
timeout);
+ DMU_TX_STAT_BUMP(dmu_tx_delay);
+
mutex_exit(&tx->tx_sync_lock);
}