Patch "slub: clean up code for kmem cgroup support to kmem_cache_free_bulk" has been added to the 4.5-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
slub: clean up code for kmem cgroup support to kmem_cache_free_bulk
to the 4.5-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
slub-clean-up-code-for-kmem-cgroup-support-to-kmem_cache_free_bulk.patch
and it can be found in the queue-4.5 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
376bf125ac781d32e202760ed7deb1ae4ed35d31Mon Sep 17 00:00:00 2001
From: Jesper Dangaard Brouer <[email protected]>
Date: Tue, 15 Mar 2016 14:53:32 -0700
Subject: slub: clean up code for kmem cgroup support to kmem_cache_free_bulk
From: Jesper Dangaard Brouer <[email protected]>
commit 376bf125ac781d32e202760ed7deb1ae4ed35d31 upstream.
This change is primarily an attempt to make it easier to realize the optimizations the compiler performs in-case CONFIG_MEMCG_KMEM is not enabled.
Performance wise, even when CONFIG_MEMCG_KMEM is compiled in, the overhead is zero. This is because, as long as no process have enabled kmem cgroups accounting, the assignment is replaced by asm-NOP operations. This is possible because memcg_kmem_enabled() uses a static_key_false() construct.
It also helps readability as it avoid accessing the p[] array like:
p[size - 1] which "expose" that the array is processed backwards inside helper function build_detached_freelist().
Lastly this also makes the code more robust, in error case like passing NULL pointers in the array. Which were previously handled before commit 033745189b1b ("slub: add missing kmem cgroup support to kmem_cache_free_bulk").
--- mm/slub.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
mm/slub.c +11 -11
@@ -2815,6 +2815,7 @@ struct detached_freelist {void *tail;void *freelist;int cnt; +struct kmem_cache *s; };/*
@@ -2829,8 +2830,9 @@ struct detached_freelist {* synchronization primitive. Look ahead in the array is limited due * to performance reasons. */ -static int build_detached_freelist (struct kmem_cache *s,size_t size, -void **p,struct detached_freelist *df) +static inline +int build_detached_freelist (struct kmem_cache *s,size_t size, +void **p,struct detached_freelist *df) {size_t first_skipped_index =0 ;int lookahead =3 ;
@@ -2846,8 +2848,11 @@ static int build_detached_freelist(strucif (!object)return 0 ; +/* Support for memcg, compiler can optimize this out */ + df->s =cache_from_obj (s, object); +/* Start new detached freelist */ -set_freepointer (s, object,NULL ); +set_freepointer (df->s, object,NULL ); df->page =virt_to_head_page (object); df->tail = object; df->freelist = object;
@@ -2862,7 +2867,7 @@ static int build_detached_freelist(struc/* df->page is always set at this point */ if (df->page ==virt_to_head_page (object)) {/* Opportunity build freelist */ -set_freepointer (s, object, df->freelist); +set_freepointer (df->s, object, df->freelist); df->freelist = object; df->cnt++; p[size] =NULL ;/* mark object processed */
@@ -2881,25 +2886,20 @@ static int build_detached_freelist(strucreturn first_skipped_index; } -/* Note that interrupts must be enabled when calling this function. */ -void kmem_cache_free_bulk (struct kmem_cache *orig_s,size_t size,void **p) +void kmem_cache_free_bulk (struct kmem_cache *s,size_t size,void **p) {if (WARN_ON (!size))return ;do {struct detached_freelist df; -struct kmem_cache *s; - -/* Support for memcg */ - s =cache_from_obj (orig_s, p[size -1 ]); size =build_detached_freelist (s, size, p, &df);if (unlikely (!df.page))continue ; -slab_free (s, df.page, df.freelist, df.tail, df.cnt, _RET_IP_); +slab_free (df.s, df.page, df.freelist, df.tail, df.cnt,_RET_IP_); }while (likely (size)); }EXPORT_SYMBOL (kmem_cache_free_bulk);
Patches currently in stable-queue which might be from [email protected] are
queue-4.5/slub-clean-up-code-for-kmem-cgroup-support-to-kmem_cache_free_bulk.patch