]> xenbits.xensource.com Git - people/dariof/xen.git/commitdiff
sched/core: fix bug when moving a domain between cpupools
authorJeff Kubascik <jeff.kubascik@dornerworks.com>
Fri, 17 Apr 2020 07:27:21 +0000 (09:27 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 17 Apr 2020 07:27:21 +0000 (09:27 +0200)
For each UNIT, sched_set_affinity is called before unit->priv is updated
to the new cpupool private UNIT data structure. The issue is
sched_set_affinity will call the adjust_affinity method of the cpupool.
If defined, the new cpupool may use unit->priv (e.g. credit), which at
this point still references the old cpupool private UNIT data structure.

This change fixes the bug by moving the switch of unit->priv earler in
the function.

Signed-off-by: Jeff Kubascik <jeff.kubascik@dornerworks.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Acked-by: Dario Faggioli <dfaggioli@suse.com>
xen/common/sched/core.c

index 626861a3fe292ee0510cb1b124396b96d7570750..c4ed070470cbeeb883f5b27de02c94b307cb7012 100644 (file)
@@ -686,6 +686,7 @@ int sched_move_domain(struct domain *d, struct cpupool *c)
         unsigned int unit_p = new_p;
 
         unitdata = unit->priv;
+        unit->priv = unit_priv[unit_idx];
 
         for_each_sched_unit_vcpu ( unit, v )
         {
@@ -707,7 +708,6 @@ int sched_move_domain(struct domain *d, struct cpupool *c)
          */
         spin_unlock_irq(lock);
 
-        unit->priv = unit_priv[unit_idx];
         if ( !d->is_dying )
             sched_move_irqs(unit);