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 <behlendorf1@llnl.gov>
Closes #342
This commit is contained in:
Richard Yao 2012-04-16 06:56:20 -04:00 committed by Brian Behlendorf
parent 518b487602
commit ce90208cf9
1 changed files with 7 additions and 1 deletions

View File

@ -1390,8 +1390,14 @@ zvol_init(void)
{ {
int error; 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_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) { if (zvol_taskq == NULL) {
printk(KERN_INFO "ZFS: taskq_create() failed\n"); printk(KERN_INFO "ZFS: taskq_create() failed\n");
return (-ENOMEM); return (-ENOMEM);