[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/3] xen: arm: retry trylock if strex fails on free lock.
At 16:20 +0100 on 19 Jul (1374250810), Ian Campbell wrote: > This comes from the Linux patches 15e7e5c1ebf5 for arm32 and 4ecf7ccb1973 for > arm64 by Will Deacon and Catalin Marinas respectively. The Linux commit > message > says: > > An exclusive store instruction may fail for reasons other than lock > contention (e.g. a cache eviction during the critical section) so, in > line with other architectures using similar exclusive instructions > (alpha, mips, powerpc), retry the trylock operation if the lock appears > to be free but the strex reported failure. > > I have observed this due to register_cpu_notifier containing: > if ( !spin_trylock(&cpu_add_remove_lock) ) > BUG(); /* Should never fail as we are called only during boot. */ > which was spuriously failing. > > The ARMv8 variant is taken directly from the Linux patch. For v7 I had to > reimplement since we don't currently use ticket locks. > > Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Looks good, but: > static always_inline int _raw_spin_trylock(raw_spinlock_t *lock) > { > - unsigned long tmp; > - > - __asm__ __volatile__( > -" ldrex %0, [%1]\n" > -" teq %0, #0\n" > -" strexeq %0, %2, [%1]" > - : "=&r" (tmp) > - : "r" (&lock->lock), "r" (1) > - : "cc"); > - > - if (tmp == 0) { > + unsigned long contended, res; > + > + do { > + __asm__ __volatile__( > + " ldrex %0, [%2]\n" > + " teq %0, #0\n" > + " strexeq %1, %3, [%2]\n" > + " movne %1, #0\n" > + : "=&r" (contended), "=r" (res) > + : "r" (&lock->lock), "r" (1) Shouldn't this be using a 'Q' constraint for the lock, following the pattern set in patch 2/3? > + : "cc"); > + } while (res); > + > + if (!contended) { > smp_mb(); > return 1; > } else { _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |