summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2012-09-12 12:24:41 -0700
committerBrian Behlendorf <[email protected]>2012-09-12 12:27:09 -0700
commit3050c9314faf95a63f000577a1d9feebb86b26d9 (patch)
tree78e3b73ff33bf0c3cf2407ef4e80fec1127a6834
parent9b51f218410ccdeb69a85d99bd5f09051ec2def1 (diff)
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 <[email protected]>
-rw-r--r--module/spl/spl-thread.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/module/spl/spl-thread.c b/module/spl/spl-thread.c
index 9f6e22379..71e5f331d 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);