From 5c072b45b66e841ebc7952db7860c2ee7b024b08 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Mon, 25 Jun 2012 20:05:00 -0400 Subject: [PATCH] Make KM_SLEEP an alias of KM_PUSHPAGE Use GFP_NOIO in KM_SLEEP This should prevent direct reclaim issues without requiring Linux-specific changes to code from Solaris. This is what is done in FreeBSD. Note that a change to __taskq_dispatch() module/spl/spl-taskq.c is needed to make this work. Changing KM_PUSHPAGE to use GFP_NOIO is fine, but adding __GFP_HIGH to that triggers a hard-coded panic in __taskq_dispatch() during zvol initialization. Removing the hard coded panic has no ill effects. Signed-off-by: Richard Yao --- include/sys/kmem.h | 2 +- module/spl/spl-taskq.c | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/include/sys/kmem.h b/include/sys/kmem.h index 796af44..633278b 100644 --- a/include/sys/kmem.h +++ b/include/sys/kmem.h @@ -41,7 +41,7 @@ /* * Memory allocation interfaces */ -#define KM_SLEEP GFP_KERNEL /* Can sleep, never fails */ +#define KM_SLEEP (GFP_NOIO | __GFP_HIGH) /* Can sleep, never fails */ #define KM_NOSLEEP GFP_ATOMIC /* Can not sleep, may fail */ #define KM_PUSHPAGE (GFP_NOIO | __GFP_HIGH) /* Use reserved memory */ #define KM_NODEBUG __GFP_NOWARN /* Suppress warnings */ diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c index 0c546c7..5ab387e 100644 --- a/module/spl/spl-taskq.c +++ b/module/spl/spl-taskq.c @@ -255,9 +255,10 @@ if (!(flags & (TQ_SLEEP | TQ_NOSLEEP))) flags |= TQ_SLEEP; - if (unlikely(in_atomic() && (flags & TQ_SLEEP))) - PANIC("May schedule while atomic: %s/0x%08x/%d\n", - current->comm, preempt_count(), current->pid); + /* FIXME: Why does this fail when KM_SLEEP contains __GFP_HIGHMEM? */ + //if (unlikely(in_atomic() && (flags & TQ_SLEEP))) + // PANIC("May schedule while atomic: %s/0x%08x/%d\n", + // current->comm, preempt_count(), current->pid); spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags); -- 1.7.10