slub: use __cmpxchg_double_slab() at interrupt disabled place
get_freelist(), unfreeze_partials() are only called with interrupt disabled, so __cmpxchg_double_slab() is suitable. Acked-by: Christoph Lameter <cl@linux.com> Signed-off-by: Joonsoo Kim <js1304@gmail.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
parent
e7b691b085
commit
d24ac77f71
12
mm/slub.c
12
mm/slub.c
|
@ -1872,7 +1872,11 @@ redo:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unfreeze all the cpu partial slabs */
|
/*
|
||||||
|
* Unfreeze all the cpu partial slabs.
|
||||||
|
*
|
||||||
|
* This function must be called with interrupt disabled.
|
||||||
|
*/
|
||||||
static void unfreeze_partials(struct kmem_cache *s)
|
static void unfreeze_partials(struct kmem_cache *s)
|
||||||
{
|
{
|
||||||
struct kmem_cache_node *n = NULL;
|
struct kmem_cache_node *n = NULL;
|
||||||
|
@ -1928,7 +1932,7 @@ static void unfreeze_partials(struct kmem_cache *s)
|
||||||
l = m;
|
l = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (!cmpxchg_double_slab(s, page,
|
} while (!__cmpxchg_double_slab(s, page,
|
||||||
old.freelist, old.counters,
|
old.freelist, old.counters,
|
||||||
new.freelist, new.counters,
|
new.freelist, new.counters,
|
||||||
"unfreezing slab"));
|
"unfreezing slab"));
|
||||||
|
@ -2165,6 +2169,8 @@ static inline void *new_slab_objects(struct kmem_cache *s, gfp_t flags,
|
||||||
* The page is still frozen if the return value is not NULL.
|
* The page is still frozen if the return value is not NULL.
|
||||||
*
|
*
|
||||||
* If this function returns NULL then the page has been unfrozen.
|
* If this function returns NULL then the page has been unfrozen.
|
||||||
|
*
|
||||||
|
* This function must be called with interrupt disabled.
|
||||||
*/
|
*/
|
||||||
static inline void *get_freelist(struct kmem_cache *s, struct page *page)
|
static inline void *get_freelist(struct kmem_cache *s, struct page *page)
|
||||||
{
|
{
|
||||||
|
@ -2182,7 +2188,7 @@ static inline void *get_freelist(struct kmem_cache *s, struct page *page)
|
||||||
new.inuse = page->objects;
|
new.inuse = page->objects;
|
||||||
new.frozen = freelist != NULL;
|
new.frozen = freelist != NULL;
|
||||||
|
|
||||||
} while (!cmpxchg_double_slab(s, page,
|
} while (!__cmpxchg_double_slab(s, page,
|
||||||
freelist, counters,
|
freelist, counters,
|
||||||
NULL, new.counters,
|
NULL, new.counters,
|
||||||
"get_freelist"));
|
"get_freelist"));
|
||||||
|
|
Loading…
Reference in New Issue