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 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.