diff options
Diffstat (limited to 'mm/slub.c')
| -rw-r--r-- | mm/slub.c | 5 | 
1 files changed, 3 insertions, 2 deletions
diff --git a/mm/slub.c b/mm/slub.c index 0809760cf789..1373ac365a46 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -1952,7 +1952,7 @@ int alloc_slab_obj_exts(struct slab *slab, struct kmem_cache *s,  #ifdef CONFIG_MEMCG  	new_exts |= MEMCG_DATA_OBJEXTS;  #endif -	old_exts = slab->obj_exts; +	old_exts = READ_ONCE(slab->obj_exts);  	handle_failed_objexts_alloc(old_exts, vec, objects);  	if (new_slab) {  		/* @@ -1961,7 +1961,8 @@ int alloc_slab_obj_exts(struct slab *slab, struct kmem_cache *s,  		 * be simply assigned.  		 */  		slab->obj_exts = new_exts; -	} else if (cmpxchg(&slab->obj_exts, old_exts, new_exts) != old_exts) { +	} else if ((old_exts & ~OBJEXTS_FLAGS_MASK) || +		   cmpxchg(&slab->obj_exts, old_exts, new_exts) != old_exts) {  		/*  		 * If the slab is already in use, somebody can allocate and  		 * assign slabobj_exts in parallel. In this case the existing  | 
