mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-03 19:55:31 +00:00
slub: Reflow ___slab_alloc()
The get_partial() interface used in ___slab_alloc() may return a single object in the "kmem_cache_debug(s)" case, in which we will just return the "freelist" object. Move this handling up to prepare for later changes. And the "pfmemalloc_match()" part is not needed for node partial slab, since we already check this in the get_partial_node(). Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com> Reviewed-by: Vlastimil Babka <vbabka@suse.cz> Tested-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> Reviewed-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
parent
b85ea95d08
commit
24c6a097b5
31
mm/slub.c
31
mm/slub.c
@ -3216,8 +3216,21 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
|
||||
pc.slab = &slab;
|
||||
pc.orig_size = orig_size;
|
||||
freelist = get_partial(s, node, &pc);
|
||||
if (freelist)
|
||||
goto check_new_slab;
|
||||
if (freelist) {
|
||||
if (kmem_cache_debug(s)) {
|
||||
/*
|
||||
* For debug caches here we had to go through
|
||||
* alloc_single_from_partial() so just store the
|
||||
* tracking info and return the object.
|
||||
*/
|
||||
if (s->flags & SLAB_STORE_USER)
|
||||
set_track(s, freelist, TRACK_ALLOC, addr);
|
||||
|
||||
return freelist;
|
||||
}
|
||||
|
||||
goto retry_load_slab;
|
||||
}
|
||||
|
||||
slub_put_cpu_ptr(s->cpu_slab);
|
||||
slab = new_slab(s, gfpflags, node);
|
||||
@ -3253,20 +3266,6 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node,
|
||||
|
||||
inc_slabs_node(s, slab_nid(slab), slab->objects);
|
||||
|
||||
check_new_slab:
|
||||
|
||||
if (kmem_cache_debug(s)) {
|
||||
/*
|
||||
* For debug caches here we had to go through
|
||||
* alloc_single_from_partial() so just store the tracking info
|
||||
* and return the object
|
||||
*/
|
||||
if (s->flags & SLAB_STORE_USER)
|
||||
set_track(s, freelist, TRACK_ALLOC, addr);
|
||||
|
||||
return freelist;
|
||||
}
|
||||
|
||||
if (unlikely(!pfmemalloc_match(slab, gfpflags))) {
|
||||
/*
|
||||
* For !pfmemalloc_match() case we don't load freelist so that
|
||||
|
Loading…
Reference in New Issue
Block a user