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.

Reply via email to