Re: [rfc 03/18] slub: Extract get_freelist from __slab_alloc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Nov 11, 2011 at 10:07 PM, Christoph Lameter <cl@xxxxxxxxx> wrote:
> get_freelist retrieves free objects from the page freelist (put there by remote
> frees) or deactivates a slab page if no more objects are available.
>
> Signed-off-by: Christoph Lameter <cl@xxxxxxxxx>

This is a also a nice cleanup. Any reason I shouldn't apply this?

>
>
> ---
>  mm/slub.c |   57 ++++++++++++++++++++++++++++++++-------------------------
>  1 file changed, 32 insertions(+), 25 deletions(-)
>
> Index: linux-2.6/mm/slub.c
> ===================================================================
> --- linux-2.6.orig/mm/slub.c    2011-11-09 11:10:55.671388657 -0600
> +++ linux-2.6/mm/slub.c 2011-11-09 11:11:13.471490305 -0600
> @@ -2110,6 +2110,37 @@ static inline void *new_slab_objects(str
>  }
>
>  /*
> + * Check the page->freelist of a page and either transfer the freelist to the per cpu freelist
> + * or deactivate the page.
> + *
> + * The page is still frozen if the return value is not NULL.
> + *
> + * If this function returns NULL then the page has been unfrozen.
> + */
> +static inline void *get_freelist(struct kmem_cache *s, struct page *page)
> +{
> +       struct page new;
> +       unsigned long counters;
> +       void *freelist;
> +
> +       do {
> +               freelist = page->freelist;
> +               counters = page->counters;
> +               new.counters = counters;
> +               VM_BUG_ON(!new.frozen);
> +
> +               new.inuse = page->objects;
> +               new.frozen = freelist != NULL;
> +
> +       } while (!cmpxchg_double_slab(s, page,
> +               freelist, counters,
> +               NULL, new.counters,
> +               "get_freelist"));
> +
> +       return freelist;
> +}
> +
> +/*
>  * Slow path. The lockless freelist is empty or we need to perform
>  * debugging duties.
>  *
> @@ -2130,8 +2161,6 @@ static void *__slab_alloc(struct kmem_ca
>  {
>        void **object;
>        unsigned long flags;
> -       struct page new;
> -       unsigned long counters;
>
>        local_irq_save(flags);
>  #ifdef CONFIG_PREEMPT
> @@ -2156,29 +2185,7 @@ redo:
>
>        stat(s, ALLOC_SLOWPATH);
>
> -       do {
> -               object = c->page->freelist;
> -               counters = c->page->counters;
> -               new.counters = counters;
> -               VM_BUG_ON(!new.frozen);
> -
> -               /*
> -                * If there is no object left then we use this loop to
> -                * deactivate the slab which is simple since no objects
> -                * are left in the slab and therefore we do not need to
> -                * put the page back onto the partial list.
> -                *
> -                * If there are objects left then we retrieve them
> -                * and use them to refill the per cpu queue.
> -                */
> -
> -               new.inuse = c->page->objects;
> -               new.frozen = object != NULL;
> -
> -       } while (!__cmpxchg_double_slab(s, c->page,
> -                       object, counters,
> -                       NULL, new.counters,
> -                       "__slab_alloc"));
> +       object = get_freelist(s, c->page);
>
>        if (!object) {
>                c->page = NULL;
>
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
> Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>
>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]