lkml.org 
[lkml]   [2012]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 13/16] mm: Micro-optimise slab to avoid a function call
    Date
    Getting and putting objects in SLAB currently requires a function call
    but the bulk of the work is related to PFMEMALLOC reserves which are
    only consumed when network-backed storage is critical. Use an inline
    function to determine if the function call is required.

    Signed-off-by: Mel Gorman <mgorman@suse.de>
    ---
    mm/slab.c | 28 ++++++++++++++++++++++++++--
    1 file changed, 26 insertions(+), 2 deletions(-)

    diff --git a/mm/slab.c b/mm/slab.c
    index d9fe508..84f471e 100644
    --- a/mm/slab.c
    +++ b/mm/slab.c
    @@ -117,6 +117,8 @@
    #include <linux/memory.h>
    #include <linux/prefetch.h>

    +#include <net/sock.h>
    +
    #include <asm/cacheflush.h>
    #include <asm/tlbflush.h>
    #include <asm/page.h>
    @@ -991,7 +993,7 @@ out:
    spin_unlock_irqrestore(&l3->list_lock, flags);
    }

    -static void *ac_get_obj(struct kmem_cache *cachep, struct array_cache *ac,
    +static void *__ac_get_obj(struct kmem_cache *cachep, struct array_cache *ac,
    gfp_t flags, bool force_refill)
    {
    int i;
    @@ -1038,7 +1040,20 @@ static void *ac_get_obj(struct kmem_cache *cachep, struct array_cache *ac,
    return objp;
    }

    -static void ac_put_obj(struct kmem_cache *cachep, struct array_cache *ac,
    +static inline void *ac_get_obj(struct kmem_cache *cachep,
    + struct array_cache *ac, gfp_t flags, bool force_refill)
    +{
    + void *objp;
    +
    + if (unlikely(sk_memalloc_socks()))
    + objp = __ac_get_obj(cachep, ac, flags, force_refill);
    + else
    + objp = ac->entry[--ac->avail];
    +
    + return objp;
    +}
    +
    +static void *__ac_put_obj(struct kmem_cache *cachep, struct array_cache *ac,
    void *objp)
    {
    if (unlikely(pfmemalloc_active)) {
    @@ -1048,6 +1063,15 @@ static void ac_put_obj(struct kmem_cache *cachep, struct array_cache *ac,
    set_obj_pfmemalloc(&objp);
    }

    + return objp;
    +}
    +
    +static inline void ac_put_obj(struct kmem_cache *cachep, struct array_cache *ac,
    + void *objp)
    +{
    + if (unlikely(sk_memalloc_socks()))
    + objp = __ac_put_obj(cachep, ac, objp);
    +
    ac->entry[ac->avail++] = objp;
    }

    --
    1.7.9.2


    \
     
     \ /
      Last update: 2012-06-23 00:41    [W:4.257 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site