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.

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@citrix.com>
This commit is contained in:
Andrew Cooper authored and Jan Beulich committed 2015-01-22 12:58:47 +01:00
1 parent ee533a3173
commit 2e6fc2db9f
1 file changed
+12 -23
+12 -23
View File
@@ -362,10 +362,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 +371,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 +396,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 +406,11 @@ 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 )
if ( !pagetable_is_null(v->arch.guest_table) )
release_compat_l4(v);
return rc;
}
int vcpu_initialise(struct vcpu *v)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.