diff mbox

[v4,12/15] tools: Call XEN_DOMCTL_acpi_access on PVH VCPU hotplug

Message ID 1480433602-13290-13-git-send-email-boris.ostrovsky@oracle.com (mailing list archive)
State New, archived
Headers show

Commit Message

Boris Ostrovsky Nov. 29, 2016, 3:33 p.m. UTC
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 <boris.ostrovsky@oracle.com>
---
Changes in v4:
* New patch

 tools/libxc/include/xenctrl.h | 20 ++++++++++++++++++++
 tools/libxc/xc_domain.c       | 36 ++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl.c           |  8 +++++++-
 tools/libxl/libxl_arch.h      |  4 ++++
 tools/libxl/libxl_arm.c       |  6 ++++++
 tools/libxl/libxl_x86.c       | 21 +++++++++++++++++++++
 6 files changed, 94 insertions(+), 1 deletion(-)

Comments

Wei Liu Dec. 12, 2016, 4:35 p.m. UTC | #1
On Tue, Nov 29, 2016 at 10:33:19AM -0500, Boris Ostrovsky wrote:
[...]
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 33c5e4c..d80ab77 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -5147,8 +5147,14 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap)
>      switch (libxl__domain_type(gc, domid)) {
>      case LIBXL_DOMAIN_TYPE_HVM:
>          switch (libxl__device_model_version_running(gc, domid)) {
> -        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
>          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);
> +                goto out;
> +            }
> +            /* fallthrough */
> +        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:

What is this "fallthrough"? I don't see description for this part in
your doc later.

>              rc = libxl__set_vcpuonline_xenstore(gc, domid, cpumap, &info);
>              break;
>          case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
> diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h
> index 5e1fc60..1869626 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);

No tabs please.

Wei.
Boris Ostrovsky Dec. 12, 2016, 4:47 p.m. UTC | #2
On 12/12/2016 11:35 AM, Wei Liu wrote:
> On Tue, Nov 29, 2016 at 10:33:19AM -0500, Boris Ostrovsky wrote:
> [...]
>> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
>> index 33c5e4c..d80ab77 100644
>> --- a/tools/libxl/libxl.c
>> +++ b/tools/libxl/libxl.c
>> @@ -5147,8 +5147,14 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap)
>>      switch (libxl__domain_type(gc, domid)) {
>>      case LIBXL_DOMAIN_TYPE_HVM:
>>          switch (libxl__device_model_version_running(gc, domid)) {
>> -        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
>>          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);
>> +                goto out;
>> +            }
>> +            /* fallthrough */
>> +        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
> What is this "fallthrough"? I don't see description for this part in
> your doc later.

It is not required for VCPU hotplug to function.I do this for
consistency because otherwise even after hotplug the VCPU is still
marked as offline in xenstore.

Come think of it, maybe we should do this for all guests (which really
means for HVM too)?

-boris

>
>>              rc = libxl__set_vcpuonline_xenstore(gc, domid, cpumap, &info);
>>              break;
>>          case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
>> diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h
>> index 5e1fc60..1869626 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);
> No tabs please.
>
> Wei.
Boris Ostrovsky Dec. 12, 2016, 4:50 p.m. UTC | #3
On 12/12/2016 11:47 AM, Boris Ostrovsky wrote:
>
> Come think of it, maybe we should do this for all guests (which really
> means for HVM too)?

I meant, of course, for qemu-upstream HVM guests too.

-boris
Wei Liu Dec. 12, 2016, 5:09 p.m. UTC | #4
On Mon, Dec 12, 2016 at 11:50:53AM -0500, Boris Ostrovsky wrote:
> On 12/12/2016 11:47 AM, Boris Ostrovsky wrote:
> >
> > Come think of it, maybe we should do this for all guests (which really
> > means for HVM too)?
> 
> I meant, of course, for qemu-upstream HVM guests too.
> 

Fine by me -- but please add a line of comment before the "fallthrough"
to say that this is just indicative.

Wei.
Wei Liu Dec. 12, 2016, 5:13 p.m. UTC | #5
On Mon, Dec 12, 2016 at 12:14:36PM -0500, Boris Ostrovsky wrote:
> On 12/12/2016 12:09 PM, Wei Liu wrote:
> > On Mon, Dec 12, 2016 at 11:50:53AM -0500, Boris Ostrovsky wrote:
> >> On 12/12/2016 11:47 AM, Boris Ostrovsky wrote:
> >>> Come think of it, maybe we should do this for all guests (which really
> >>> means for HVM too)?
> >> I meant, of course, for qemu-upstream HVM guests too.
> >>
> > Fine by me -- but please add a line of comment before the "fallthrough"
> > to say that this is just indicative.
> >
> 
> I think making xenstore update for all guests would be better done in a
> patch of its own since it really doesn't have anything to do with PVH.
> 

That's fine too.

With the tabs removed:

Acked-by: Wei Liu <wei.liu2@citrix.com>

> -boris
Boris Ostrovsky Dec. 12, 2016, 5:14 p.m. UTC | #6
On 12/12/2016 12:09 PM, Wei Liu wrote:
> On Mon, Dec 12, 2016 at 11:50:53AM -0500, Boris Ostrovsky wrote:
>> On 12/12/2016 11:47 AM, Boris Ostrovsky wrote:
>>> Come think of it, maybe we should do this for all guests (which really
>>> means for HVM too)?
>> I meant, of course, for qemu-upstream HVM guests too.
>>
> Fine by me -- but please add a line of comment before the "fallthrough"
> to say that this is just indicative.
>

I think making xenstore update for all guests would be better done in a
patch of its own since it really doesn't have anything to do with PVH.

-boris
diff mbox

Patch

diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
index 2c83544..e4d735f 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..15c5136 100644
--- a/tools/libxc/xc_domain.c
+++ b/tools/libxc/xc_domain.c
@@ -2520,6 +2520,42 @@  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);
+
+    while ( (int)bytes > 0 )
+    {
+        if ( xc_hypercall_bounce_pre(xch, val) )
+            return -1;
+
+        memset(&domctl, 0, sizeof(domctl));
+        domctl.domain = domid;
+        domctl.cmd = XEN_DOMCTL_acpi_access;
+        domctl.u.acpi_access.gas.space_id = space_id;
+        domctl.u.acpi_access.gas.bit_width = (bytes & 31) * 8;
+        domctl.u.acpi_access.gas.bit_offset = 0;
+        domctl.u.acpi_access.gas.address = address;
+        domctl.u.acpi_access.rw = rw;
+        set_xen_guest_handle(domctl.u.acpi_access.val, val);
+
+        if ( do_domctl(xch, &domctl) != 0 )
+            return 1;
+
+        xc_hypercall_bounce_post(xch, val);
+
+        bytes -= 32;
+        address += 32;
+    }
+
+    return 0;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 33c5e4c..d80ab77 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -5147,8 +5147,14 @@  int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap)
     switch (libxl__domain_type(gc, domid)) {
     case LIBXL_DOMAIN_TYPE_HVM:
         switch (libxl__device_model_version_running(gc, domid)) {
-        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
         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);
+                goto out;
+            }
+            /* fallthrough */
+        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
             rc = libxl__set_vcpuonline_xenstore(gc, domid, cpumap, &info);
             break;
         case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
diff --git a/tools/libxl/libxl_arch.h b/tools/libxl/libxl_arch.h
index 5e1fc60..1869626 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..a64af1b 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_x86.c b/tools/libxl/libxl_x86.c
index e1844c8..e31b159 100644
--- a/tools/libxl/libxl_x86.c
+++ b/tools/libxl/libxl_x86.c
@@ -3,6 +3,9 @@ 
 
 #include <xc_dom.h>
 
+#include <xen/arch-x86/xen.h>
+#include <xen/hvm/ioreq.h>
+
 int libxl__arch_domain_prepare_config(libxl__gc *gc,
                                       libxl_domain_config *d_config,
                                       xc_domain_configuration_t *xc_config)
@@ -368,6 +371,24 @@  int libxl__arch_extra_memory(libxl__gc *gc,
     return 0;
 }
 
+int libxl__arch_set_vcpuonline(libxl__gc *gc, uint32_t domid,
+			       libxl_bitmap *cpumap)
+{
+    int rc;
+
+    /*Update VCPU map. */
+    rc = xc_acpi_iowrite(CTX->xch, domid, XEN_ACPI_CPU_MAP,
+                         cpumap->size, cpumap->map);
+    if (!rc) {
+        /* Send an SCI. */
+        uint16_t val = 1 << XEN_GPE0_CPUHP_BIT;
+        rc = xc_acpi_iowrite(CTX->xch, domid, ACPI_GPE0_BLK_ADDRESS_V1,
+                             sizeof(val), &val);
+    }
+
+    return rc;
+}
+
 int libxl__arch_domain_init_hw_description(libxl__gc *gc,
                                            libxl_domain_build_info *info,
                                            libxl__domain_build_state *state,