[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 24/47] xen: switch from for_each_vcpu() to for_each_sched_unit()
On 14.09.2019 10:52, Juergen Gross wrote: > @@ -508,25 +515,27 @@ int sched_move_domain(struct domain *d, struct cpupool > *c) > if ( IS_ERR(domdata) ) > return PTR_ERR(domdata); > > - vcpu_priv = xzalloc_array(void *, d->max_vcpus); > - if ( vcpu_priv == NULL ) > + /* TODO: fix array size with multiple vcpus per unit. */ > + unit_priv = xzalloc_array(void *, d->max_vcpus); > + if ( unit_priv == NULL ) > { > sched_free_domdata(c->sched, domdata); > return -ENOMEM; > } > > - for_each_vcpu ( d, v ) > + unit_idx = 0; > + for_each_sched_unit ( d, unit ) > { > - vcpu_priv[v->vcpu_id] = sched_alloc_vdata(c->sched, v->sched_unit, > - domdata); > - if ( vcpu_priv[v->vcpu_id] == NULL ) > + unit_priv[unit_idx] = sched_alloc_vdata(c->sched, unit, domdata); > + if ( unit_priv[unit_idx] == NULL ) > { > - for_each_vcpu ( d, v ) > - xfree(vcpu_priv[v->vcpu_id]); > - xfree(vcpu_priv); > + for ( unit_idx = 0; unit_priv[unit_idx]; unit_idx++ ) > + sched_free_vdata(c->sched, unit_priv[unit_idx]); This is an unexpected change from xfree() to sched_free_vdata(). If it really is correct, it should be mentioned in the description. I can see why this might be better from an abstract pov, but it's questionable whether arinc653's update_schedule_vcpus() really wants calling at this point (perhaps it does, as a653sched_alloc_vdata() also calls it). Josh, Robert: Besides this immediate aspect I also wonder whether said call is correct to make outside of a sched_priv->lock'ed region, when both other instances occur inside of one (and in one case immediately before an unlock, i.e. if the lock wasn't needed the two steps could well be re-ordered). Finally, at this point, shouldn't the functions and hooks (already) be named {alloc,free}_udata()? > @@ -896,18 +929,22 @@ void restore_vcpu_affinity(struct domain *d) > cpupool_domain_cpumask(d)); > if ( cpumask_empty(cpumask_scratch_cpu(cpu)) ) > { > - if ( v->affinity_broken ) > + if ( sched_check_affinity_broken(unit) ) > { > - sched_set_affinity(v, unit->cpu_hard_affinity_saved, NULL); > - v->affinity_broken = 0; > + /* Affinity settings of one vcpu are for the complete unit. > */ > + sched_set_affinity(unit->vcpu_list, > + unit->cpu_hard_affinity_saved, NULL); Yet despite the comment the function gets passed a struct vcpu *, and this doesn't look to change by the end of the series. Is there a reason for this? > @@ -950,17 +986,19 @@ int cpu_disable_scheduler(unsigned int cpu) > > for_each_domain_in_cpupool ( d, c ) > { > - for_each_vcpu ( d, v ) > + struct sched_unit *unit; > + > + for_each_sched_unit ( d, unit ) > { > unsigned long flags; > - struct sched_unit *unit = v->sched_unit; > spinlock_t *lock = unit_schedule_lock_irqsave(unit, &flags); > > cpumask_and(&online_affinity, unit->cpu_hard_affinity, > c->cpu_valid); > if ( cpumask_empty(&online_affinity) && > cpumask_test_cpu(cpu, unit->cpu_hard_affinity) ) > { > - if ( v->affinity_broken ) > + /* TODO: multiple vcpus per unit. */ > + if ( unit->vcpu_list->affinity_broken ) Why not sched_check_affinity_broken(unit)? Quite possibly this would make the TODO item unnecessary? > @@ -968,14 +1006,15 @@ int cpu_disable_scheduler(unsigned int cpu) > break; > } > > - printk(XENLOG_DEBUG "Breaking affinity for %pv\n", v); > + printk(XENLOG_DEBUG "Breaking affinity for %pv\n", > + unit->vcpu_list); > > - sched_set_affinity(v, &cpumask_all, NULL); > + sched_set_affinity(unit->vcpu_list, &cpumask_all, NULL); > } > > - if ( v->processor != cpu ) > + if ( sched_unit_cpu(unit) != sched_get_resource_cpu(cpu) ) Didn't you agree that this can be had cheaper? Quite likely my v2 review remark was on a different instance, but the pattern ought to be relatively simple to find in the entire series (and by the end of the series there's one other instance in schedule.c ... > @@ -988,17 +1027,18 @@ int cpu_disable_scheduler(unsigned int cpu) > * * the scheduler will always find a suitable solution, or > * things would have failed before getting in here. > */ > - vcpu_migrate_start(v); > + /* TODO: multiple vcpus per unit. */ > + vcpu_migrate_start(unit->vcpu_list); > unit_schedule_unlock_irqrestore(lock, flags, unit); > > - vcpu_migrate_finish(v); > + vcpu_migrate_finish(unit->vcpu_list); > > /* > * The only caveat, in this case, is that if a vcpu active in > * the hypervisor isn't migratable. In this case, the caller > * should try again after releasing and reaquiring all locks. > */ > - if ( v->processor == cpu ) > + if ( sched_unit_cpu(unit) == sched_get_resource_cpu(cpu) ) ... here; I didn't check other files). > @@ -1009,8 +1049,8 @@ int cpu_disable_scheduler(unsigned int cpu) > static int cpu_disable_scheduler_check(unsigned int cpu) > { > struct domain *d; > - struct vcpu *v; > struct cpupool *c; > + struct vcpu *v; Unnecessary change? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |