|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 29/48] xen/sched: add code to sync scheduling of all vcpus of a sched unit
On 09.08.2019 16:58, Juergen Gross wrote:
> +static bool sched_tasklet_check(unsigned int cpu)
> +{
> + bool tasklet_work_scheduled = false;
> + const cpumask_t *mask = get_sched_res(cpu)->cpus;
> + int cpu_iter;
unsigned int ?
> +static void context_saved(struct vcpu *prev)
> +{
> + struct sched_unit *unit = prev->sched_unit;
> +
> + /* Clear running flag /after/ writing context to memory. */
> + smp_wmb();
> +
> + prev->is_running = 0;
> + unit->is_running = 0;
> + unit->state_entry_time = NOW();
> +
> + /* Check for migration request /after/ clearing running flag. */
> + smp_mb();
> +
> + sched_context_saved(vcpu_scheduler(prev), unit);
> +
> + sched_unit_migrate_finish(unit);
> +}
> +
> +/*
> + * Rendezvous on end of context switch.
> + * As no lock is protecting this rendezvous function we need to use atomic
> + * access functions on the counter.
> + * The counter will be 0 in case no rendezvous is needed. For the rendezvous
> + * case it is initialised to the number of cpus to rendezvous plus 1. Each
> + * member entering decrements the counter. The last one will decrement it to
> + * 1 and perform the final needed action in that case (call of
> context_saved()
> + * if vcpu was switched), and then set the counter to zero. The other members
> + * will wait until the counter becomes zero until they proceed.
> + */
> +void sched_context_switched(struct vcpu *vprev, struct vcpu *vnext)
> +{
> + struct sched_unit *next = vnext->sched_unit;
> +
> + if ( atomic_read(&next->rendezvous_out_cnt) )
> + {
> + int cnt = atomic_dec_return(&next->rendezvous_out_cnt);
> +
> + /* Call context_saved() before releasing other waiters. */
> + if ( cnt == 1 )
> + {
> + if ( vprev != vnext )
> + context_saved(vprev);
> + atomic_set(&next->rendezvous_out_cnt, 0);
> + }
> + else
> + while ( atomic_read(&next->rendezvous_out_cnt) )
> + cpu_relax();
How come context_saved() is not called on this "else" branch? How
will vprev->is_running get cleared there? Or, since everything
else in the function is per-unit, does this clearing want to move
here?
> -void context_saved(struct vcpu *prev)
> +static void sched_slave(void)
> {
> - /* Clear running flag /after/ writing context to memory. */
> - smp_wmb();
> + struct vcpu *vprev = current;
> + struct sched_unit *prev = vprev->sched_unit, *next;
> + s_time_t now;
> + spinlock_t *lock;
> + int cpu = smp_processor_id();
unsigned int?
> @@ -1971,6 +2164,7 @@ void __init scheduler_init(void)
> int i;
>
> open_softirq(SCHEDULE_SOFTIRQ, schedule);
> + open_softirq(SCHED_SLAVE_SOFTIRQ, sched_slave);
Noticing the "we have a race" comment and code in schedule() I
wonder if there isn't enough state for schedule() to know
whether to call sched_slave(), rather than having this extra
softirq.
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 |