X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Ftxg.c;h=5702a61f04fe8dbd65f3294a3899ba6d7e6372ac;hb=87d98efe9ea7dd1e464f38fc5e39f0d08191d3be;hp=1cb3cb61c43abbc7cde92383d444303b66d5d7a8;hpb=15a9e03368d8f186751a432740a5a281f45d712d;p=zfs.git diff --git a/module/zfs/txg.c b/module/zfs/txg.c index 1cb3cb6..5702a61 100644 --- a/module/zfs/txg.c +++ b/module/zfs/txg.c @@ -349,7 +349,7 @@ txg_dispatch_callbacks(dsl_pool_t *dp, uint64_t txg) TASKQ_THREADS_CPU_PCT | TASKQ_PREPOPULATE); } - cb_list = kmem_alloc(sizeof (list_t), KM_SLEEP); + cb_list = kmem_alloc(sizeof (list_t), KM_PUSHPAGE); list_create(cb_list, sizeof (dmu_tx_callback_t), offsetof(dmu_tx_callback_t, dcb_node)); @@ -384,24 +384,22 @@ txg_sync_thread(dsl_pool_t *dp) #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 + * Annotate this process with a flag that indicates that it is + * unsafe to use KM_SLEEP during memory allocations due to the + * potential for a deadlock. KM_PUSHPAGE should be used instead. */ - current->flags |= PF_MEMALLOC; + current->flags |= PF_NOFS; #endif /* _KERNEL */ txg_thread_enter(tx, &cpr); start = delta = 0; for (;;) { - uint64_t timer, timeout = zfs_txg_timeout * hz; + uint64_t timer, timeout; uint64_t txg; + timeout = zfs_txg_timeout * hz; + /* * We sync when we're scanning, there's someone waiting * on us, or the quiesce thread has handed off a txg to @@ -777,4 +775,7 @@ EXPORT_SYMBOL(txg_wait_open); EXPORT_SYMBOL(txg_wait_callbacks); EXPORT_SYMBOL(txg_stalled); EXPORT_SYMBOL(txg_sync_waiting); + +module_param(zfs_txg_timeout, int, 0644); +MODULE_PARM_DESC(zfs_txg_timeout, "Max seconds worth of delta per txg"); #endif