From: Dario Faggioli <dario.faggioli@citrix.com>
To: xen-devel <xen-devel@lists.xen.org>
Cc: Ian Campbell <Ian.Campbell@citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Juergen Gross <juergen.gross@ts.fujitsu.com>,
Ian Jackson <Ian.Jackson@eu.citrix.com>,
Jan Beulich <JBeulich@suse.com>,
Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [PATCH 1/4] xen: report how much memory a domain has on each NUMA node
Date: Wed, 5 Mar 2014 15:36:26 +0100 [thread overview]
Message-ID: <20140305143625.6984.3763.stgit@Solace> (raw)
In-Reply-To: <20140305143357.6984.7729.stgit@Solace>
by means of a new hypercal, XEN_DOMCTL_numainfo, doing something
similar to what XEN_SYSCTL_numainfo does, but on a per domain basis.
Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
---
xen/common/domctl.c | 45 +++++++++++++++++++++++++++++++++++
xen/include/public/domctl.h | 22 +++++++++++++++++
xen/xsm/flask/hooks.c | 3 ++
xen/xsm/flask/policy/access_vectors | 2 ++
4 files changed, 72 insertions(+)
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index 7cf610a..96bf326 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -574,6 +574,51 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
}
break;
+ case XEN_DOMCTL_numainfo:
+ {
+ uint32_t node, max_node_index, last_online_node;
+ xen_domctl_numainfo_t *ni = &op->u.numainfo;
+ uint64_t *memkb_on_node;
+ struct page_info *page;
+
+ /*
+ * We report back info about the min number of nodes between how
+ * much of them the caller can handle and the number of them that
+ * are actually online.
+ */
+ last_online_node = last_node(node_online_map);
+ max_node_index = min_t(uint32_t, ni->max_node_index, last_online_node);
+ ni->max_node_index = max_node_index;
+
+ ret = -ENOMEM;
+ memkb_on_node = xzalloc_array(uint64_t, max_node_index);
+ if ( !memkb_on_node )
+ break;
+
+ spin_lock(&d->page_alloc_lock);
+ page_list_for_each(page, &d->page_list)
+ {
+ node = phys_to_nid((paddr_t)page_to_mfn(page) << PAGE_SHIFT);
+ /* For nodes that are offline, don't touch the counter */
+ if ( node <= max_node_index && node_online(node) )
+ memkb_on_node[node]++;
+ }
+ spin_unlock(&d->page_alloc_lock);
+
+ for ( node = 0; node <= max_node_index; node++ )
+ {
+ memkb_on_node[node] <<= (PAGE_SHIFT-10);
+ if ( copy_to_guest_offset(ni->memkb_on_node, node,
+ &memkb_on_node[node], 1) )
+ break;
+ }
+
+ ret = ((node <= max_node_index) || copy_to_guest(u_domctl, op, 1))
+ ? -EFAULT : 0;
+ xfree(memkb_on_node);
+ }
+ break;
+
case XEN_DOMCTL_destroydomain:
{
ret = domain_kill(d);
diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h
index f22fe2e..a455d78 100644
--- a/xen/include/public/domctl.h
+++ b/xen/include/public/domctl.h
@@ -315,6 +315,26 @@ typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t;
DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t);
+/* XEN_DOMCTL_numainfo */
+struct xen_domctl_numainfo {
+ /*
+ * IN: maximum addressable entry in the caller-provided arrays.
+ * OUT: minimum between the maximum addressable entry in the
+ * caller-provided arrays and largest online node identifier
+ * in the system.
+ */
+ uint32_t max_node_index;
+
+ /*
+ * OUT: memory, in Kb, on each node. i-eth element equal to 0 means
+ * either "no memory on node i" or "node i offline".
+ */
+ XEN_GUEST_HANDLE_64(uint64) memkb_on_node;
+};
+typedef struct xen_domctl_numainfo xen_domctl_numainfo_t;
+DEFINE_XEN_GUEST_HANDLE(xen_domctl_numainfo_t);
+
+
/* XEN_DOMCTL_scheduler_op */
/* Scheduler types. */
#define XEN_SCHEDULER_SEDF 4
@@ -966,6 +986,7 @@ struct xen_domctl {
#define XEN_DOMCTL_getnodeaffinity 69
#define XEN_DOMCTL_set_max_evtchn 70
#define XEN_DOMCTL_cacheflush 71
+#define XEN_DOMCTL_numainfo 72
#define XEN_DOMCTL_gdbsx_guestmemio 1000
#define XEN_DOMCTL_gdbsx_pausevcpu 1001
#define XEN_DOMCTL_gdbsx_unpausevcpu 1002
@@ -986,6 +1007,7 @@ struct xen_domctl {
struct xen_domctl_vcpucontext vcpucontext;
struct xen_domctl_getvcpuinfo getvcpuinfo;
struct xen_domctl_max_vcpus max_vcpus;
+ struct xen_domctl_numainfo numainfo;
struct xen_domctl_scheduler_op scheduler_op;
struct xen_domctl_setdomainhandle setdomainhandle;
struct xen_domctl_setdebugging setdebugging;
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index 96276ac..edc1d34 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -727,6 +727,9 @@ static int flask_domctl(struct domain *d, int cmd)
case XEN_DOMCTL_cacheflush:
return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__CACHEFLUSH);
+ case XEN_DOMCTL_numainfo:
+ return current_has_perm(d, SECCLASS_DOMAIN2, DOMAIN2__NUMAINFO);
+
default:
printk("flask_domctl: Unknown op %d\n", cmd);
return -EPERM;
diff --git a/xen/xsm/flask/policy/access_vectors b/xen/xsm/flask/policy/access_vectors
index a0ed13d..e218992 100644
--- a/xen/xsm/flask/policy/access_vectors
+++ b/xen/xsm/flask/policy/access_vectors
@@ -198,6 +198,8 @@ class domain2
set_max_evtchn
# XEN_DOMCTL_cacheflush
cacheflush
+# XEN_DOMCTL_numainfo
+ numainfo
}
# Similar to class domain, but primarily contains domctls related to HVM domains
next prev parent reply other threads:[~2014-03-05 14:36 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-05 14:36 [PATCH 0/4] report how much memory a domain has on each NUMA node Dario Faggioli
2014-03-05 14:36 ` Dario Faggioli [this message]
2014-03-05 14:50 ` [PATCH 1/4] xen: " Juergen Gross
2014-03-05 16:31 ` Dario Faggioli
2014-03-05 16:49 ` Jan Beulich
2014-03-05 17:14 ` Dario Faggioli
2014-03-05 15:04 ` Jan Beulich
2014-03-05 16:13 ` Dario Faggioli
2014-03-05 16:44 ` Jan Beulich
2014-03-05 14:36 ` [PATCH 2/4] libxc: " Dario Faggioli
2014-03-05 15:05 ` Andrew Cooper
2014-03-05 15:40 ` Dario Faggioli
2014-03-10 16:39 ` Ian Jackson
2014-03-10 17:07 ` Dario Faggioli
2014-03-10 17:09 ` Andrew Cooper
2014-03-10 17:20 ` Ian Jackson
2014-03-10 17:35 ` Dario Faggioli
2014-03-11 11:15 ` Ian Jackson
2014-03-11 17:37 ` Dario Faggioli
2014-03-11 18:16 ` Ian Jackson
2014-03-11 19:04 ` Dario Faggioli
2014-03-13 11:54 ` George Dunlap
2014-03-05 14:36 ` [PATCH 3/4] libxl: " Dario Faggioli
2014-03-10 16:40 ` Ian Jackson
2014-03-10 17:28 ` Dario Faggioli
2014-03-13 17:26 ` Ian Jackson
2014-03-05 14:36 ` [PATCH 4/4] xl: " Dario Faggioli
2014-03-10 16:42 ` Ian Jackson
2014-03-10 17:09 ` Dario Faggioli
2014-03-05 14:40 ` [PATCH 0/4] " Juergen Gross
2014-03-05 14:44 ` Dario Faggioli
2014-03-10 16:37 ` Ian Jackson
2014-03-10 17:12 ` Dario Faggioli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140305143625.6984.3763.stgit@Solace \
--to=dario.faggioli@citrix.com \
--cc=Ian.Campbell@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=JBeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=dgdegra@tycho.nsa.gov \
--cc=juergen.gross@ts.fujitsu.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).