aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/page_alloc.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-07-05 08:40:26 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-07-05 08:40:26 +0100
commit621441dcd1a5253e381741b3e77adc5074b3fcd6 (patch)
tree0e661fbc082745589c54aafb1a977c2f459331c7 /xen/common/page_alloc.c
parent52ff658b7e69e45f00679b7f1a29d25ab7ed7f8e (diff)
downloadxen-621441dcd1a5253e381741b3e77adc5074b3fcd6.tar.gz
xen-621441dcd1a5253e381741b3e77adc5074b3fcd6.tar.bz2
xen-621441dcd1a5253e381741b3e77adc5074b3fcd6.zip
Add an exact-node request flag for mem allocations.
Signed-off-by : Dulloor <dulloor@gmail.com>
Diffstat (limited to 'xen/common/page_alloc.c')
-rw-r--r--xen/common/page_alloc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 10c6b22093..1588a2a092 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -300,11 +300,15 @@ static struct page_info *alloc_heap_pages(
unsigned int i, j, zone = 0;
unsigned int num_nodes = num_online_nodes();
unsigned long request = 1UL << order;
+ bool_t exact_node_request = !!(memflags & MEMF_exact_node);
cpumask_t extra_cpus_mask, mask;
struct page_info *pg;
if ( node == NUMA_NO_NODE )
+ {
node = cpu_to_node(smp_processor_id());
+ exact_node_request = 0;
+ }
ASSERT(node >= 0);
ASSERT(zone_lo <= zone_hi);
@@ -345,6 +349,9 @@ static struct page_info *alloc_heap_pages(
goto found;
} while ( zone-- > zone_lo ); /* careful: unsigned zone may wrap */
+ if ( exact_node_request )
+ goto not_found;
+
/* Pick next node, wrapping around if needed. */
node = next_node(node, node_online_map);
if (node == MAX_NUMNODES)
@@ -360,6 +367,7 @@ static struct page_info *alloc_heap_pages(
return pg;
}
+ not_found:
/* No suitable memory blocks. Fail the request. */
spin_unlock(&heap_lock);
return NULL;