Subject: slub: Enable irqs for __GFP_WAIT From: Thomas Gleixner Date: Wed, 09 Jan 2013 12:08:15 +0100 Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/patches-4.4-rt3.tar.xz 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(-) --- a/mm/slub.c +++ b/mm/slub.c @@ -1405,14 +1405,17 @@ static struct page *allocate_slab(struct gfp_t alloc_gfp; void *start, *p; int idx, order; + 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; @@ -1483,11 +1486,7 @@ static struct page *allocate_slab(struct 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;