* [RFC][PATCH 2/2] Add hcall to probe Xen heap
@ 2007-04-10 1:09 Ryan Harper
2007-06-06 16:07 ` Ryan Harper
0 siblings, 1 reply; 10+ messages in thread
From: Ryan Harper @ 2007-04-10 1:09 UTC (permalink / raw)
To: xen-devel
For post-3.0.5 inclusion:
Add new domctl hypercall to expose current heap values. This functionality is
needed for probing how much memory is available in a given node prior to VM
creation.
--
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253 T/L: 678-9253
ryanh@us.ibm.com
diffstat output:
tools/libxc/xc_domain.c | 28 ++++++++++++++++++++++++++++
tools/libxc/xenctrl.h | 16 ++++++++++++++++
xen/common/domctl.c | 35 +++++++++++++++++++++++++++++++++++
xen/common/page_alloc.c | 9 +--------
xen/include/public/domctl.h | 16 ++++++++++++++++
xen/include/xen/mm.h | 10 ++++++++++
6 files changed, 106 insertions(+), 8 deletions(-)
Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
---
Add new domctl hypercall to expose current heap values. This functionality is
needed for probing how much memory is available in a given node prior to VM
creation.
Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
diff -r 48cbb32df526 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Thu Mar 29 21:55:42 2007 -0500
+++ b/tools/libxc/xc_domain.c Fri Mar 30 09:41:40 2007 -0500
@@ -584,6 +584,34 @@ int xc_domain_ioport_permission(int xc_h
domctl.u.ioport_permission.allow_access = allow_access;
return do_domctl(xc_handle, &domctl);
+}
+
+int xc_availheap(int xc_handle,
+ int zone_lo,
+ int zone_hi,
+ int node,
+ uint32_t *nr_zones,
+ uint32_t *nr_nodes,
+ uint64_t *pages)
+{
+ DECLARE_DOMCTL;
+ int rc = 0;
+
+ domctl.cmd = XEN_DOMCTL_availheap;
+ domctl.u.availheap.zone_lo = zone_lo;
+ domctl.u.availheap.zone_hi = zone_hi;
+ domctl.u.availheap.node = node;
+
+ rc = do_domctl(xc_handle, &domctl);
+ if ( rc >= 0 ) {
+ if (nr_zones)
+ *nr_zones = domctl.u.availheap.nr_zones;
+ if (nr_nodes)
+ *nr_nodes = domctl.u.availheap.nr_nodes;
+ *pages = domctl.u.availheap.pages;
+ }
+
+ return rc;
}
int xc_vcpu_setcontext(int xc_handle,
diff -r 48cbb32df526 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Thu Mar 29 21:55:42 2007 -0500
+++ b/tools/libxc/xenctrl.h Fri Mar 30 09:44:28 2007 -0500
@@ -611,6 +611,22 @@ int xc_get_pfn_type_batch(int xc_handle,
/* Get current total pages allocated to a domain. */
long xc_get_tot_pages(int xc_handle, uint32_t domid);
+/**
+ * This function retrieves the the number of pages available
+ * in the heap in a specific range of zones and nodes.
+ *
+ * @parm xc_handle a handle to an open hypervisor interface
+ * @parm domid the domain to query
+ * @parm zone_lo the starting zone to query
+ * @parm zone_lo the last zone to query
+ * @parm node the node to query
+ * @parm *nr_zones caller variable to put number of zones queried
+ * @parm *nr_nodes caller variable to put number of nodes queried
+ * @parm *pages caller variable to put total pages counted
+ * @return 0 on success, <0 on failure.
+ */
+int xc_availheap(int xc_handle, int zone_lo, int zone_hi, int node,
+ uint32_t *nr_zones, uint32_t *nr_nodes, uint64_t *pages);
/*
* Trace Buffer Operations
diff -r 48cbb32df526 xen/common/domctl.c
--- a/xen/common/domctl.c Thu Mar 29 21:55:42 2007 -0500
+++ b/xen/common/domctl.c Fri Mar 30 10:02:01 2007 -0500
@@ -24,6 +24,8 @@
#include <asm/current.h>
#include <public/domctl.h>
#include <acm/acm_hooks.h>
+#include <asm/numa.h>
+#include <xen/nodemask.h>
extern long arch_do_domctl(
struct xen_domctl *op, XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);
@@ -711,6 +713,39 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
}
break;
+ case XEN_DOMCTL_availheap:
+ {
+ int zone_lo = 0, zone_hi = NR_ZONES-1;
+
+ ret = -EINVAL;
+ if ( op->u.availheap.node >= num_online_nodes() )
+ break;
+ if ( op->u.availheap.zone_lo >= NR_ZONES )
+ break;
+ if ( op->u.availheap.zone_lo > op->u.availheap.zone_hi )
+ break;
+
+ if ( op->u.availheap.zone_lo > 0 )
+ zone_lo = op->u.availheap.zone_lo;
+ if ( op->u.availheap.zone_hi >= 0 && op->u.availheap.zone_hi < NR_ZONES )
+ zone_hi = op->u.availheap.zone_hi;
+
+ op->u.availheap.nr_zones = zone_hi - zone_lo + 1;
+
+ ( op->u.availheap.node < 0 ) ?
+ (op->u.availheap.nr_nodes=num_online_nodes()) :
+ (op->u.availheap.nr_nodes=1);
+
+ op->u.availheap.pages =
+ avail_heap_pages(zone_lo, zone_hi, op->u.availheap.node);
+
+ if ( copy_to_guest(u_domctl, op, 1) )
+ ret = -EFAULT;
+ else
+ ret = 0;
+ }
+ break;
+
default:
ret = arch_do_domctl(op, u_domctl);
break;
diff -r 48cbb32df526 xen/common/page_alloc.c
--- a/xen/common/page_alloc.c Thu Mar 29 21:55:42 2007 -0500
+++ b/xen/common/page_alloc.c Fri Mar 30 10:00:25 2007 -0500
@@ -310,13 +310,6 @@ unsigned long alloc_boot_pages(
* BINARY BUDDY ALLOCATOR
*/
-#define MEMZONE_XEN 0
-#ifdef PADDR_BITS
-#define NR_ZONES (PADDR_BITS - PAGE_SHIFT)
-#else
-#define NR_ZONES (BITS_PER_LONG - PAGE_SHIFT)
-#endif
-
#define pfn_dom_zone_type(_pfn) (fls(_pfn) - 1)
typedef struct list_head heap_by_zone_and_order_t[NR_ZONES][MAX_ORDER+1];
@@ -544,7 +537,7 @@ void init_heap_pages(
}
}
-static unsigned long avail_heap_pages(
+unsigned long avail_heap_pages(
unsigned int zone_lo, unsigned int zone_hi, unsigned int node)
{
unsigned int i, zone, num_nodes = num_online_nodes();
diff -r 48cbb32df526 xen/include/public/domctl.h
--- a/xen/include/public/domctl.h Thu Mar 29 21:55:42 2007 -0500
+++ b/xen/include/public/domctl.h Thu Mar 29 22:29:43 2007 -0500
@@ -389,6 +389,21 @@ typedef struct xen_domctl_settimeoffset
typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
+
+#define XEN_DOMCTL_availheap 37
+struct xen_domctl_availheap {
+ /* in */
+ int zone_lo; /* starting zone */
+ int zone_hi; /* ending zone, -1 for zone_lo to NR_ZONES */
+ int node; /* query available pages in node, -1 for all */
+ /* out */
+ uint32_t nr_zones; /* number of zones queried */
+ uint32_t nr_nodes; /* number of nodes queried */
+ uint64_t pages;
+};
+typedef struct xen_domctl_availheap xen_domctl_availheap_t;
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_availheap_t);
+
#define XEN_DOMCTL_gethvmcontext 33
#define XEN_DOMCTL_sethvmcontext 34
@@ -457,6 +472,7 @@ struct xen_domctl {
struct xen_domctl_hvmcontext hvmcontext;
struct xen_domctl_address_size address_size;
struct xen_domctl_sendtrigger sendtrigger;
+ struct xen_domctl_availheap availheap;
uint8_t pad[128];
} u;
};
diff -r 48cbb32df526 xen/include/xen/mm.h
--- a/xen/include/xen/mm.h Thu Mar 29 21:55:42 2007 -0500
+++ b/xen/include/xen/mm.h Fri Mar 30 10:01:02 2007 -0500
@@ -33,6 +33,13 @@
#include <xen/list.h>
#include <xen/spinlock.h>
+#define MEMZONE_XEN 0
+#ifdef PADDR_BITS
+#define NR_ZONES (PADDR_BITS - PAGE_SHIFT)
+#else
+#define NR_ZONES (BITS_PER_LONG - PAGE_SHIFT)
+#endif
+
struct domain;
struct page_info;
@@ -64,6 +71,9 @@ unsigned long avail_domheap_pages(void);
unsigned long avail_domheap_pages(void);
#define alloc_domheap_page(d) (alloc_domheap_pages(d,0,0))
#define free_domheap_page(p) (free_domheap_pages(p,0))
+
+unsigned long avail_heap_pages(
+ unsigned int zone_lo, unsigned int zone_hi, unsigned int node);
void scrub_heap_pages(void);
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-04-10 1:09 [RFC][PATCH 2/2] Add hcall to probe Xen heap Ryan Harper
@ 2007-06-06 16:07 ` Ryan Harper
2007-06-17 16:44 ` Subrahmanian, Raj
2007-07-06 15:15 ` Keir Fraser
0 siblings, 2 replies; 10+ messages in thread
From: Ryan Harper @ 2007-06-06 16:07 UTC (permalink / raw)
To: xen-devel
* Ryan Harper <ryanh@us.ibm.com> [2007-04-09 20:10]:
> For post-3.0.5 inclusion:
>
> Add new domctl hypercall to expose current heap values. This functionality is
> needed for probing how much memory is available in a given node prior to VM
> creation.
Refreshed to changeset: 15200:bd3d6b4c52ec
--
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253 T/L: 678-9253
ryanh@us.ibm.com
diffstat output:
tools/libxc/xc_domain.c | 28 ++++++++++++++++++++++++++++
tools/libxc/xenctrl.h | 16 ++++++++++++++++
xen/common/domctl.c | 35 +++++++++++++++++++++++++++++++++++
xen/common/page_alloc.c | 9 +--------
xen/include/public/domctl.h | 16 ++++++++++++++++
xen/include/xen/mm.h | 10 ++++++++++
6 files changed, 106 insertions(+), 8 deletions(-)
Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
---
Add new domctl hypercall to expose current heap values. This functionality is
needed for probing how much memory is available in a given node prior to VM
creation.
Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
diff -r 48cbb32df526 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Thu Mar 29 21:55:42 2007 -0500
+++ b/tools/libxc/xc_domain.c Fri Mar 30 09:41:40 2007 -0500
@@ -584,6 +584,34 @@ int xc_domain_ioport_permission(int xc_h
domctl.u.ioport_permission.allow_access = allow_access;
return do_domctl(xc_handle, &domctl);
+}
+
+int xc_availheap(int xc_handle,
+ int zone_lo,
+ int zone_hi,
+ int node,
+ uint32_t *nr_zones,
+ uint32_t *nr_nodes,
+ uint64_t *pages)
+{
+ DECLARE_DOMCTL;
+ int rc = 0;
+
+ domctl.cmd = XEN_DOMCTL_availheap;
+ domctl.u.availheap.zone_lo = zone_lo;
+ domctl.u.availheap.zone_hi = zone_hi;
+ domctl.u.availheap.node = node;
+
+ rc = do_domctl(xc_handle, &domctl);
+ if ( rc >= 0 ) {
+ if (nr_zones)
+ *nr_zones = domctl.u.availheap.nr_zones;
+ if (nr_nodes)
+ *nr_nodes = domctl.u.availheap.nr_nodes;
+ *pages = domctl.u.availheap.pages;
+ }
+
+ return rc;
}
int xc_vcpu_setcontext(int xc_handle,
diff -r 48cbb32df526 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Thu Mar 29 21:55:42 2007 -0500
+++ b/tools/libxc/xenctrl.h Fri Mar 30 09:44:28 2007 -0500
@@ -611,6 +611,22 @@ int xc_get_pfn_type_batch(int xc_handle,
/* Get current total pages allocated to a domain. */
long xc_get_tot_pages(int xc_handle, uint32_t domid);
+/**
+ * This function retrieves the the number of pages available
+ * in the heap in a specific range of zones and nodes.
+ *
+ * @parm xc_handle a handle to an open hypervisor interface
+ * @parm domid the domain to query
+ * @parm zone_lo the starting zone to query
+ * @parm zone_lo the last zone to query
+ * @parm node the node to query
+ * @parm *nr_zones caller variable to put number of zones queried
+ * @parm *nr_nodes caller variable to put number of nodes queried
+ * @parm *pages caller variable to put total pages counted
+ * @return 0 on success, <0 on failure.
+ */
+int xc_availheap(int xc_handle, int zone_lo, int zone_hi, int node,
+ uint32_t *nr_zones, uint32_t *nr_nodes, uint64_t *pages);
/*
* Trace Buffer Operations
diff -r 48cbb32df526 xen/common/domctl.c
--- a/xen/common/domctl.c Thu Mar 29 21:55:42 2007 -0500
+++ b/xen/common/domctl.c Fri Mar 30 10:02:01 2007 -0500
@@ -24,6 +24,8 @@
#include <asm/current.h>
#include <public/domctl.h>
#include <acm/acm_hooks.h>
+#include <asm/numa.h>
+#include <xen/nodemask.h>
extern long arch_do_domctl(
struct xen_domctl *op, XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);
@@ -711,6 +713,39 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
}
break;
+ case XEN_DOMCTL_availheap:
+ {
+ int zone_lo = 0, zone_hi = NR_ZONES-1;
+
+ ret = -EINVAL;
+ if ( op->u.availheap.node >= num_online_nodes() )
+ break;
+ if ( op->u.availheap.zone_lo >= NR_ZONES )
+ break;
+ if ( op->u.availheap.zone_lo > op->u.availheap.zone_hi )
+ break;
+
+ if ( op->u.availheap.zone_lo > 0 )
+ zone_lo = op->u.availheap.zone_lo;
+ if ( op->u.availheap.zone_hi >= 0 && op->u.availheap.zone_hi < NR_ZONES )
+ zone_hi = op->u.availheap.zone_hi;
+
+ op->u.availheap.nr_zones = zone_hi - zone_lo + 1;
+
+ ( op->u.availheap.node < 0 ) ?
+ (op->u.availheap.nr_nodes=num_online_nodes()) :
+ (op->u.availheap.nr_nodes=1);
+
+ op->u.availheap.pages =
+ avail_heap_pages(zone_lo, zone_hi, op->u.availheap.node);
+
+ if ( copy_to_guest(u_domctl, op, 1) )
+ ret = -EFAULT;
+ else
+ ret = 0;
+ }
+ break;
+
default:
ret = arch_do_domctl(op, u_domctl);
break;
diff -r 48cbb32df526 xen/common/page_alloc.c
--- a/xen/common/page_alloc.c Thu Mar 29 21:55:42 2007 -0500
+++ b/xen/common/page_alloc.c Fri Mar 30 10:00:25 2007 -0500
@@ -310,13 +310,6 @@ unsigned long alloc_boot_pages(
* BINARY BUDDY ALLOCATOR
*/
-#define MEMZONE_XEN 0
-#ifdef PADDR_BITS
-#define NR_ZONES (PADDR_BITS - PAGE_SHIFT)
-#else
-#define NR_ZONES (BITS_PER_LONG - PAGE_SHIFT)
-#endif
-
#define pfn_dom_zone_type(_pfn) (fls(_pfn) - 1)
typedef struct list_head heap_by_zone_and_order_t[NR_ZONES][MAX_ORDER+1];
@@ -544,7 +537,7 @@ void init_heap_pages(
}
}
-static unsigned long avail_heap_pages(
+unsigned long avail_heap_pages(
unsigned int zone_lo, unsigned int zone_hi, unsigned int node)
{
unsigned int i, zone, num_nodes = num_online_nodes();
diff -r 48cbb32df526 xen/include/public/domctl.h
--- a/xen/include/public/domctl.h Thu Mar 29 21:55:42 2007 -0500
+++ b/xen/include/public/domctl.h Thu Mar 29 22:29:43 2007 -0500
@@ -389,6 +389,21 @@ typedef struct xen_domctl_settimeoffset
typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
+
+#define XEN_DOMCTL_availheap 37
+struct xen_domctl_availheap {
+ /* in */
+ int zone_lo; /* starting zone */
+ int zone_hi; /* ending zone, -1 for zone_lo to NR_ZONES */
+ int node; /* query available pages in node, -1 for all */
+ /* out */
+ uint32_t nr_zones; /* number of zones queried */
+ uint32_t nr_nodes; /* number of nodes queried */
+ uint64_t pages;
+};
+typedef struct xen_domctl_availheap xen_domctl_availheap_t;
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_availheap_t);
+
#define XEN_DOMCTL_gethvmcontext 33
#define XEN_DOMCTL_sethvmcontext 34
@@ -457,6 +472,7 @@ struct xen_domctl {
struct xen_domctl_hvmcontext hvmcontext;
struct xen_domctl_address_size address_size;
struct xen_domctl_sendtrigger sendtrigger;
+ struct xen_domctl_availheap availheap;
uint8_t pad[128];
} u;
};
diff -r 48cbb32df526 xen/include/xen/mm.h
--- a/xen/include/xen/mm.h Thu Mar 29 21:55:42 2007 -0500
+++ b/xen/include/xen/mm.h Fri Mar 30 10:01:02 2007 -0500
@@ -33,6 +33,13 @@
#include <xen/list.h>
#include <xen/spinlock.h>
+#define MEMZONE_XEN 0
+#ifdef PADDR_BITS
+#define NR_ZONES (PADDR_BITS - PAGE_SHIFT)
+#else
+#define NR_ZONES (BITS_PER_LONG - PAGE_SHIFT)
+#endif
+
struct domain;
struct page_info;
@@ -64,6 +71,9 @@ unsigned long avail_domheap_pages(void);
unsigned long avail_domheap_pages(void);
#define alloc_domheap_page(d) (alloc_domheap_pages(d,0,0))
#define free_domheap_page(p) (free_domheap_pages(p,0))
+
+unsigned long avail_heap_pages(
+ unsigned int zone_lo, unsigned int zone_hi, unsigned int node);
void scrub_heap_pages(void);
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-06-06 16:07 ` Ryan Harper
@ 2007-06-17 16:44 ` Subrahmanian, Raj
2007-06-17 17:00 ` Keir Fraser
2007-06-18 15:51 ` Ryan Harper
2007-07-06 15:15 ` Keir Fraser
1 sibling, 2 replies; 10+ messages in thread
From: Subrahmanian, Raj @ 2007-06-17 16:44 UTC (permalink / raw)
To: Ryan Harper, xen-devel
Ryan,
I applied these patches against 15200 and was able to boot on a 4-cell
ES7000 with numa=on.
Boots fine. I brought up a few VMs with some loads on them. That seems
to work fine as well.
Were there any other data points that you would like me to check out?
I was able to see the node info from xm info
node_to_cpu : node0:24-31
node1:16-23
node2:8-15
node3:0-7
If you could give me an updated set of patches against the tip, we can
run our weekly tests with numa=on.
Thanks
Raj
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-06-17 16:44 ` Subrahmanian, Raj
@ 2007-06-17 17:00 ` Keir Fraser
2007-06-18 13:27 ` Subrahmanian, Raj
2007-06-18 15:51 ` Ryan Harper
1 sibling, 1 reply; 10+ messages in thread
From: Keir Fraser @ 2007-06-17 17:00 UTC (permalink / raw)
To: Subrahmanian, Raj, Ryan Harper, xen-devel
The patches are only to provide information via the toolstack, so there
should be no difference in behaviour with or without them. You should be
able to run numa=on with unstable tip just fine.
-- Keir
On 17/6/07 17:44, "Subrahmanian, Raj" <raj.subrahmanian@unisys.com> wrote:
> Ryan,
> I applied these patches against 15200 and was able to boot on a 4-cell
> ES7000 with numa=on.
> Boots fine. I brought up a few VMs with some loads on them. That seems
> to work fine as well.
> Were there any other data points that you would like me to check out?
>
> I was able to see the node info from xm info
> node_to_cpu : node0:24-31
> node1:16-23
> node2:8-15
> node3:0-7
>
> If you could give me an updated set of patches against the tip, we can
> run our weekly tests with numa=on.
>
> Thanks
> Raj
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-06-17 17:00 ` Keir Fraser
@ 2007-06-18 13:27 ` Subrahmanian, Raj
0 siblings, 0 replies; 10+ messages in thread
From: Subrahmanian, Raj @ 2007-06-18 13:27 UTC (permalink / raw)
To: Keir Fraser, Ryan Harper, xen-devel
>The patches are only to provide information via the toolstack,
>so there should be no difference in behaviour with or without
>them. You should be able to run numa=on with unstable tip just fine.
Yes, of course. My apologies. I don't know what I was thinking :-)
Raj
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-06-17 16:44 ` Subrahmanian, Raj
2007-06-17 17:00 ` Keir Fraser
@ 2007-06-18 15:51 ` Ryan Harper
2007-06-19 22:30 ` Subrahmanian, Raj
1 sibling, 1 reply; 10+ messages in thread
From: Ryan Harper @ 2007-06-18 15:51 UTC (permalink / raw)
To: Subrahmanian, Raj; +Cc: Ryan Harper, xen-devel
* Subrahmanian, Raj <raj.subrahmanian@unisys.com> [2007-06-17 11:46]:
> Ryan,
> I applied these patches against 15200 and was able to boot on a 4-cell
> ES7000 with numa=on.
> Boots fine. I brought up a few VMs with some loads on them. That seems
> to work fine as well.
Great! Thanks for testing the patches out.
> Were there any other data points that you would like me to check out?
>
> I was able to see the node info from xm info
> node_to_cpu : node0:24-31
> node1:16-23
> node2:8-15
> node3:0-7
Yeah, in xm info, I'd like to see:
nr_cpus
nr_nodes
sockets_per_node
cores_per_socket
threads_per_core
I believe I've fixed up the sockets_per_node calculation, but the more
machines we test on the sooner we know for sure.
>
> If you could give me an updated set of patches against the tip, we can
> run our weekly tests with numa=on.
As Keir mentioned, you can still test with numa=on without the patches.
The new patches cover how the topology is exposed to userspace. In any
case, the latest versions are posted [1]here and [2]here.
1. http://lists.xensource.com/archives/html/xen-devel/2007-06/msg00298.html
2. http://lists.xensource.com/archives/html/xen-devel/2007-06/msg00299.html
--
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253 T/L: 678-9253
ryanh@us.ibm.com
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-06-18 15:51 ` Ryan Harper
@ 2007-06-19 22:30 ` Subrahmanian, Raj
2007-06-19 22:39 ` Ryan Harper
0 siblings, 1 reply; 10+ messages in thread
From: Subrahmanian, Raj @ 2007-06-19 22:30 UTC (permalink / raw)
To: Ryan Harper; +Cc: xen-devel
Ryan
>> I was able to see the node info from xm info
>> node_to_cpu : node0:24-31
>> node1:16-23
>> node2:8-15
>> node3:0-7
>
>Yeah, in xm info, I'd like to see:
>
>nr_cpus
>nr_nodes
>sockets_per_node
>cores_per_socket
>threads_per_core
>
nr_cpus : 32
nr_nodes : 4
sockets_per_node : 8
cores_per_socket : 1
threads_per_core : 1
cpu_mhz : 3400
hw_caps :
bfebfbff:20100800:00000000:00000180:0000e5bd:00000000:0
0000001
total_memory : 130943
free_memory : 128740
node_to_cpu : node0:24-31
node1:16-23
node2:8-15
node3:0-7
The cores per socket and sockets per node are off.
These are dual-core, 4 socket nodes.
Raj
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-06-19 22:30 ` Subrahmanian, Raj
@ 2007-06-19 22:39 ` Ryan Harper
0 siblings, 0 replies; 10+ messages in thread
From: Ryan Harper @ 2007-06-19 22:39 UTC (permalink / raw)
To: Subrahmanian, Raj; +Cc: Ryan Harper, xen-devel
* Subrahmanian, Raj <raj.subrahmanian@unisys.com> [2007-06-19 17:32]:
> Ryan
> >> I was able to see the node info from xm info
> >> node_to_cpu : node0:24-31
> >> node1:16-23
> >> node2:8-15
> >> node3:0-7
> >
> >Yeah, in xm info, I'd like to see:
> >
> >nr_cpus
> >nr_nodes
> >sockets_per_node
> >cores_per_socket
> >threads_per_core
> >
> nr_cpus : 32
> nr_nodes : 4
> sockets_per_node : 8
> cores_per_socket : 1
> threads_per_core : 1
> cpu_mhz : 3400
> hw_caps :
> bfebfbff:20100800:00000000:00000180:0000e5bd:00000000:0
> 0000001
> total_memory : 130943
> free_memory : 128740
> node_to_cpu : node0:24-31
> node1:16-23
> node2:8-15
> node3:0-7
>
> The cores per socket and sockets per node are off.
> These are dual-core, 4 socket nodes.
Hrm, ok. I think if the cores_per_socket were fixed, then the
sockets_per_node calc would fix itself. I've not touched the
cores_per_socket calculation; that will need some attention, but I
assume that value has always been incorrect, ie, not a NUMA issue.
--
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253 T/L: 678-9253
ryanh@us.ibm.com
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-06-06 16:07 ` Ryan Harper
2007-06-17 16:44 ` Subrahmanian, Raj
@ 2007-07-06 15:15 ` Keir Fraser
2007-07-10 20:34 ` Ryan Harper
1 sibling, 1 reply; 10+ messages in thread
From: Keir Fraser @ 2007-07-06 15:15 UTC (permalink / raw)
To: Ryan Harper, xen-devel
First, it should be a sysctl, not a domctl. Second, please add the zone
range checks into the function you added to page_alloc.c. This will avoid
making use of allocator-private defines outside of page_alloc.c (so you can
avoid moving NR_ZONES into mm.h.
By the way, the first patch of your pair is now checked in, after minor
tidying.
-- Keir
On 6/6/07 17:07, "Ryan Harper" <ryanh@us.ibm.com> wrote:
> * Ryan Harper <ryanh@us.ibm.com> [2007-04-09 20:10]:
>> For post-3.0.5 inclusion:
>>
>> Add new domctl hypercall to expose current heap values. This functionality
>> is
>> needed for probing how much memory is available in a given node prior to VM
>> creation.
>
> Refreshed to changeset: 15200:bd3d6b4c52ec
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [RFC][PATCH 2/2] Add hcall to probe Xen heap
2007-07-06 15:15 ` Keir Fraser
@ 2007-07-10 20:34 ` Ryan Harper
0 siblings, 0 replies; 10+ messages in thread
From: Ryan Harper @ 2007-07-10 20:34 UTC (permalink / raw)
To: Keir Fraser; +Cc: xen-devel, ryanh
[-- Attachment #1: Type: text/plain, Size: 834 bytes --]
* Keir Fraser <keir@xensource.com> [2007-07-06 10:17]:
> First, it should be a sysctl, not a domctl. Second, please add the zone
> range checks into the function you added to page_alloc.c. This will avoid
> making use of allocator-private defines outside of page_alloc.c (so you can
> avoid moving NR_ZONES into mm.h.
We need access to NR_ZONES so we can calculate zone_hi limit as the user
might not have put in a value for zone_hi, and NR_ZONES would truncate
that. I've moved the calculation into avail_heap_pages(), but had to
change the signature to take a pointer to the nr_zone value that will be
calculated. I don't really like it that much so I'm open to suggestions
on a different approach.
--
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253 T/L: 678-9253
ryanh@us.ibm.com
[-- Attachment #2: add_availheap_hcall.patch --]
[-- Type: text/plain, Size: 8408 bytes --]
Add new domctl hypercall to expose current heap values. This functionality is
needed for probing how much memory is available in a given node prior to VM
creation.
Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
diff -r 27e993c80ceb tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c Mon Jul 09 09:47:20 2007 +0100
+++ b/tools/libxc/xc_domain.c Tue Jul 10 14:02:53 2007 -0500
@@ -586,6 +586,34 @@ int xc_domain_ioport_permission(int xc_h
domctl.u.ioport_permission.allow_access = allow_access;
return do_domctl(xc_handle, &domctl);
+}
+
+int xc_availheap(int xc_handle,
+ int zone_lo,
+ int zone_hi,
+ int node,
+ uint32_t *nr_zones,
+ uint32_t *nr_nodes,
+ uint64_t *pages)
+{
+ DECLARE_SYSCTL;
+ int rc = 0;
+
+ sysctl.cmd = XEN_SYSCTL_availheap;
+ sysctl.u.availheap.zone_lo = zone_lo;
+ sysctl.u.availheap.zone_hi = zone_hi;
+ sysctl.u.availheap.node = node;
+
+ rc = xc_sysctl(xc_handle, &sysctl);
+ if ( rc >= 0 ) {
+ if (nr_zones)
+ *nr_zones = sysctl.u.availheap.nr_zones;
+ if (nr_nodes)
+ *nr_nodes = sysctl.u.availheap.nr_nodes;
+ *pages = sysctl.u.availheap.pages;
+ }
+
+ return rc;
}
int xc_vcpu_setcontext(int xc_handle,
diff -r 27e993c80ceb tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h Mon Jul 09 09:47:20 2007 +0100
+++ b/tools/libxc/xenctrl.h Tue Jul 10 14:02:53 2007 -0500
@@ -616,6 +616,22 @@ int xc_get_pfn_type_batch(int xc_handle,
/* Get current total pages allocated to a domain. */
long xc_get_tot_pages(int xc_handle, uint32_t domid);
+/**
+ * This function retrieves the the number of pages available
+ * in the heap in a specific range of zones and nodes.
+ *
+ * @parm xc_handle a handle to an open hypervisor interface
+ * @parm domid the domain to query
+ * @parm zone_lo the starting zone to query
+ * @parm zone_lo the last zone to query
+ * @parm node the node to query
+ * @parm *nr_zones caller variable to put number of zones queried
+ * @parm *nr_nodes caller variable to put number of nodes queried
+ * @parm *pages caller variable to put total pages counted
+ * @return 0 on success, <0 on failure.
+ */
+int xc_availheap(int xc_handle, int zone_lo, int zone_hi, int node,
+ uint32_t *nr_zones, uint32_t *nr_nodes, uint64_t *pages);
/*
* Trace Buffer Operations
diff -r 27e993c80ceb xen/common/page_alloc.c
--- a/xen/common/page_alloc.c Mon Jul 09 09:47:20 2007 +0100
+++ b/xen/common/page_alloc.c Tue Jul 10 14:09:28 2007 -0500
@@ -569,8 +569,9 @@ void init_heap_pages(
}
}
-static unsigned long avail_heap_pages(
- unsigned int zone_lo, unsigned int zone_hi, unsigned int node)
+unsigned long avail_heap_pages(
+ unsigned int zone_lo, unsigned int zone_hi, unsigned int node,
+ unsigned int *nr_zones)
{
unsigned int i, zone, num_nodes = num_online_nodes();
unsigned long free_pages = 0;
@@ -586,6 +587,9 @@ static unsigned long avail_heap_pages(
if ( (node == -1) || (node == i) )
free_pages += avail[i][zone];
}
+
+ if (nr_zones)
+ *nr_zones = zone_hi - zone_lo + 1;
return free_pages;
}
@@ -834,7 +838,7 @@ struct page_info *__alloc_domheap_pages(
((order > MAX_ORDER) ||
(avail_heap_pages(MEMZONE_XEN + 1,
dma_bitsize - PAGE_SHIFT - 1,
- -1) <
+ -1, NULL) <
(dma_emergency_pool_pages + (1UL << order)))) )
return NULL;
}
@@ -934,11 +938,11 @@ unsigned long avail_domheap_pages(void)
avail_nrm = avail_heap_pages(dma_bitsize - PAGE_SHIFT,
NR_ZONES - 1,
- -1);
+ -1, NULL);
avail_dma = avail_heap_pages(MEMZONE_XEN + 1,
dma_bitsize - PAGE_SHIFT - 1,
- -1);
+ -1, NULL);
if ( avail_dma > dma_emergency_pool_pages )
avail_dma -= dma_emergency_pool_pages;
@@ -950,7 +954,7 @@ unsigned long avail_domheap_pages(void)
unsigned long avail_nodeheap_pages(int node)
{
- return avail_heap_pages(0, NR_ZONES - 1, node);
+ return avail_heap_pages(0, NR_ZONES - 1, node, NULL);
}
static void pagealloc_keyhandler(unsigned char key)
@@ -960,7 +964,7 @@ static void pagealloc_keyhandler(unsigne
printk("Physical memory information:\n");
printk(" Xen heap: %lukB free\n",
- avail_heap_pages(zone, zone, -1) << (PAGE_SHIFT-10));
+ avail_heap_pages(zone, zone, -1, NULL) << (PAGE_SHIFT-10));
while ( ++zone < NR_ZONES )
{
@@ -972,7 +976,7 @@ static void pagealloc_keyhandler(unsigne
total = 0;
}
- if ( (n = avail_heap_pages(zone, zone, -1)) != 0 )
+ if ( (n = avail_heap_pages(zone, zone, -1, NULL)) != 0 )
{
total += n;
printk(" heap[%02u]: %lukB free\n", zone, n << (PAGE_SHIFT-10));
diff -r 27e993c80ceb xen/common/sysctl.c
--- a/xen/common/sysctl.c Mon Jul 09 09:47:20 2007 +0100
+++ b/xen/common/sysctl.c Tue Jul 10 14:09:59 2007 -0500
@@ -21,6 +21,8 @@
#include <xen/keyhandler.h>
#include <asm/current.h>
#include <public/sysctl.h>
+#include <asm/numa.h>
+#include <xen/nodemask.h>
extern long arch_do_sysctl(
struct xen_sysctl *op, XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl);
@@ -166,6 +168,31 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
if ( copy_to_guest(u_sysctl, op, 1) )
ret = -EFAULT;
+ }
+ break;
+
+ case XEN_SYSCTL_availheap:
+ {
+ ret = -EINVAL;
+
+ if ( op->u.availheap.node >= num_online_nodes() )
+ break;
+ if ( op->u.availheap.zone_lo > op->u.availheap.zone_hi )
+ break;
+
+ ( op->u.availheap.node < 0 ) ?
+ (op->u.availheap.nr_nodes=num_online_nodes()) :
+ (op->u.availheap.nr_nodes=1);
+
+ op->u.availheap.pages = avail_heap_pages(op->u.availheap.zone_lo,
+ op->u.availheap.zone_hi,
+ op->u.availheap.node,
+ &(op->u.availheap.nr_zones));
+
+ if ( copy_to_guest(u_sysctl, op, 1) )
+ ret = -EFAULT;
+ else
+ ret = 0;
}
break;
diff -r 27e993c80ceb xen/include/public/sysctl.h
--- a/xen/include/public/sysctl.h Mon Jul 09 09:47:20 2007 +0100
+++ b/xen/include/public/sysctl.h Tue Jul 10 14:02:53 2007 -0500
@@ -185,6 +185,20 @@ typedef struct xen_sysctl_getcpuinfo xen
typedef struct xen_sysctl_getcpuinfo xen_sysctl_getcpuinfo_t;
DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getcpuinfo_t);
+#define XEN_SYSCTL_availheap 9
+struct xen_sysctl_availheap {
+ /* in */
+ int zone_lo; /* starting zone */
+ int zone_hi; /* ending zone, -1 for zone_lo to NR_ZONES */
+ int node; /* query available pages in node, -1 for all */
+ /* out */
+ uint32_t nr_zones; /* number of zones queried */
+ uint32_t nr_nodes; /* number of nodes queried */
+ uint64_t pages;
+};
+typedef struct xen_sysctl_availheap xen_sysctl_availheap_t;
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_availheap_t);
+
struct xen_sysctl {
uint32_t cmd;
uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
@@ -197,6 +211,7 @@ struct xen_sysctl {
struct xen_sysctl_getdomaininfolist getdomaininfolist;
struct xen_sysctl_debug_keys debug_keys;
struct xen_sysctl_getcpuinfo getcpuinfo;
+ struct xen_sysctl_availheap availheap;
uint8_t pad[128];
} u;
};
diff -r 27e993c80ceb xen/include/xen/mm.h
--- a/xen/include/xen/mm.h Mon Jul 09 09:47:20 2007 +0100
+++ b/xen/include/xen/mm.h Tue Jul 10 14:08:03 2007 -0500
@@ -65,6 +65,10 @@ unsigned long avail_domheap_pages(void);
#define alloc_domheap_page(d) (alloc_domheap_pages(d,0,0))
#define free_domheap_page(p) (free_domheap_pages(p,0))
+unsigned long avail_heap_pages(
+ unsigned int zone_lo, unsigned int zone_hi, unsigned int node,
+ unsigned int *nr_zones);
+
void scrub_heap_pages(void);
int assign_pages(
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2007-07-10 20:34 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-10 1:09 [RFC][PATCH 2/2] Add hcall to probe Xen heap Ryan Harper
2007-06-06 16:07 ` Ryan Harper
2007-06-17 16:44 ` Subrahmanian, Raj
2007-06-17 17:00 ` Keir Fraser
2007-06-18 13:27 ` Subrahmanian, Raj
2007-06-18 15:51 ` Ryan Harper
2007-06-19 22:30 ` Subrahmanian, Raj
2007-06-19 22:39 ` Ryan Harper
2007-07-06 15:15 ` Keir Fraser
2007-07-10 20:34 ` Ryan Harper
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.