From ce90208cf9e04df966429f115d8831371ea9afce Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Mon, 16 Apr 2012 06:56:20 -0400 Subject: [PATCH] Disable direct reclaim on zvols Previously, it was possible for the direct reclaim path to be invoked when a write to a zvol was made. When a zvol is used as a swap device, this often causes swap requests to depend on additional swap requests, which deadlocks. We address this by disabling the direct reclaim path on zvols. Signed-off-by: Brian Behlendorf Closes #342 --- module/zfs/zvol.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index 9b1313402..9dd9547e2 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1390,8 +1390,14 @@ zvol_init(void) { int error; + /* + * The zvol taskqs are created with TASKQ_NORECLAIM so they may be + * used safely as a swap device. If direct reclaim is allowed then + * they quickly deadlock in one of the internal memory allocations. + */ zvol_taskq = taskq_create(ZVOL_DRIVER, zvol_threads, maxclsyspri, - zvol_threads, INT_MAX, TASKQ_PREPOPULATE); + zvol_threads, INT_MAX, + TASKQ_PREPOPULATE | TASKQ_NORECLAIM); if (zvol_taskq == NULL) { printk(KERN_INFO "ZFS: taskq_create() failed\n"); return (-ENOMEM);