]> xenbits.xensource.com Git - xen.git/commitdiff
sync CPU state upon final domain destruction
authorJan Beulich <jbeulich@suse.com>
Thu, 23 Nov 2017 10:38:22 +0000 (11:38 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 23 Nov 2017 10:38:22 +0000 (11:38 +0100)
See the code comment being added for why we need this.

This is being placed here to balance between the desire to prevent
future similar issues (the risk of which would grow if it was put
further down the call stack, e.g. in vmx_vcpu_destroy()) and the
intention to limit the performance impact (otherwise it could also go
into rcu_do_batch(), paralleling the use in do_tasklet_work()).

Reported-by: Igor Druzhinin <igor.druzhinin@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Release-acked-by: Julien Grall <julien.grall@linaro.org>
xen/common/domain.c

index 5aebcf265f50d321e5a60a394f55fc4d5636831d..7484693a874630805dc4a79191bb34936a6e23b0 100644 (file)
@@ -794,6 +794,14 @@ static void complete_domain_destroy(struct rcu_head *head)
     struct vcpu *v;
     int i;
 
+    /*
+     * Flush all state for the vCPU previously having run on the current CPU.
+     * This is in particular relevant for x86 HVM ones on VMX, so that this
+     * flushing of state won't happen from the TLB flush IPI handler behind
+     * the back of a vmx_vmcs_enter() / vmx_vmcs_exit() section.
+     */
+    sync_local_execstate();
+
     for ( i = d->max_vcpus - 1; i >= 0; i-- )
     {
         if ( (v = d->vcpu[i]) == NULL )