mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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:
1 parent
ee533a3173
commit
2e6fc2db9f
1 file changed
+12
-23
+12
-23
@@ -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)
|
||||
|
||||