From: Andrew Cooper Date: Wed, 5 Sep 2018 17:32:52 +0000 (+0000) Subject: xen/vcpu: Introduce vcpu_destroy() X-Git-Tag: archive/raspbian/4.14.0+80-gd101b417b7-1+rpi1^2~63^2~3264 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=1ffeb99669a3ba9cde3063596a9b805023c90ea7;p=xen.git 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 Reviewed-by: Jan Beulich Reviewed-by: Roger Pau Monné --- diff --git a/xen/common/domain.c b/xen/common/domain.c index 4ba2a82dd7..65151e2ac4 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -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);