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:
parent
518b487602
commit
ce90208cf9
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue