From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH v5 12/24] hvmloader: retrieve vNUMA information from hypervisor Date: Fri, 13 Feb 2015 15:58:53 +0000 Message-ID: <54DE1F3D.8060605@citrix.com> References: <1423770294-9779-1-git-send-email-wei.liu2@citrix.com> <1423770294-9779-13-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1423770294-9779-13-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Wei Liu , xen-devel@lists.xen.org Cc: dario.faggioli@citrix.com, JBeulich@suse.com, ian.jackson@eu.citrix.com, ian.campbell@citrix.com, ufimtseva@gmail.com List-Id: xen-devel@lists.xenproject.org On 12/02/15 19:44, Wei Liu wrote: > Hvmloader issues XENMEM_get_vnumainfo hypercall and stores the > information retrieved in scratch space for later use. > > Signed-off-by: Wei Liu > Cc: Jan Beulich > --- > Changes in v5: > 1. Group scratch_alloc togeter. > 2. Use memset. > 3. Drop unnecessary "return"; > 4. Rebase onto Jan's errno ABI change. > > Changes in v4: > 1. Use *vnode_to_pnode to calculate size. > 2. Remove loop. > > Changes in v3: > 1. Move init_vnuma_info before ACPI stuff. > 2. Fix errno.h inclusion. > 3. Remove upper limits and use loop. > --- > tools/firmware/hvmloader/Makefile | 2 +- > tools/firmware/hvmloader/hvmloader.c | 3 ++ > tools/firmware/hvmloader/vnuma.c | 84 ++++++++++++++++++++++++++++++++++++ > tools/firmware/hvmloader/vnuma.h | 52 ++++++++++++++++++++++ > 4 files changed, 140 insertions(+), 1 deletion(-) > create mode 100644 tools/firmware/hvmloader/vnuma.c > create mode 100644 tools/firmware/hvmloader/vnuma.h > > diff --git a/tools/firmware/hvmloader/Makefile b/tools/firmware/hvmloader/Makefile > index b759e81..cf967fd 100644 > --- a/tools/firmware/hvmloader/Makefile > +++ b/tools/firmware/hvmloader/Makefile > @@ -29,7 +29,7 @@ LOADADDR = 0x100000 > CFLAGS += $(CFLAGS_xeninclude) > > OBJS = hvmloader.o mp_tables.o util.o smbios.o > -OBJS += smp.o cacheattr.o xenbus.o > +OBJS += smp.o cacheattr.o xenbus.o vnuma.o > OBJS += e820.o pci.o pir.o ctype.o > OBJS += hvm_param.o > ifeq ($(debug),y) > diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c > index 7b0da38..25b7f08 100644 > --- a/tools/firmware/hvmloader/hvmloader.c > +++ b/tools/firmware/hvmloader/hvmloader.c > @@ -26,6 +26,7 @@ > #include "pci_regs.h" > #include "apic_regs.h" > #include "acpi/acpi2_0.h" > +#include "vnuma.h" > #include > #include > > @@ -310,6 +311,8 @@ int main(void) > > if ( acpi_enabled ) > { > + init_vnuma_info(); > + > if ( bios->acpi_build_tables ) > { > printf("Loading ACPI ...\n"); > diff --git a/tools/firmware/hvmloader/vnuma.c b/tools/firmware/hvmloader/vnuma.c > new file mode 100644 > index 0000000..a71d31a > --- /dev/null > +++ b/tools/firmware/hvmloader/vnuma.c > @@ -0,0 +1,84 @@ > +/* > + * vnuma.c: obtain vNUMA information from hypervisor > + * > + * Copyright (c) 2014 Wei Liu, Citrix Systems (R&D) Ltd. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * > + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE > + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL > + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT > + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY > + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > + * SUCH DAMAGE. > + */ > + > +#include "util.h" > +#include "hypercall.h" > +#include "vnuma.h" > +#include > + > +unsigned int nr_vnodes, nr_vmemranges; > +unsigned int *vcpu_to_vnode, *vdistance; > +xen_vmemrange_t *vmemrange; > + > +void init_vnuma_info(void) > +{ > + int rc; > + struct xen_vnuma_topology_info vnuma_topo; > + > + memset(&vnuma_topo, 0, sizeof(vnuma_topo)); > + vnuma_topo.domid = DOMID_SELF; struct xen_vnuma_topology_info vnum_topo = { .domid = DOMID_SELF }; Might as well use C99 features to your advantage. Otherwise, Reviewed-by: Andrew Cooper > + > + rc = hypercall_memory_op(XENMEM_get_vnumainfo, &vnuma_topo); > + > + if ( rc != -XEN_ENOBUFS ) > + return; > + > + ASSERT(vnuma_topo.nr_vcpus == hvm_info->nr_vcpus); > + > + vcpu_to_vnode = > + scratch_alloc(sizeof(*vcpu_to_vnode) * hvm_info->nr_vcpus, 0); > + vdistance = scratch_alloc(sizeof(uint32_t) * vnuma_topo.nr_vnodes * > + vnuma_topo.nr_vnodes, 0); > + vmemrange = scratch_alloc(sizeof(xen_vmemrange_t) * > + vnuma_topo.nr_vmemranges, 0); > + > + set_xen_guest_handle(vnuma_topo.vdistance.h, vdistance); > + set_xen_guest_handle(vnuma_topo.vcpu_to_vnode.h, vcpu_to_vnode); > + set_xen_guest_handle(vnuma_topo.vmemrange.h, vmemrange); > + > + rc = hypercall_memory_op(XENMEM_get_vnumainfo, &vnuma_topo); > + > + if ( rc < 0 ) > + { > + printf("Failed to retrieve vNUMA information, rc = %d\n", rc); > + return; > + } > + > + nr_vnodes = vnuma_topo.nr_vnodes; > + nr_vmemranges = vnuma_topo.nr_vmemranges; > +} > + > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + */ > diff --git a/tools/firmware/hvmloader/vnuma.h b/tools/firmware/hvmloader/vnuma.h > new file mode 100644 > index 0000000..63b648a > --- /dev/null > +++ b/tools/firmware/hvmloader/vnuma.h > @@ -0,0 +1,52 @@ > +/****************************************************************************** > + * vnuma.h > + * > + * Copyright (c) 2014, Wei Liu > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License version 2 > + * as published by the Free Software Foundation; or, when distributed > + * separately from the Linux kernel or incorporated into other > + * software packages, subject to the following license: > + * > + * Permission is hereby granted, free of charge, to any person obtaining a copy > + * of this source file (the "Software"), to deal in the Software without > + * restriction, including without limitation the rights to use, copy, modify, > + * merge, publish, distribute, sublicense, and/or sell copies of the Software, > + * and to permit persons to whom the Software is furnished to do so, subject to > + * the following conditions: > + * > + * The above copyright notice and this permission notice shall be included in > + * all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE > + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS > + * IN THE SOFTWARE. > + */ > + > +#ifndef __HVMLOADER_VNUMA_H__ > +#define __HVMLOADER_VNUMA_H__ > + > +#include > + > +extern unsigned int nr_vnodes, nr_vmemranges; > +extern unsigned int *vcpu_to_vnode, *vdistance; > +extern xen_vmemrange_t *vmemrange; > + > +void init_vnuma_info(void); > + > +#endif /* __HVMLOADER_VNUMA_H__ */ > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + */