|
@@ -1699,7 +1699,12 @@ static void *get_partial(struct kmem_cache *s, gfp_t flags, int node,
|
|
|
struct kmem_cache_cpu *c)
|
|
|
{
|
|
|
void *object;
|
|
|
- int searchnode = (node == NUMA_NO_NODE) ? numa_mem_id() : node;
|
|
|
+ int searchnode = node;
|
|
|
+
|
|
|
+ if (node == NUMA_NO_NODE)
|
|
|
+ searchnode = numa_mem_id();
|
|
|
+ else if (!node_present_pages(node))
|
|
|
+ searchnode = node_to_mem_node(node);
|
|
|
|
|
|
object = get_partial_node(s, get_node(s, searchnode), c, flags);
|
|
|
if (object || node != NUMA_NO_NODE)
|
|
@@ -2280,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))
|
|
|
+ searchnode = node_to_mem_node(node);
|
|
|
+
|
|
|
+ if (unlikely(!node_match(page, searchnode))) {
|
|
|
+ stat(s, ALLOC_NODE_MISMATCH);
|
|
|
+ deactivate_slab(s, page, c->freelist);
|
|
|
+ c->page = NULL;
|
|
|
+ c->freelist = NULL;
|
|
|
+ goto new_slab;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|