diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-07-05 08:40:26 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-07-05 08:40:26 +0100 |
commit | 621441dcd1a5253e381741b3e77adc5074b3fcd6 (patch) | |
tree | 0e661fbc082745589c54aafb1a977c2f459331c7 /xen/common/page_alloc.c | |
parent | 52ff658b7e69e45f00679b7f1a29d25ab7ed7f8e (diff) | |
download | xen-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.c | 8 |
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; |