On Sat, Jun 25, 2016 at 11:21:30PM +0800, Boqun Feng wrote: > > > > int vpc = vcpu_preempt_count(); > > > > ... > > > > for (;;) { > > > > /* the big spin loop */ > > > > if (need_resched() || vpc != vcpu_preempt_count()) > > So on PPC, we have lppaca::yield_count to detect when an vcpu is
Which sounds like just the value we want.. And I suspect that on x86 KVM and Xen have similar numbers stashed away someplace. > preempted, if the yield_count is even, the vcpu is running, otherwise it > is preempted(__spin_yield() is a user of this). > > Therefore it makes more sense we > > if (need_resched() || vcpu_is_preempted(old)) > > here, and implement vcpu_is_preempted() on PPC as > > bool vcpu_is_preempted(int cpu) > { > return !!(be32_to_cpu(lppaca_of(cpu).yield_count) & 1) > } > > Thoughts? That works here, but it would not work for the need_resched() in mutex_spin_on_owner() and mutex_optimistic_spin() which need equal treatment. Because those too we want to limit. The count thing, while a little more cumbersome, is more widely applicable than just the one OSQ case where we happen to have a cpu number.