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
{
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);