summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2013-01-09 11:08:15 (GMT)
committerScott Wood <scottwood@freescale.com>2014-05-14 18:38:05 (GMT)
commit3b2db37bedf0b6ab50d9c0856d0a1242bb93b513 (patch)
tree4ec405d0a0b4fb3ea1cc5e54e574e5c4be7f509a /mm
parent2bcdd91feba29cc8104da340ed903b0c7d2cb055 (diff)
downloadlinux-fsl-qoriq-3b2db37bedf0b6ab50d9c0856d0a1242bb93b513.tar.xz
slub: Enable irqs for __GFP_WAIT
SYSTEM_RUNNING might be too late for enabling interrupts. Allocations with GFP_WAIT can happen before that. So use this as an indicator. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'mm')
-rw-r--r--mm/slub.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/mm/slub.c b/mm/slub.c
index e228e45..b1c50f7 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1297,14 +1297,15 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node)
struct page *page;
struct kmem_cache_order_objects oo = s->oo;
gfp_t alloc_gfp;
+ bool enableirqs;
flags &= gfp_allowed_mask;
+ enableirqs = (flags & __GFP_WAIT) != 0;
#ifdef CONFIG_PREEMPT_RT_FULL
- if (system_state == SYSTEM_RUNNING)
-#else
- if (flags & __GFP_WAIT)
+ enableirqs |= system_state == SYSTEM_RUNNING;
#endif
+ if (enableirqs)
local_irq_enable();
flags |= s->allocflags;
@@ -1344,11 +1345,7 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node)
kmemcheck_mark_unallocated_pages(page, pages);
}
-#ifdef CONFIG_PREEMPT_RT_FULL
- if (system_state == SYSTEM_RUNNING)
-#else
- if (flags & __GFP_WAIT)
-#endif
+ if (enableirqs)
local_irq_disable();
if (!page)
return NULL;