From d7d6aea97226caf51762e7a182272c4aac9e6cdd Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 9 Jan 2013 12:08:15 +0100 Subject: [PATCH 109/352] 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 --- mm/slub.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mm/slub.c b/mm/slub.c index 6cd5c83..e7491c1 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1536,14 +1536,17 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) void *start, *p; int idx, order; bool shuffle; + bool enableirqs = false; flags &= gfp_allowed_mask; + if (gfpflags_allow_blocking(flags)) + enableirqs = true; #ifdef CONFIG_PREEMPT_RT_FULL if (system_state == SYSTEM_RUNNING) -#else - if (gfpflags_allow_blocking(flags)) + enableirqs = true; #endif + if (enableirqs) local_irq_enable(); flags |= s->allocflags; @@ -1618,11 +1621,7 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) page->frozen = 1; out: -#ifdef CONFIG_PREEMPT_RT_FULL - if (system_state == SYSTEM_RUNNING) -#else - if (gfpflags_allow_blocking(flags)) -#endif + if (enableirqs) local_irq_disable(); if (!page) return NULL; -- 2.7.4