[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 28/47] xen/sched: add code to sync scheduling of all vcpus of a sched unit
On 14.09.2019 10:52, Juergen Gross wrote: > --- a/xen/common/schedule.c > +++ b/xen/common/schedule.c > @@ -55,6 +55,9 @@ boolean_param("sched_smt_power_savings", > sched_smt_power_savings); > int sched_ratelimit_us = SCHED_DEFAULT_RATELIMIT_US; > integer_param("sched_ratelimit_us", sched_ratelimit_us); > > +/* Number of vcpus per struct sched_unit. */ > +static unsigned int __read_mostly sched_granularity = 1; Didn't you indicate earlier that this would be a per-pool property? Or was that just a longer term plan? > +/* > + * Rendezvous before taking a scheduling decision. > + * Called with schedule lock held, so all accesses to the rendezvous counter > + * can be normal ones (no atomic accesses needed). > + * The counter is initialized to the number of cpus to rendezvous initially. > + * Each cpu entering will decrement the counter. In case the counter becomes > + * zero do_schedule() is called and the rendezvous counter for leaving > + * context_switch() is set. All other members will wait until the counter is > + * becoming zero, dropping the schedule lock in between. > + */ This recurring lock/unlock is liable to cause a massive cache line ping-pong, especially for socket or node scheduling. Instead of just a cpu_relax() between the main unlock and re-lock, could there perhaps be lock-less checks to determine whether there's any point at all re-acquiring the lock? > +static void schedule(void) > +{ > + struct vcpu *vnext, *vprev = current; > + struct sched_unit *prev = vprev->sched_unit, *next = NULL; > + s_time_t now; > + struct sched_resource *sd; > + spinlock_t *lock; > + int cpu = smp_processor_id(); > + > + ASSERT_NOT_IN_ATOMIC(); > + > + SCHED_STAT_CRANK(sched_run); > + > + sd = get_sched_res(cpu); > + > + lock = pcpu_schedule_lock_irq(cpu); > + > + if ( prev->rendezvous_in_cnt ) > + { > + /* > + * We have a race: sched_slave() should be called, so raise a softirq > + * in order to re-enter schedule() later and call sched_slave() now. > + */ > + pcpu_schedule_unlock_irq(lock, cpu); > + > + raise_softirq(SCHEDULE_SOFTIRQ); > + return sched_slave(); > + } > + > + now = NOW(); > + > + stop_timer(&sd->s_timer); Is the order of these two relevant? A while ago there were a couple of changes moving such NOW() invocations past anything that may take non-negligible time, to make accounting as accurate as possible. > --- a/xen/include/xen/softirq.h > +++ b/xen/include/xen/softirq.h > @@ -4,6 +4,7 @@ > /* Low-latency softirqs come first in the following list. */ > enum { > TIMER_SOFTIRQ = 0, > + SCHED_SLAVE_SOFTIRQ, > SCHEDULE_SOFTIRQ, > NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ, > RCU_SOFTIRQ, Seeing the comment, is the insertion you do as well as the pre- existing placement of SCHEDULE_SOFTIRQ still appropriate with the rendezvous-ing you introduce? 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 |