diff options
-rw-r--r-- | include/linux/slab.h | 1 | ||||
-rw-r--r-- | mm/slab.c | 17 | ||||
-rw-r--r-- | mm/slub.c | 10 |
3 files changed, 4 insertions, 24 deletions
diff --git a/include/linux/slab.h b/include/linux/slab.h index 1ffe0a959cd4..71829efc40ba 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h | |||
@@ -34,7 +34,6 @@ typedef struct kmem_cache kmem_cache_t __deprecated; | |||
34 | 34 | ||
35 | /* Flags passed to a constructor functions */ | 35 | /* Flags passed to a constructor functions */ |
36 | #define SLAB_CTOR_CONSTRUCTOR 0x001UL /* If not set, then deconstructor */ | 36 | #define SLAB_CTOR_CONSTRUCTOR 0x001UL /* If not set, then deconstructor */ |
37 | #define SLAB_CTOR_ATOMIC 0x002UL /* Tell constructor it can't sleep */ | ||
38 | 37 | ||
39 | /* | 38 | /* |
40 | * struct kmem_cache related prototypes | 39 | * struct kmem_cache related prototypes |
@@ -2752,13 +2752,6 @@ static int cache_grow(struct kmem_cache *cachep, | |||
2752 | 2752 | ||
2753 | ctor_flags = SLAB_CTOR_CONSTRUCTOR; | 2753 | ctor_flags = SLAB_CTOR_CONSTRUCTOR; |
2754 | local_flags = (flags & GFP_LEVEL_MASK); | 2754 | local_flags = (flags & GFP_LEVEL_MASK); |
2755 | if (!(local_flags & __GFP_WAIT)) | ||
2756 | /* | ||
2757 | * Not allowed to sleep. Need to tell a constructor about | ||
2758 | * this - it might need to know... | ||
2759 | */ | ||
2760 | ctor_flags |= SLAB_CTOR_ATOMIC; | ||
2761 | |||
2762 | /* Take the l3 list lock to change the colour_next on this node */ | 2755 | /* Take the l3 list lock to change the colour_next on this node */ |
2763 | check_irq_off(); | 2756 | check_irq_off(); |
2764 | l3 = cachep->nodelists[nodeid]; | 2757 | l3 = cachep->nodelists[nodeid]; |
@@ -3092,14 +3085,8 @@ static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep, | |||
3092 | } | 3085 | } |
3093 | #endif | 3086 | #endif |
3094 | objp += obj_offset(cachep); | 3087 | objp += obj_offset(cachep); |
3095 | if (cachep->ctor && cachep->flags & SLAB_POISON) { | 3088 | if (cachep->ctor && cachep->flags & SLAB_POISON) |
3096 | unsigned long ctor_flags = SLAB_CTOR_CONSTRUCTOR; | 3089 | cachep->ctor(objp, cachep, SLAB_CTOR_CONSTRUCTOR); |
3097 | |||
3098 | if (!(flags & __GFP_WAIT)) | ||
3099 | ctor_flags |= SLAB_CTOR_ATOMIC; | ||
3100 | |||
3101 | cachep->ctor(objp, cachep, ctor_flags); | ||
3102 | } | ||
3103 | #if ARCH_SLAB_MINALIGN | 3090 | #if ARCH_SLAB_MINALIGN |
3104 | if ((u32)objp & (ARCH_SLAB_MINALIGN-1)) { | 3091 | if ((u32)objp & (ARCH_SLAB_MINALIGN-1)) { |
3105 | printk(KERN_ERR "0x%p: not aligned to ARCH_SLAB_MINALIGN=%d\n", | 3092 | printk(KERN_ERR "0x%p: not aligned to ARCH_SLAB_MINALIGN=%d\n", |
@@ -802,14 +802,8 @@ static void setup_object(struct kmem_cache *s, struct page *page, | |||
802 | init_tracking(s, object); | 802 | init_tracking(s, object); |
803 | } | 803 | } |
804 | 804 | ||
805 | if (unlikely(s->ctor)) { | 805 | if (unlikely(s->ctor)) |
806 | int mode = SLAB_CTOR_CONSTRUCTOR; | 806 | s->ctor(object, s, SLAB_CTOR_CONSTRUCTOR); |
807 | |||
808 | if (!(s->flags & __GFP_WAIT)) | ||
809 | mode |= SLAB_CTOR_ATOMIC; | ||
810 | |||
811 | s->ctor(object, s, mode); | ||
812 | } | ||
813 | } | 807 | } |
814 | 808 | ||
815 | static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node) | 809 | static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node) |