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

[Xen-devel] [PATCH v8 05/11] viridian: extend init/deinit hooks into synic and time modules


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Paul Durrant <paul.durrant@xxxxxxxxxx>
  • Date: Mon, 18 Mar 2019 11:20:53 +0000
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Paul Durrant <paul.durrant@xxxxxxxxxx>, Wei Liu <wei.liu2@xxxxxxxxxx>, Jan Beulich <jbeulich@xxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Delivery-date: Mon, 18 Mar 2019 11:21:15 +0000
  • Ironport-data: A9a23:jRPNPaKLGwOZpclpFE//H55y5QJLeRNeAxBEl0ilJc3Isx7Jjk8ll/ eKhcseUHWqctO5wvWdbBv4QUJf4NkY40E2L4irnjHm4IMRpuxqUfQLyN7dleeD1b5TxFgsW5 3pJS1n5+5sPNGWQhxJvZhNSLE21/ldzBPBXGEk7V2YpeSKJMalSdEiLM82EaXt8YVk+CzEko m9moG/bqodR+XKmDPGkm2WTJ1WrCmKyHwKld/L5QWXsqbWw1JOdt0NGUotNwHpOoaHoDyItw OfRjIlqgLW9vuGzeaIJ47YNAEjEpC723D3+jeQkHqsRxBx10xGJiydZqu8nL8O8cV9IWTxmn wjFXw75WLX48WMqWHd1eW0r/kHcP7VltJc0xPqnAHtmokxjNRF4bHkTRE7kee/Nd5jWzxcS9 p1iQkT5BKxMYbU8MvnJ35Xx2y4tCvHC/OtoOB+nYZwwqXzEVOvvlBAzC8xRpcw3++WyaaZ4N lIiSjrke/XXfKRRUtHM78JwEFrkYBnx3Z1CYQUbBvCr4t/dUqgBGyZLMVUqh97v91LEAIrtG jOvO8E3v/xPugF+0iLr3LMRg251ZyvWW/IWJm+AejfF0m6Sv6VcZRnrrA08KKzwkbLG7CUWi oaigd1eZjawYBoy4mhQUGsGky/f5zD7dhImLhPVYUiejVoh7HWxs91wls7LQ3CjLP8FQzK+1 Ua+qPEM0SotDI56fewtff7mnKSqDKMTXnSxagDC+lxaCGvTVeGsPVs4VQuR/JaDUhAkkVFlg Vts38ogcPxXljCBxPv8pPyTs9vUBxHJ8/6iXkGdKdHQMfgp79yPEmkdNSFimSeLzzp1S6fp2 fQLV/IqMUjnXhyIDS2lNpDU8yonk1ANVc8WipQHo/h1+0gvO99374w6pXd+c1Y+wVYVwLYyd oOtw1c5e1QzqVSpvJDaB/Dd6i03p7e9yfWY/2CWTcMx91pr1PEGtnpxXWWNqsoehWg1g9erp qWcQTYhfMKuJaR6ipkBfyxaot2MKedN7e5My9TmClPDj6exl/+3abb7kM4B1ce2i23VmxCjz Fi5mW29HvHVXAkvtS5nKyD6j+azi/T4qef/wo+AVdfovuIirrcYaqHA6mrtI07Ivf9ABGhiC rQ9rgoWFpYOv7+RMbz+jtUT8irSHI2s1a0xVuKMpXDQy3X8ETtTPQIwRgQXg8C5hd9cgKxRf SF+ELDt3J+2PuwQ8M3Bi+86mOJ83Pu5i+psE0N7lAvkZ/kxHnv6E3yOXZKSoLySd8l0N+ktt AXYpyUpA2D/Ow4KC2gRGM5tDXgzs/+Q7VmyMvrpFqi6O55tTMjlx8YmG7Bybfp6LEv8dGNbR L1ExLNuqeaitg0KDPbZ8YYKrdboGV5idfWMDNCGjQvp3erCtVefhR0Z2YZCvMnH5QT3zCbix sa2UppNHyaatQn5BrqekH1JlufcA34Eejyv5gCOuNXeaY5Z6HYXv6xwJrG77oaZaCPLsPVyj cNX98DKVqRvVZycUqu0h2KzkVkbbacgaOdvmW6i87psKekEcoXjCtEwL4p8QEXaRVCPUX1h1 NKoMU//ZiyuIK8qG5+6LLHrzoljMjXNOScL4ktRLzdDFU69LkMvtcL28nG8nJ8mK3Y6xv+3H aGpBW3Czbw49p0C+aUkrN+iYVMJi+BKJYl2KSfwdUGCmV+IWqCQcJWuxAl8GENO9O9TMyXGL L1ZJlKL9eJv6YUCiKgqlgb5h2q9zQtZ9KExcNtmhi9fCZjJSFbcRFTl9I4mdUO/KFLnall/i ZUYOUmWRYh0JaybC5GPdb3oICoGRrnL3aXZ8S/K6QcWOQouk3B4sfG
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

This patch simply adds domain and vcpu init/deinit hooks into the synic
and time modules and wires them into viridian_[domain|vcpu]_[init|deinit]().
Only one of the hooks is currently needed (to unmap the 'VP Assist' page)
but subsequent patches will make use of the others.

NOTE: To perform the unmap of the VP Assist page,
      viridian_unmap_guest_page() is now directly called in the new
      viridian_synic_vcpu_deinit() function (which is safe even if
      is_viridian_vcpu() evaluates to false). This replaces the slightly
      hacky mechanism of faking a zero write to the
      HV_X64_MSR_VP_ASSIST_PAGE MSR in viridian_cpu_deinit().

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Cc: "Roger Pau Monné" <roger.pau@xxxxxxxxxx>

v4:
 - Constify vcpu and domain pointers

v2:
 - Pay attention to sync and time init hook return values
---
 xen/arch/x86/hvm/viridian/private.h  | 12 +++++++++
 xen/arch/x86/hvm/viridian/synic.c    | 19 ++++++++++++++
 xen/arch/x86/hvm/viridian/time.c     | 18 ++++++++++++++
 xen/arch/x86/hvm/viridian/viridian.c | 37 ++++++++++++++++++++++++++--
 4 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/xen/arch/x86/hvm/viridian/private.h 
b/xen/arch/x86/hvm/viridian/private.h
index 46174f48cd..8c029f62c6 100644
--- a/xen/arch/x86/hvm/viridian/private.h
+++ b/xen/arch/x86/hvm/viridian/private.h
@@ -74,6 +74,12 @@
 int viridian_synic_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val);
 int viridian_synic_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t *val);
 
+int viridian_synic_vcpu_init(const struct vcpu *v);
+int viridian_synic_domain_init(const struct domain *d);
+
+void viridian_synic_vcpu_deinit(const struct vcpu *v);
+void viridian_synic_domain_deinit(const struct domain *d);
+
 void viridian_synic_save_vcpu_ctxt(const struct vcpu *v,
                                    struct hvm_viridian_vcpu_context *ctxt);
 void viridian_synic_load_vcpu_ctxt(
@@ -82,6 +88,12 @@ void viridian_synic_load_vcpu_ctxt(
 int viridian_time_wrmsr(struct vcpu *v, uint32_t idx, uint64_t val);
 int viridian_time_rdmsr(const struct vcpu *v, uint32_t idx, uint64_t *val);
 
+int viridian_time_vcpu_init(const struct vcpu *v);
+int viridian_time_domain_init(const struct domain *d);
+
+void viridian_time_vcpu_deinit(const struct vcpu *v);
+void viridian_time_domain_deinit(const struct domain *d);
+
 void viridian_time_save_domain_ctxt(
     const struct domain *d, struct hvm_viridian_domain_context *ctxt);
 void viridian_time_load_domain_ctxt(
diff --git a/xen/arch/x86/hvm/viridian/synic.c 
b/xen/arch/x86/hvm/viridian/synic.c
index 05d971b365..4b00dbe1b3 100644
--- a/xen/arch/x86/hvm/viridian/synic.c
+++ b/xen/arch/x86/hvm/viridian/synic.c
@@ -146,6 +146,25 @@ int viridian_synic_rdmsr(const struct vcpu *v, uint32_t 
idx, uint64_t *val)
     return X86EMUL_OKAY;
 }
 
+int viridian_synic_vcpu_init(const struct vcpu *v)
+{
+    return 0;
+}
+
+int viridian_synic_domain_init(const struct domain *d)
+{
+    return 0;
+}
+
+void viridian_synic_vcpu_deinit(const struct vcpu *v)
+{
+    viridian_unmap_guest_page(&v->arch.hvm.viridian->vp_assist);
+}
+
+void viridian_synic_domain_deinit(const struct domain *d)
+{
+}
+
 void viridian_synic_save_vcpu_ctxt(const struct vcpu *v,
                                    struct hvm_viridian_vcpu_context *ctxt)
 {
diff --git a/xen/arch/x86/hvm/viridian/time.c b/xen/arch/x86/hvm/viridian/time.c
index 909a3fb9e3..48aca7e0ab 100644
--- a/xen/arch/x86/hvm/viridian/time.c
+++ b/xen/arch/x86/hvm/viridian/time.c
@@ -215,6 +215,24 @@ int viridian_time_rdmsr(const struct vcpu *v, uint32_t 
idx, uint64_t *val)
     return X86EMUL_OKAY;
 }
 
+int viridian_time_vcpu_init(const struct vcpu *v)
+{
+    return 0;
+}
+
+int viridian_time_domain_init(const struct domain *d)
+{
+    return 0;
+}
+
+void viridian_time_vcpu_deinit(const struct vcpu *v)
+{
+}
+
+void viridian_time_domain_deinit(const struct domain *d)
+{
+}
+
 void viridian_time_save_domain_ctxt(
     const struct domain *d, struct hvm_viridian_domain_context *ctxt)
 {
diff --git a/xen/arch/x86/hvm/viridian/viridian.c 
b/xen/arch/x86/hvm/viridian/viridian.c
index 1a20d68aaf..f9a509d918 100644
--- a/xen/arch/x86/hvm/viridian/viridian.c
+++ b/xen/arch/x86/hvm/viridian/viridian.c
@@ -418,22 +418,52 @@ int guest_rdmsr_viridian(const struct vcpu *v, uint32_t 
idx, uint64_t *val)
 
 int viridian_vcpu_init(struct vcpu *v)
 {
+    int rc;
+
     ASSERT(!v->arch.hvm.viridian);
     v->arch.hvm.viridian = xzalloc(struct viridian_vcpu);
     if ( !v->arch.hvm.viridian )
         return -ENOMEM;
 
+    rc = viridian_synic_vcpu_init(v);
+    if ( rc )
+        goto fail;
+
+    rc = viridian_time_vcpu_init(v);
+    if ( rc )
+        goto fail;
+
     return 0;
+
+ fail:
+    viridian_vcpu_deinit(v);
+
+    return rc;
 }
 
 int viridian_domain_init(struct domain *d)
 {
+    int rc;
+
     ASSERT(!d->arch.hvm.viridian);
     d->arch.hvm.viridian = xzalloc(struct viridian_domain);
     if ( !d->arch.hvm.viridian )
         return -ENOMEM;
 
+    rc = viridian_synic_domain_init(d);
+    if ( rc )
+        goto fail;
+
+    rc = viridian_time_domain_init(d);
+    if ( rc )
+        goto fail;
+
     return 0;
+
+ fail:
+    viridian_domain_deinit(d);
+
+    return rc;
 }
 
 void viridian_vcpu_deinit(struct vcpu *v)
@@ -441,8 +471,8 @@ void viridian_vcpu_deinit(struct vcpu *v)
     if ( !v->arch.hvm.viridian )
         return;
 
-    if ( is_viridian_vcpu(v) )
-        viridian_synic_wrmsr(v, HV_X64_MSR_VP_ASSIST_PAGE, 0);
+    viridian_time_vcpu_deinit(v);
+    viridian_synic_vcpu_deinit(v);
 
     XFREE(v->arch.hvm.viridian);
 }
@@ -457,6 +487,9 @@ void viridian_domain_deinit(struct domain *d)
     if ( !d->arch.hvm.viridian )
         return;
 
+    viridian_time_domain_deinit(d);
+    viridian_synic_domain_deinit(d);
+
     XFREE(d->arch.hvm.viridian);
 }
 
-- 
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®.