xen/vcpu: Introduce vcpu_destroy()

Like _domain_destroy(), this will eventually idempotently free all parts of a
struct vcpu.

While breaking apart the failure path of vcpu_create(), rework the codeflow to
be in a line at the end of the function for clarity.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
Andrew Cooper committed 2018-09-17 12:53:09 +01:00
1 parent 880a4a808f
commit 1ffeb99669
1 file changed
+22 -20
+22 -20
View File
@@ -123,6 +123,16 @@ static void vcpu_info_reset(struct vcpu *v)
v->vcpu_info_mfn = INVALID_MFN;
}
static void vcpu_destroy(struct vcpu *v)
{
free_cpumask_var(v->cpu_hard_affinity);
free_cpumask_var(v->cpu_hard_affinity_tmp);
free_cpumask_var(v->cpu_hard_affinity_saved);
free_cpumask_var(v->cpu_soft_affinity);
free_vcpu_struct(v);
}
struct vcpu *vcpu_create(
struct domain *d, unsigned int vcpu_id, unsigned int cpu_id)
{
@@ -147,7 +157,7 @@ struct vcpu *vcpu_create(
!zalloc_cpumask_var(&v->cpu_hard_affinity_tmp) ||
!zalloc_cpumask_var(&v->cpu_hard_affinity_saved) ||
!zalloc_cpumask_var(&v->cpu_soft_affinity) )
goto fail_free;
goto fail;
if ( is_idle_domain(d) )
{
@@ -166,18 +176,7 @@ struct vcpu *vcpu_create(
goto fail_wq;
if ( arch_vcpu_create(v) != 0 )
{
sched_destroy_vcpu(v);
fail_wq:
destroy_waitqueue_vcpu(v);
fail_free:
free_cpumask_var(v->cpu_hard_affinity);
free_cpumask_var(v->cpu_hard_affinity_tmp);
free_cpumask_var(v->cpu_hard_affinity_saved);
free_cpumask_var(v->cpu_soft_affinity);
free_vcpu_struct(v);
return NULL;
}
goto fail_sched;
d->vcpu[vcpu_id] = v;
if ( vcpu_id != 0 )
@@ -194,6 +193,15 @@ struct vcpu *vcpu_create(
vcpu_check_shutdown(v);
return v;
fail_sched:
sched_destroy_vcpu(v);
fail_wq:
destroy_waitqueue_vcpu(v);
fail:
vcpu_destroy(v);
return NULL;
}
static int late_hwdom_init(struct domain *d)
@@ -902,13 +910,7 @@ static void complete_domain_destroy(struct rcu_head *head)
for ( i = d->max_vcpus - 1; i >= 0; i-- )
if ( (v = d->vcpu[i]) != NULL )
{
free_cpumask_var(v->cpu_hard_affinity);
free_cpumask_var(v->cpu_hard_affinity_tmp);
free_cpumask_var(v->cpu_hard_affinity_saved);
free_cpumask_var(v->cpu_soft_affinity);
free_vcpu_struct(v);
}
vcpu_destroy(v);
if ( d->target != NULL )
put_domain(d->target);
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.