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

[Xen-changelog] [xen stable-4.2] x86/nhvm: properly clean up after failure to set up all vCPU-s



commit 4b0ac057e3bcae70a109da0610e1dd2e270aec8a
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Thu Mar 7 17:57:02 2013 +0100
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Thu Mar 7 17:57:02 2013 +0100

    x86/nhvm: properly clean up after failure to set up all vCPU-s
    
    Otherwise we may leak memory when setting up nHVM fails half way.
    
    This implies that the individual destroy functions will have to remain
    capable (in the VMX case they first need to be made so, following
    26486:7648ef657fe7 and 26489:83a3fa9c8434) of being called for a vCPU
    that the corresponding init function was never run on.
    
    Once at it, also remove a redundant check from the corresponding
    parameter validation code.
    
    Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
    Acked-by: Tim Deegan <tim@xxxxxxx>
    Tested-by: Olaf Hering <olaf@xxxxxxxxx>
    master changeset: 17281aea1a9a10f1ee165c6e6a2921a67b7b1df2
    master date: 2013-02-22 11:21:38 +0100
---
 xen/arch/x86/hvm/hvm.c       |    8 +++++---
 xen/arch/x86/hvm/nestedhvm.c |    2 +-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 2d4acb1..3d471a5 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -3873,18 +3873,20 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) 
arg)
 #else
                 if ( a.value > 1 )
                     rc = -EINVAL;
-                if ( !is_hvm_domain(d) )
-                    rc = -EINVAL;
                 /* Remove the check below once we have
                  * shadow-on-shadow.
                  */
                 if ( cpu_has_svm && !paging_mode_hap(d) && a.value )
                     rc = -EINVAL;
                 /* Set up NHVM state for any vcpus that are already up */
-                if ( !d->arch.hvm_domain.params[HVM_PARAM_NESTEDHVM] )
+                if ( a.value &&
+                     !d->arch.hvm_domain.params[HVM_PARAM_NESTEDHVM] )
                     for_each_vcpu(d, v)
                         if ( rc == 0 )
                             rc = nestedhvm_vcpu_initialise(v);
+                if ( !a.value || rc )
+                    for_each_vcpu(d, v)
+                        nestedhvm_vcpu_destroy(v);
 #endif
                 break;
             case HVM_PARAM_BUFIOREQ_EVTCHN:
diff --git a/xen/arch/x86/hvm/nestedhvm.c b/xen/arch/x86/hvm/nestedhvm.c
index ba0bb8b..5153a4a 100644
--- a/xen/arch/x86/hvm/nestedhvm.c
+++ b/xen/arch/x86/hvm/nestedhvm.c
@@ -88,7 +88,7 @@ nestedhvm_vcpu_initialise(struct vcpu *v)
 void
 nestedhvm_vcpu_destroy(struct vcpu *v)
 {
-    if ( nestedhvm_enabled(v->domain) && hvm_funcs.nhvm_vcpu_destroy )
+    if ( hvm_funcs.nhvm_vcpu_destroy )
         hvm_funcs.nhvm_vcpu_destroy(v);
 }
 
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.2

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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