Commit d24ac77f authored by Joonsoo Kim's avatar Joonsoo Kim Committed by Pekka Enberg

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: default avatarChristoph Lameter <cl@linux.com>
Signed-off-by: default avatarJoonsoo Kim <js1304@gmail.com>
Signed-off-by: default avatarPekka Enberg <penberg@kernel.org>
parent e7b691b0
...@@ -1872,7 +1872,11 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, void *freel ...@@ -1872,7 +1872,11 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, void *freel
} }
} }
/* 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) ...@@ -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, ...@@ -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) ...@@ -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"));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment