From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH 2/4] libxc: report how much memory a domain has on each NUMA node Date: Wed, 5 Mar 2014 15:05:15 +0000 Message-ID: <53173D2B.1030405@citrix.com> References: <20140305143357.6984.7729.stgit@Solace> <20140305143635.6984.34422.stgit@Solace> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20140305143635.6984.34422.stgit@Solace> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Dario Faggioli Cc: Ian Campbell , Juergen Gross , Ian Jackson , xen-devel , Jan Beulich , Daniel De Graaf List-Id: xen-devel@lists.xenproject.org On 05/03/14 14:36, Dario Faggioli wrote: > by means of a new interface: xc_domain_numainfo(). > > The caller is expected to allocate an array for the call to fill, > with the results of the XEN_DOMCTL_numainfo hypercall. The size of > the array is also passed to the function, which then returns back > the number of elements that have actually been filled by Xen. > > Signed-off-by: Dario Faggioli > --- > tools/libxc/xc_domain.c | 28 ++++++++++++++++++++++++++++ > tools/libxc/xenctrl.h | 18 ++++++++++++++++++ > 2 files changed, 46 insertions(+) > > diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c > index 369c3f3..a2b3c07 100644 > --- a/tools/libxc/xc_domain.c > +++ b/tools/libxc/xc_domain.c > @@ -362,6 +362,34 @@ int xc_domain_getinfo(xc_interface *xch, > return nr_doms; > } > > +int xc_domain_numainfo(xc_interface *xch, uint32_t domid, > + int *max_nodes, uint64_t *memkbs) max_nodes is an unsigned quantity. libxc is quite fast and loose with this, but lets not propage wrongness. > +{ > + DECLARE_DOMCTL; > + DECLARE_HYPERCALL_BOUNCE(memkbs, sizeof(uint64_t) * (*max_nodes), > + XC_HYPERCALL_BUFFER_BOUNCE_OUT); > + int ret = 0; Don't need the initialiser. > + > + if ( xc_hypercall_bounce_pre(xch, memkbs) ) > + { > + PERROR("Could not allocate bounce buffer for DOMCTL_domain_numainfo"); > + return -1; > + } > + > + domctl.cmd = XEN_DOMCTL_numainfo; > + domctl.domain = (domid_t)domid; > + domctl.u.numainfo.max_node_index = *max_nodes - 1; > + set_xen_guest_handle(domctl.u.numainfo.memkb_on_node, memkbs); > + > + ret = do_domctl(xch, &domctl); > + > + *max_nodes = domctl.u.numainfo.max_node_index + 1; If the domctl fails, this should not be written back to *max_nodes. ~Andrew > + > + xc_hypercall_bounce_post(xch, memkbs); > + > + return ret; > +} > + > int xc_domain_getinfolist(xc_interface *xch, > uint32_t first_domain, > unsigned int max_domains, > diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h > index 13f816b..845d183 100644 > --- a/tools/libxc/xenctrl.h > +++ b/tools/libxc/xenctrl.h > @@ -657,6 +657,24 @@ int xc_domain_getinfolist(xc_interface *xch, > xc_domaininfo_t *info); > > /** > + * This function tells how much memory a domain has allocated on each > + * online NUMA node of the host. The information is stored in an array > + * that the caller provides, along with its size. The function updates > + * the latter parameter with the number of elements in the array that > + * have been actually filled. > + * > + * @param xch a handle to an open hypervisor interface > + * @param domid the domain id for which we want the information > + * @param max_nodes as an input, the size of the memkbs array; as an > + * output, the number of filled elements in it > + * @param memkbs an array with, in the i-eth element, the memory, in > + * Kb, allocated for the domain on the i-eth NUMA node > + * @return 0 on success, -1 on failure > + */ > +int xc_domain_numainfo(xc_interface *xch, uint32_t domid, > + int *max_nodes, uint64_t *memkbs); > + > +/** > * This function set p2m for broken page > * &parm xch a handle to an open hypervisor interface > * @parm domid the domain id which broken page belong to >