This patch extends the memops hypercall in a compatible way to transport
a desired NUMA node number. The address_bits field will be limited to 8
bits and is now embedded in the mem_flags member, which additionally
contains the node number (limited to 8 bit). Passing a node number of
'0' (currently the default) will revert to automatic node selection
(based on currently scheduled node).
Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
--
Andre Przywara
AMD-Operating System Research Center (OSRC), Dresden, Germany
Tel: +49 351 277-84917
----to satisfy European Law for business letters:
AMD Saxony Limited Liability Company & Co. KG,
Wilschdorfer Landstr. 101, 01109 Dresden, Germany
Register Court Dresden: HRA 4896, General Partner authorized
to represent: AMD Saxony LLC (Wilmington, Delaware, US)
General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy
# HG changeset patch
# User Andre Przywara <andre.przywara@xxxxxxx>
# Date 1215082871 -7200
# Node ID e308bd4e9179493e3897143bf6e5841c14b4f357
# Parent 20215b87d0f3587ed5e928c31b1df2596b15ae79
made memops hypercall NUMA capable
diff -r 20215b87d0f3 -r e308bd4e9179 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Thu Jul 03 10:44:13 2008 +0100
+++ b/tools/libxc/xc_domain.c Thu Jul 03 13:01:11 2008 +0200
@@ -445,7 +445,7 @@
struct xen_memory_reservation reservation = {
.nr_extents = nr_extents,
.extent_order = extent_order,
- .address_bits = address_bits,
+ .mem_flags = XENMEM_addr_bits(address_bits),
.domid = domid
};
@@ -478,7 +478,7 @@
struct xen_memory_reservation reservation = {
.nr_extents = nr_extents,
.extent_order = extent_order,
- .address_bits = 0,
+ .mem_flags = 0,
.domid = domid
};
@@ -517,7 +517,7 @@
struct xen_memory_reservation reservation = {
.nr_extents = nr_extents,
.extent_order = extent_order,
- .address_bits = address_bits,
+ .mem_flags = XENMEM_addr_bits(address_bits),
.domid = domid
};
set_xen_guest_handle(reservation.extent_start, extent_start);
diff -r 20215b87d0f3 -r e308bd4e9179 xen/common/memory.c
--- a/xen/common/memory.c Thu Jul 03 10:44:13 2008 +0100
+++ b/xen/common/memory.c Thu Jul 03 13:01:11 2008 +0200
@@ -344,8 +344,8 @@
}
d = current->domain;
- memflags |= MEMF_bits(domain_clamp_alloc_bitsize(
- d, exch.out.address_bits ? : (BITS_PER_LONG+PAGE_SHIFT)));
+ memflags |= MEMF_bits(domain_clamp_alloc_bitsize( d,
+ XENMEM_addr_bits(exch.out.mem_flags) ? : (BITS_PER_LONG+PAGE_SHIFT)));
memflags |= MEMF_node(domain_to_node(d));
for ( i = (exch.nr_exchanged >> in_chunk_order);
@@ -521,14 +521,16 @@
args.preempted = 0;
args.memflags = 0;
- if ( (reservation.address_bits != 0) &&
- (reservation.address_bits <
+ if ( (XENMEM_addr_bits(reservation.mem_flags) != 0) &&
+ (XENMEM_addr_bits(reservation.mem_flags) <
(get_order_from_pages(max_page) + PAGE_SHIFT)) )
{
- if ( reservation.address_bits <= PAGE_SHIFT )
+ if ( XENMEM_addr_bits(reservation.mem_flags) <= PAGE_SHIFT )
return start_extent;
- args.memflags = MEMF_bits(reservation.address_bits);
+ args.memflags = MEMF_bits(XENMEM_addr_bits(reservation.mem_flags));
}
+
+ args.memflags |= MEMF_node(XENMEM_get_node(reservation.mem_flags));
if ( likely(reservation.domid == DOMID_SELF) )
{
diff -r 20215b87d0f3 -r e308bd4e9179 xen/include/public/memory.h
--- a/xen/include/public/memory.h Thu Jul 03 10:44:13 2008 +0100
+++ b/xen/include/public/memory.h Thu Jul 03 13:01:11 2008 +0200
@@ -35,6 +35,11 @@
#define XENMEM_increase_reservation 0
#define XENMEM_decrease_reservation 1
#define XENMEM_populate_physmap 6
+
+#define XENMEM_addr_bits(f) ((f)&0xFF)
+#define XENMEM_get_node(f) (((((f)&0xFF00)>>8)-1)&0xFF)
+#define XENMEM_set_node(n) (((((n)&0xFF)+1)&0xFF)<<8)
+
struct xen_memory_reservation {
/*
@@ -59,7 +64,7 @@
* zero then the user has no addressing restriction.
* This field is not used by XENMEM_decrease_reservation.
*/
- unsigned int address_bits;
+ unsigned int mem_flags;
/*
* Domain whose reservation is being changed.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|