From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH v5 12/24] hvmloader: retrieve vNUMA information from hypervisor Date: Thu, 12 Feb 2015 19:44:42 +0000 Message-ID: <1423770294-9779-13-git-send-email-wei.liu2@citrix.com> References: <1423770294-9779-1-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-1-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: xen-devel@lists.xen.org Cc: Wei Liu , ian.campbell@citrix.com, andrew.cooper3@citrix.com, dario.faggioli@citrix.com, ian.jackson@eu.citrix.com, JBeulich@suse.com, ufimtseva@gmail.com List-Id: xen-devel@lists.xenproject.org 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; + + 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: + */ -- 1.9.1