From: Thomas Gleixner <t...@linutronix.de>

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 <t...@linutronix.de>
[bigeasy@linutronix: fix !page conflict]
Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de>
---
 mm/slub.c |   13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/mm/slub.c b/mm/slub.c
index 624deaa..bdb7f3a 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1293,14 +1293,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;
@@ -1324,11 +1325,7 @@ static struct page *allocate_slab(struct kmem_cache *s, 
gfp_t flags, int node)
                        stat(s, ORDER_FALLBACK);
        }
 
-#ifdef CONFIG_PREEMPT_RT_FULL
-       if (system_state == SYSTEM_RUNNING)
-#else
-       if (flags & __GFP_WAIT)
-#endif
+       if (enableirqs)
                local_irq_disable();
 
        if (!page)
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to