[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/4] xen: report how much memory a domain has on each NUMA node
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@xxxxxxxxxx> --- 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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |