From: Richard Yao Date: Mon, 16 Apr 2012 10:56:20 +0000 (-0400) Subject: Disable direct reclaim on zvols X-Git-Tag: zfs-0.6.0-rc9~20 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ce90208cf9e04df966429f115d8831371ea9afce;p=zfs 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 --- 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);