| Subject: slub: Enable irqs for __GFP_WAIT |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Wed, 09 Jan 2013 12:08:15 +0100 |
| |
| 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> |
| --- |
| mm/slub.c | 13 +++++-------- |
| 1 file changed, 5 insertions(+), 8 deletions(-) |
| |
| Index: linux-stable/mm/slub.c |
| =================================================================== |
| --- linux-stable.orig/mm/slub.c |
| +++ linux-stable/mm/slub.c |
| @@ -1280,14 +1280,15 @@ static struct page *allocate_slab(struct |
| 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; |
| @@ -1327,11 +1328,7 @@ static struct page *allocate_slab(struct |
| 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; |