From 3050c9314faf95a63f000577a1d9feebb86b26d9 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 12 Sep 2012 12:24:41 -0700 Subject: [PATCH] Switch KM_SLEEP to KM_PUSHPAGE Under certain circumstances the following functions may be called in a context where KM_SLEEP is unsafe and can result in a deadlocked system. To avoid this problem the unconditional KM_SLEEPs are converted to KM_PUSHPAGEs. This will prevent them from attempting to initiate any I/O during direct reclaim. This change was originally part of cd5ca4b but was reverted by 330fe01. It always should have had its own commit for exactly this reason. Signed-off-by: Brian Behlendorf --- module/spl/spl-thread.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/spl/spl-thread.c b/module/spl/spl-thread.c index 9f6e223..71e5f33 100644 --- a/module/spl/spl-thread.c +++ b/module/spl/spl-thread.c @@ -98,14 +98,14 @@ __thread_create(caddr_t stk, size_t stksize, thread_func_t func, /* Variable stack size unsupported */ ASSERT(stk == NULL); - tp = kmem_alloc(sizeof(thread_priv_t), KM_SLEEP); + tp = kmem_alloc(sizeof(thread_priv_t), KM_PUSHPAGE); if (tp == NULL) SRETURN(NULL); tp->tp_magic = TP_MAGIC; tp->tp_name_size = strlen(name) + 1; - tp->tp_name = kmem_alloc(tp->tp_name_size, KM_SLEEP); + tp->tp_name = kmem_alloc(tp->tp_name_size, KM_PUSHPAGE); if (tp->tp_name == NULL) { kmem_free(tp, sizeof(thread_priv_t)); SRETURN(NULL); -- 2.40.0