On Thu, 6 Feb 2014, Joonsoo Kim wrote:

> diff --git a/mm/slub.c b/mm/slub.c
> index cc1f995..c851f82 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -1700,6 +1700,14 @@ static void *get_partial(struct kmem_cache *s, gfp_t 
> flags, int node,
>       void *object;
>       int searchnode = (node == NUMA_NO_NODE) ? numa_mem_id() : node;
>
> +     if (node == NUMA_NO_NODE)
> +             searchnode = numa_mem_id();
> +     else {
> +             searchnode = node;
> +             if (!node_present_pages(node))

This check wouild need to be something that checks for other contigencies
in the page allocator as well. A simple solution would be to actually run
a GFP_THIS_NODE alloc to see if you can grab a page from the proper node.
If that fails then fallback. See how fallback_alloc() does it in slab.

> +                     searchnode = get_numa_mem(node);
> +     }

> @@ -2277,11 +2285,18 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t 
> gfpflags, int node,
>  redo:
>
>       if (unlikely(!node_match(page, node))) {
> -             stat(s, ALLOC_NODE_MISMATCH);
> -             deactivate_slab(s, page, c->freelist);
> -             c->page = NULL;
> -             c->freelist = NULL;
> -             goto new_slab;
> +             int searchnode = node;
> +
> +             if (node != NUMA_NO_NODE && !node_present_pages(node))

Same issue here. I would suggest not deactivating the slab and first check
if the node has no pages. If so then just take an object from the current
cpu slab. If that is not available do an allcoation from the indicated
node and take whatever the page allocator gave you.

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to