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>
This commit is contained in:
Thomas Gleixner 2013-01-09 12:08:15 +01:00 committed by Alibek Omarov
parent 0c6685b11f
commit 3a076ba5b6
1 changed files with 5 additions and 8 deletions

View File

@ -1337,14 +1337,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;
@ -1384,11 +1385,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;