Disable direct reclaim on zvols
authorRichard Yao <ryao@cs.stonybrook.edu>
Mon, 16 Apr 2012 10:56:20 +0000 (06:56 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 30 Apr 2012 18:25:36 +0000 (11:25 -0700)
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 <behlendorf1@llnl.gov>
Closes #342

module/zfs/zvol.c

index 9b13134..9dd9547 100644 (file)
@@ -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);