58 lines
2.2 KiB
Diff
58 lines
2.2 KiB
Diff
|
# Commit 17281aea1a9a10f1ee165c6e6a2921a67b7b1df2
|
||
|
# Date 2013-02-22 11:21:38 +0100
|
||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
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>
|
||
|
|
||
|
--- a/xen/arch/x86/hvm/hvm.c
|
||
|
+++ b/xen/arch/x86/hvm/hvm.c
|
||
|
@@ -3941,18 +3941,20 @@ long do_hvm_op(unsigned long op, XEN_GUE
|
||
|
#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:
|
||
|
--- 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);
|
||
|
}
|
||
|
|