http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50065
--- Comment #6 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-08-14 12:42:47 UTC --- > The code is equivalent to > > volatile unsigned char lock; > int remap_barrier; > > while (atomic_test_and_set(lock)) { > while (lock) { > ; > } > } > remap_barrier++; > lock = 0; > > Eric: could you let me know you you think the code inside function > spinlock_lock(&remap_lock) is a NOP? I don't, you simply misquoted, I wrote "the end of the code". The first part of the spinlock implementation is correct, in particular you have the required memory barrier in spinlock_is_locked. The second part is not correct, as you don't have the memory barrier in spinlock_unlock. > Also, the arch_write_lock/unlock in the SPARC port of Linux uses a very > similar implementation. No, it precisely doesn't, it has the memory barrier in spinlock_unlock.