lkml.org 
[lkml]   [2011]   [May]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [slubllv6 01/17] slub: Push irq disable into allocate_slab()
On Thu, 26 May 2011, Christoph Lameter wrote:

> Do the irq handling in allocate_slab() instead of __slab_alloc().
>
> __slab_alloc() is already cluttered and allocate_slab() is already
> fiddling around with gfp flags.
>
> Signed-off-by: Christoph Lameter <cl@linux.com>
>
> ---
> mm/slub.c | 21 +++++++++++----------
> 1 file changed, 11 insertions(+), 10 deletions(-)
>
> Index: linux-2.6/mm/slub.c
> ===================================================================
> --- linux-2.6.orig/mm/slub.c 2011-05-19 13:59:24.271151647 -0500
> +++ linux-2.6/mm/slub.c 2011-05-19 13:59:24.981151647 -0500
> @@ -1187,6 +1187,11 @@ static struct page *allocate_slab(struct
> struct kmem_cache_order_objects oo = s->oo;
> gfp_t alloc_gfp;
>
> + flags &= gfp_allowed_mask;
> +
> + if (flags & __GFP_WAIT)
> + local_irq_enable();
> +
> flags |= s->allocflags;
>
> /*
> @@ -1203,12 +1208,15 @@ static struct page *allocate_slab(struct
> * Try a lower order alloc if possible
> */
> page = alloc_slab_page(flags, node, oo);
> - if (!page)
> - return NULL;
> -
> stat(s, ORDER_FALLBACK);
> }
>
> + if (flags & __GFP_WAIT)
> + local_irq_disable();
> +
> + if (!page)
> + return NULL;
> +

This changes the meaning of ORDER_FALLBACK from its previous meaning,
which was "number of times the preferred order could not be allocated and
then minimum order could be allocated" to "number of times the preferred
order could not be allocated, regardless of whether the minimum order
allocation was successful." The former is the true meaning of the word
"fallback," so is this semantics change avoidable? Otherwise it seems
like the statistic should be renamed (NEW_SLAB_FAIL?)

> if (kmemcheck_enabled
> && !(s->flags & (SLAB_NOTRACK | DEBUG_DEFAULT_FLAGS))) {
> int pages = 1 << oo_order(oo);
> @@ -1849,15 +1857,8 @@ new_slab:
> goto load_freelist;
> }
>
> - gfpflags &= gfp_allowed_mask;
> - if (gfpflags & __GFP_WAIT)
> - local_irq_enable();
> -
> page = new_slab(s, gfpflags, node);
>
> - if (gfpflags & __GFP_WAIT)
> - local_irq_disable();
> -
> if (page) {
> c = __this_cpu_ptr(s->cpu_slab);
> stat(s, ALLOC_SLAB);
>
>


\
 
 \ /
  Last update: 2011-05-27 00:15    [W:0.121 / U:8.892 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site