From d4bf6d8429371634b0c6bcc14b5868d849b7c07d Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Mon, 7 Sep 2015 12:35:21 -0400 Subject: [PATCH] Disable direct reclaim in taskq worker threads on Linux 3.9+ Illumos does not have direct reclaim and code run inside taskq worker threads is not designed to deal with it. Allowing direct reclaim inside a worker thread can therefore deadlock. We set PF_MEMALLOC_NOIO through memalloc_noio_save() to indicate to the kernel's reclaim code that we are inside a context where memory allocations cannot be allowed to block on filesystem activity. Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Issue zfsonlinux/zfs#1274 Issue zfsonlinux/zfs#2390 Closes #474 --- module/spl/spl-taskq.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c index 82e71a3889..f6ef56251c 100644 --- a/module/spl/spl-taskq.c +++ b/module/spl/spl-taskq.c @@ -817,6 +817,10 @@ taskq_thread(void *args) tq = tqt->tqt_tq; current->flags |= PF_NOFREEZE; + #if defined(PF_MEMALLOC_NOIO) + (void) memalloc_noio_save(); + #endif + sigfillset(&blocked); sigprocmask(SIG_BLOCK, &blocked, NULL); flush_signals(current);