[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v8 11/11] viridian: add implementation of the HvSendSyntheticClusterIpi hypercall


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Paul Durrant <paul.durrant@xxxxxxxxxx>
  • Date: Mon, 18 Mar 2019 11:20:59 +0000
  • Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>, Wei Liu <wei.liu2@xxxxxxxxxx>, Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>, George Dunlap <George.Dunlap@xxxxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Ian Jackson <ian.jackson@xxxxxxxxxxxxx>, Tim Deegan <tim@xxxxxxx>, Julien Grall <julien.grall@xxxxxxx>, Paul Durrant <paul.durrant@xxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Delivery-date: Mon, 18 Mar 2019 11:27:43 +0000
  • Ironport-data: A9a23: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 HDtqMjRMaCfu1gg+raeccrbw==
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

This patch adds an implementation of the hypercall as documented in the
specification [1], section 10.5.2. This enlightenment, as with others, is
advertised by CPUID leaf 0x40000004 and is under control of a new
'hcall_ipi' option in libxl.

If used, this enlightenment should mean the guest only takes a single VMEXIT
to issue IPIs to multiple vCPUs rather than the multiple VMEXITs that would
result from using the emulated local APIC.

[1] 
https://github.com/MicrosoftDocs/Virtualization-Documentation/raw/live/tlfs/Hypervisor%20Top%20Level%20Functional%20Specification%20v5.0C.pdf

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Cc: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
Cc: Julien Grall <julien.grall@xxxxxxx>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
Cc: Tim Deegan <tim@xxxxxxx>
Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx>

v4:
 - Address comments from Jan

v3:
 - New in v3
---
 docs/man/xl.cfg.5.pod.in             |  6 +++
 tools/libxl/libxl.h                  |  6 +++
 tools/libxl/libxl_dom.c              |  3 ++
 tools/libxl/libxl_types.idl          |  1 +
 xen/arch/x86/hvm/viridian/viridian.c | 63 ++++++++++++++++++++++++++++
 xen/include/public/hvm/params.h      |  7 +++-
 6 files changed, 85 insertions(+), 1 deletion(-)

diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in
index 355c654693..c7d70e618b 100644
--- a/docs/man/xl.cfg.5.pod.in
+++ b/docs/man/xl.cfg.5.pod.in
@@ -2175,6 +2175,12 @@ ticks and hence enabling this group will ensure that 
ticks will be
 consistent with use of an enlightened time source (B<time_ref_count> or
 B<reference_tsc>).
 
+=item B<hcall_ipi>
+
+This set incorporates use of a hypercall for interprocessor interrupts.
+This enlightenment may improve performance of Windows guests with multiple
+virtual CPUs.
+
 =item B<defaults>
 
 This is a special value that enables the default set of groups, which
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index c8f219b0d3..482499a6c0 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -330,6 +330,12 @@
  */
 #define LIBXL_HAVE_VIRIDIAN_STIMER 1
 
+/*
+ * LIBXL_HAVE_VIRIDIAN_HCALL_IPI indicates that the 'hcall_ipi' value
+ * is present in the viridian enlightenment enumeration.
+ */
+#define LIBXL_HAVE_VIRIDIAN_HCALL_IPI 1
+
 /*
  * LIBXL_HAVE_BUILDINFO_HVM_ACPI_LAPTOP_SLATE indicates that
  * libxl_domain_build_info has the u.hvm.acpi_laptop_slate field.
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 2ee0f82ee7..879c806139 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -324,6 +324,9 @@ static int hvm_set_viridian_features(libxl__gc *gc, 
uint32_t domid,
     if (libxl_bitmap_test(&enlightenments, 
LIBXL_VIRIDIAN_ENLIGHTENMENT_STIMER))
         mask |= HVMPV_time_ref_count | HVMPV_synic | HVMPV_stimer;
 
+    if (libxl_bitmap_test(&enlightenments, 
LIBXL_VIRIDIAN_ENLIGHTENMENT_HCALL_IPI))
+        mask |= HVMPV_hcall_ipi;
+
     if (mask != 0 &&
         xc_hvm_param_set(CTX->xch,
                          domid,
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 1cce249de4..cb4702fd7a 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -237,6 +237,7 @@ libxl_viridian_enlightenment = 
Enumeration("viridian_enlightenment", [
     (6, "crash_ctl"),
     (7, "synic"),
     (8, "stimer"),
+    (9, "hcall_ipi"),
     ])
 
 libxl_hdtype = Enumeration("hdtype", [
diff --git a/xen/arch/x86/hvm/viridian/viridian.c 
b/xen/arch/x86/hvm/viridian/viridian.c
index dce648bb4e..4b06b78a27 100644
--- a/xen/arch/x86/hvm/viridian/viridian.c
+++ b/xen/arch/x86/hvm/viridian/viridian.c
@@ -28,6 +28,7 @@
 #define HvFlushVirtualAddressSpace 0x0002
 #define HvFlushVirtualAddressList  0x0003
 #define HvNotifyLongSpinWait       0x0008
+#define HvSendSyntheticClusterIpi  0x000b
 #define HvGetPartitionId           0x0046
 #define HvExtCallQueryCapabilities 0x8001
 
@@ -95,6 +96,7 @@ typedef union _HV_CRASH_CTL_REG_CONTENTS
 #define CPUID4A_HCALL_REMOTE_TLB_FLUSH (1 << 2)
 #define CPUID4A_MSR_BASED_APIC         (1 << 3)
 #define CPUID4A_RELAX_TIMER_INT        (1 << 5)
+#define CPUID4A_SYNTHETIC_CLUSTER_IPI  (1 << 10)
 
 /* Viridian CPUID leaf 6: Implementation HW features detected and in use */
 #define CPUID6A_APIC_OVERLAY    (1 << 0)
@@ -206,6 +208,8 @@ void cpuid_viridian_leaves(const struct vcpu *v, uint32_t 
leaf,
             res->a |= CPUID4A_HCALL_REMOTE_TLB_FLUSH;
         if ( !cpu_has_vmx_apic_reg_virt )
             res->a |= CPUID4A_MSR_BASED_APIC;
+        if ( viridian_feature_mask(d) & HVMPV_hcall_ipi )
+            res->a |= CPUID4A_SYNTHETIC_CLUSTER_IPI;
 
         /*
          * This value is the recommended number of attempts to try to
@@ -628,6 +632,65 @@ int viridian_hypercall(struct cpu_user_regs *regs)
         break;
     }
 
+    case HvSendSyntheticClusterIpi:
+    {
+        struct vcpu *v;
+        uint32_t vector;
+        uint64_t vcpu_mask;
+
+        status = HV_STATUS_INVALID_PARAMETER;
+
+        /* Get input parameters. */
+        if ( input.fast )
+        {
+            if ( input_params_gpa >> 32 )
+                break;
+
+            vector = input_params_gpa;
+            vcpu_mask = output_params_gpa;
+        }
+        else
+        {
+            struct {
+                uint32_t vector;
+                uint8_t target_vtl;
+                uint8_t reserved_zero[3];
+                uint64_t vcpu_mask;
+            } input_params;
+
+            if ( hvm_copy_from_guest_phys(&input_params, input_params_gpa,
+                                          sizeof(input_params)) !=
+                 HVMTRANS_okay )
+                break;
+
+            if ( input_params.target_vtl ||
+                 input_params.reserved_zero[0] ||
+                 input_params.reserved_zero[1] ||
+                 input_params.reserved_zero[2] )
+                break;
+
+            vector = input_params.vector;
+            vcpu_mask = input_params.vcpu_mask;
+        }
+
+        if ( vector < 0x10 || vector > 0xff )
+            break;
+
+        for_each_vcpu ( currd, v )
+        {
+            if ( v->vcpu_id >= (sizeof(vcpu_mask) * 8) )
+                break;
+
+            if ( !(vcpu_mask & (1ul << v->vcpu_id)) )
+                continue;
+
+            vlapic_set_irq(vcpu_vlapic(v), vector, 0);
+        }
+
+        status = HV_STATUS_SUCCESS;
+        break;
+    }
+
     default:
         gprintk(XENLOG_WARNING, "unimplemented hypercall %04x\n",
                 input.call_code);
diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
index e06b0942d0..36832e4b94 100644
--- a/xen/include/public/hvm/params.h
+++ b/xen/include/public/hvm/params.h
@@ -154,6 +154,10 @@
 #define _HVMPV_stimer 8
 #define HVMPV_stimer (1 << _HVMPV_stimer)
 
+/* Use Synthetic Cluster IPI Hypercall */
+#define _HVMPV_hcall_ipi 9
+#define HVMPV_hcall_ipi (1 << _HVMPV_hcall_ipi)
+
 #define HVMPV_feature_mask \
         (HVMPV_base_freq | \
          HVMPV_no_freq | \
@@ -163,7 +167,8 @@
          HVMPV_apic_assist | \
          HVMPV_crash_ctl | \
          HVMPV_synic | \
-         HVMPV_stimer)
+         HVMPV_stimer | \
+         HVMPV_hcall_ipi)
 
 #endif
 
-- 
2.20.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.