[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/domain: Improvements to switch_native() and switch_compat()
Both are called with known-good domains, making the NULL check redundant. Both also have open-coded forms of for_each_vcpu() which are replaced. To aid the cleanup in switch_compat(), release_compat_l4() is updated to make it safe to call on a vcpu without an existing compat l4. Finally, switch_compat() is updated to propagate the error from set_compat_l4(), rather than automatically overriding with -ENOMEM. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CC: Keir Fraser <keir@xxxxxxx> CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Tim Deegan <tim@xxxxxxx> --- xen/arch/x86/domain.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index c8832c6..b7196d8 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -349,6 +349,8 @@ static int setup_compat_l4(struct vcpu *v) static void release_compat_l4(struct vcpu *v) { + if ( pagetable_is_null(v->arch.guest_table) ) + return; free_compat_arg_xlat(v); free_domheap_page(pagetable_get_page(v->arch.guest_table)); v->arch.guest_table = pagetable_null(); @@ -362,10 +364,8 @@ static inline int may_switch_mode(struct domain *d) int switch_native(struct domain *d) { - unsigned int vcpuid; + struct vcpu *v; - if ( d == NULL ) - return -EINVAL; if ( !may_switch_mode(d) ) return -EACCES; if ( !is_pv_32on64_domain(d) ) @@ -373,21 +373,16 @@ int switch_native(struct domain *d) d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0; - for ( vcpuid = 0; vcpuid < d->max_vcpus; vcpuid++ ) - { - if (d->vcpu[vcpuid]) - release_compat_l4(d->vcpu[vcpuid]); - } + for_each_vcpu( d, v ) + release_compat_l4(v); return 0; } int switch_compat(struct domain *d) { - unsigned int vcpuid; - - if ( d == NULL ) - return -EINVAL; + struct vcpu *v; + int rc; if ( is_pvh_domain(d) ) { @@ -403,12 +398,9 @@ int switch_compat(struct domain *d) d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 1; - for ( vcpuid = 0; vcpuid < d->max_vcpus; vcpuid++ ) - { - if ( (d->vcpu[vcpuid] != NULL) && - (setup_compat_l4(d->vcpu[vcpuid]) != 0) ) + for_each_vcpu( d, v ) + if ( (rc = setup_compat_l4(v)) ) goto undo_and_fail; - } domain_set_alloc_bitsize(d); @@ -416,12 +408,10 @@ int switch_compat(struct domain *d) undo_and_fail: d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0; - while ( vcpuid-- != 0 ) - { - if ( d->vcpu[vcpuid] != NULL ) - release_compat_l4(d->vcpu[vcpuid]); - } - return -ENOMEM; + for_each_vcpu( d, v ) + release_compat_l4(v); + + return rc; } int vcpu_initialise(struct vcpu *v) -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |