From patchwork Tue Jan 3 14:04:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Ostrovsky X-Patchwork-Id: 9494901 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 7D89460405 for ; Tue, 3 Jan 2017 14:06:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8F98126CF9 for ; Tue, 3 Jan 2017 14:06:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 845BE2711E; Tue, 3 Jan 2017 14:06:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id F334F26CF9 for ; Tue, 3 Jan 2017 14:06:48 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cOPhS-0005WP-7G; Tue, 03 Jan 2017 14:04:26 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cOPhQ-0005Uk-UI for xen-devel@lists.xen.org; Tue, 03 Jan 2017 14:04:25 +0000 Received: from [85.158.143.35] by server-8.bemta-6.messagelabs.com id AC/F5-05787-86FAB685; Tue, 03 Jan 2017 14:04:24 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpnkeJIrShJLcpLzFFi42KZM10+UDd9fXa EwbR12hZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8bun89YC35bVMxd94mtgbFdu4uRk0NIoJ1J 4uA2iy5GLiD7M6PEpyuHmSGcDYwSL+4eY4aomsAocXE5D4jNJmAkcfbodEYQW0RAWuLa58uMI A3MAlsYJe5O2cQCkhAWCJBYOvEMG4jNIqAq0XTjDCuIzSvgJXGj4wHYUAkBOYmb5zrBbE6g+N odN9kglnlK/J3xlAWixliib1YfywRGvgWMDKsY1YtTi8pSi3QN9ZKKMtMzSnITM3N0DQ3M9HJ Ti4sT01NzEpOK9ZLzczcxAgOFAQh2MO587nSIUZKDSUmUN5ohO0KILyk/pTIjsTgjvqg0J7X4 EKMMB4eSBK/HOqCcYFFqempFWmYOMGRh0hIcPEoivF9A0rzFBYm5xZnpEKlTjLoc054tfsokx JKXn5cqJc47AaRIAKQoozQPbgQsfi4xykoJ8zICHSXEU5BalJtZgir/ilGcg1FJmFceZApPZl 4J3KZXQEcwAR2xPQDsiJJEhJRUA2Oyg8Kj33yq97M4Z73TeHGp6U3m0kObqm4mGHySTroklR0 0yZr/gcy0B9m1Kx5MyBby009ryHlVu3DtnbDPXgcK3938J9f2uNzotUmq1p8717x2GIUExEnb Rhm/Vl6oONdoSsPllbafC+SUbly/tiIhbVX603j/0F6DIywBrXUZfwP1C/r6LiqxFGckGmoxF xUnAgBmgs10mgIAAA== X-Env-Sender: boris.ostrovsky@oracle.com X-Msg-Ref: server-10.tower-21.messagelabs.com!1483452261!44277576!1 X-Originating-IP: [156.151.31.81] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMTU2LjE1MS4zMS44MSA9PiAyODgzMzk=\n X-StarScan-Received: X-StarScan-Version: 9.1.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 62743 invoked from network); 3 Jan 2017 14:04:23 -0000 Received: from userp1040.oracle.com (HELO userp1040.oracle.com) (156.151.31.81) by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 3 Jan 2017 14:04:23 -0000 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id v03E4HLt005472 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 3 Jan 2017 14:04:18 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.14.4) with ESMTP id v03E4GcZ003252 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 3 Jan 2017 14:04:17 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id v03E4Gxb032552; Tue, 3 Jan 2017 14:04:16 GMT Received: from ostr-laptop.us.oracle.com (/10.152.23.90) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Jan 2017 06:04:15 -0800 From: Boris Ostrovsky To: xen-devel@lists.xen.org Date: Tue, 3 Jan 2017 09:04:13 -0500 Message-Id: <1483452256-2879-10-git-send-email-boris.ostrovsky@oracle.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1483452256-2879-1-git-send-email-boris.ostrovsky@oracle.com> References: <1483452256-2879-1-git-send-email-boris.ostrovsky@oracle.com> X-Source-IP: aserv0021.oracle.com [141.146.126.233] Cc: wei.liu2@citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, jbeulich@suse.com, Boris Ostrovsky , roger.pau@citrix.com Subject: [Xen-devel] [PATCH v6 09/12] tools: Call XEN_DOMCTL_acpi_access on PVH VCPU hotplug X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Provide libxc interface for accessing ACPI via XEN_DOMCTL_acpi_access. When a VCPU is hot-(un)plugged to/from a PVH guest update VCPU map by writing to ACPI's XEN_ACPI_CPU_MAP register and then set GPE0 status bit in GPE0.status. Signed-off-by: Boris Ostrovsky --- Changes in v6: * Fix xc_acpi_access() by updating the val pointer passed to the hypercall and take some domctl initializers out of the loop * Don't update GPE0 status on VCPU map update as it is no longer necessary tools/libxc/include/xenctrl.h | 20 ++++++++++++++++++++ tools/libxc/xc_domain.c | 41 +++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl.c | 4 ++++ tools/libxl/libxl_arch.h | 4 ++++ tools/libxl/libxl_arm.c | 6 ++++++ tools/libxl/libxl_dom.c | 10 ++++++++++ tools/libxl/libxl_x86.c | 11 +++++++++++ 7 files changed, 96 insertions(+) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 4ab0f57..3d771bc 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2710,6 +2710,26 @@ int xc_livepatch_revert(xc_interface *xch, char *name, uint32_t timeout); int xc_livepatch_unload(xc_interface *xch, char *name, uint32_t timeout); int xc_livepatch_replace(xc_interface *xch, char *name, uint32_t timeout); +int xc_acpi_access(xc_interface *xch, domid_t domid, + uint8_t rw, uint8_t space_id, unsigned long addr, + unsigned int bytes, void *val); + +static inline int xc_acpi_ioread(xc_interface *xch, domid_t domid, + unsigned long port, + unsigned int bytes, void *val) +{ + return xc_acpi_access(xch, domid, XEN_DOMCTL_ACPI_READ, XEN_ACPI_SYSTEM_IO, + port, bytes, val); +} + +static inline int xc_acpi_iowrite(xc_interface *xch, domid_t domid, + unsigned long port, + unsigned int bytes, void *val) +{ + return xc_acpi_access(xch, domid, XEN_DOMCTL_ACPI_WRITE, XEN_ACPI_SYSTEM_IO, + port, bytes, val); +} + /* Compat shims */ #include "xenctrl_compat.h" diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 296b852..ed1dddb 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -2520,6 +2520,47 @@ int xc_domain_soft_reset(xc_interface *xch, domctl.domain = (domid_t)domid; return do_domctl(xch, &domctl); } + +int +xc_acpi_access(xc_interface *xch, domid_t domid, + uint8_t rw, uint8_t space_id, + unsigned long address, unsigned int bytes, void *val) +{ + DECLARE_DOMCTL; + DECLARE_HYPERCALL_BOUNCE(val, bytes, XC_HYPERCALL_BUFFER_BOUNCE_BOTH); + struct xen_domctl_acpi_access *access = &domctl.u.acpi_access; + unsigned int max_bytes = (1U << (sizeof(access->width) * 8)) - 1; + int ret; + + memset(&domctl, 0, sizeof(domctl)); + domctl.domain = domid; + domctl.cmd = XEN_DOMCTL_acpi_access; + access->space_id = space_id; + access->rw = rw; + access->address = address; + + if ( (ret = xc_hypercall_bounce_pre(xch, val)) ) + return ret; + + while ( bytes != 0 ) + { + access->width = bytes < max_bytes ? bytes : max_bytes; + set_xen_guest_handle_offset(domctl.u.acpi_access.val, + val, access->address - address); + + if ( (ret = do_domctl(xch, &domctl)) ) + goto out; + + bytes -= access->width; + access->address += access->width; + } + + out: + xc_hypercall_bounce_post(xch, val); + + return ret; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index bbbb3de..d8306ff 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -5147,7 +5147,11 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) case LIBXL_DOMAIN_TYPE_HVM: switch (libxl__device_model_version_running(gc, domid)) { case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: + break; case LIBXL_DEVICE_MODEL_VERSION_NONE: + rc = libxl__arch_set_vcpuonline(gc, domid, cpumap); + if (rc < 0) + LOGE(ERROR, "Can't change vcpu online map (%d)", rc); break; case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: rc = libxl__set_vcpuonline_qmp(gc, domid, cpumap, &info); diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h index 5e1fc60..9649c21 100644 --- a/tools/libxl/libxl_arch.h +++ b/tools/libxl/libxl_arch.h @@ -71,6 +71,10 @@ int libxl__arch_extra_memory(libxl__gc *gc, const libxl_domain_build_info *info, uint64_t *out); +_hidden +int libxl__arch_set_vcpuonline(libxl__gc *gc, uint32_t domid, + libxl_bitmap *cpumap); + #if defined(__i386__) || defined(__x86_64__) #define LAPIC_BASE_ADDRESS 0xfee00000 diff --git a/tools/libxl/libxl_arm.c b/tools/libxl/libxl_arm.c index d842d88..93dc81e 100644 --- a/tools/libxl/libxl_arm.c +++ b/tools/libxl/libxl_arm.c @@ -126,6 +126,12 @@ out: return rc; } +int libxl__arch_set_vcpuonline(libxl__gc *gc, uint32_t domid, + libxl_bitmap *cpumap) +{ + return ERROR_FAIL; +} + static struct arch_info { const char *guest_type; const char *timer_compat; diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index d519c8d..ca8f7a2 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -309,6 +309,16 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, return ERROR_FAIL; } + if ((info->type == LIBXL_DOMAIN_TYPE_HVM) && + (libxl__device_model_version_running(gc, domid) == + LIBXL_DEVICE_MODEL_VERSION_NONE)) { + rc = libxl__arch_set_vcpuonline(gc, domid, &info->avail_vcpus); + if (rc) { + LOG(ERROR, "Couldn't set available vcpu count (error %d)", rc); + return ERROR_FAIL; + } + } + /* * Check if the domain has any CPU or node affinity already. If not, try * to build up the latter via automatic NUMA placement. In fact, in case diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 5da7504..00c3891 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -3,6 +3,9 @@ #include +#include +#include + int libxl__arch_domain_prepare_config(libxl__gc *gc, libxl_domain_config *d_config, xc_domain_configuration_t *xc_config) @@ -368,6 +371,14 @@ int libxl__arch_extra_memory(libxl__gc *gc, return 0; } +int libxl__arch_set_vcpuonline(libxl__gc *gc, uint32_t domid, + libxl_bitmap *cpumap) +{ + /*Update VCPU map. */ + return xc_acpi_iowrite(CTX->xch, domid, XEN_ACPI_CPU_MAP, + cpumap->size, cpumap->map); +} + int libxl__arch_domain_init_hw_description(libxl__gc *gc, libxl_domain_build_info *info, libxl__domain_build_state *state,