[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv4 3/5] xen: use ticket locks for spin locks
At 21:05 +0100 on 14 May (1431637535), Jan Beulich wrote: > >>> Tim Deegan <tim@xxxxxxx> 05/14/15 12:36 PM >>> > >At 15:37 +0100 on 11 May (1431358623), David Vrabel wrote: > >> void _spin_barrier(spinlock_t *lock) > >> { > >> + spinlock_tickets_t sample; > >> #ifdef LOCK_PROFILE > >> s_time_t block = NOW(); > >> - u64 loop = 0; > >> +#endif > >> > >> check_barrier(&lock->debug); > >> - do { smp_mb(); loop++;} while ( _raw_spin_is_locked(&lock->raw) ); > >> - if ((loop > 1) && lock->profile) > >> + smp_mb(); > >> + sample = observe_lock(&lock->tickets); > >> + if ( sample.head != sample.tail ) > >> { > >> - lock->profile->time_block += NOW() - block; > >> - lock->profile->block_cnt++; > >> - } > >> -#else > >> - check_barrier(&lock->debug); > >> - do { smp_mb(); } while ( _raw_spin_is_locked(&lock->raw) ); > >> + while ( observe_head(&lock->tickets) != sample.tail ) > > > >This test should be "observe_head(&lock->tickets) == sample.head", > >i.e. wait until the thread that held the lock has released it. > >Checking for it to reach the tail is unnecessary (other threads that > >were queueing for the lock at the sample time don't matter) and > >dangerous (on a contended lock head might pass sample.tail without us > >happening to observe it being == ). > > The observation of there being a problem is correct, but the suggested > solution > doesn't seem to be. The new code being > > if ( sample.head != sample.tail ) > { > while ( observe_head(&lock->tickets) == sample.tail ) > cpu_relax(); > > means that if head didn't change between the full sample and the head sample > we'd end the loop right away, which can't be right. We really need to wait for > head to reach or pass the sampled tail. I think you misread what I asked for. We wait until the observed head doesn't match the sampled _head_, i.e. for whoever had the lock when we sampled it to realease it: if ( sample.head != sample.tail ) { while ( observe_head(&lock->tickets) == sample.head ) cpu_relax(); Cheers, Tim. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |