diff options
author | Jan Beulich <jbeulich@suse.com> | 2013-02-22 11:21:38 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-02-22 11:21:38 +0100 |
commit | 17281aea1a9a10f1ee165c6e6a2921a67b7b1df2 (patch) | |
tree | 285d80f21e8d5efe797cb815f44a6ec9c383d597 /xen/arch/x86/hvm/hvm.c | |
parent | 7f05d3ff7692574f40d0b337d767a216f347dcdb (diff) | |
download | xen-17281aea1a9a10f1ee165c6e6a2921a67b7b1df2.tar.gz xen-17281aea1a9a10f1ee165c6e6a2921a67b7b1df2.tar.bz2 xen-17281aea1a9a10f1ee165c6e6a2921a67b7b1df2.zip |
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@suse.com>
Acked-by: Tim Deegan <tim@xen.org>
Tested-by: Olaf Hering <olaf@aepfle.de>
Diffstat (limited to 'xen/arch/x86/hvm/hvm.c')
-rw-r--r-- | xen/arch/x86/hvm/hvm.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index febbffb982..ea7adf6780 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -3918,18 +3918,20 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg) } 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); break; case HVM_PARAM_BUFIOREQ_EVTCHN: rc = -EINVAL; |