Alex Bennée <alex.ben...@linaro.org> writes: > fred.kon...@greensocs.com writes: > >> From: KONRAD Frederic <fred.kon...@greensocs.com> >> >> This mechanism replaces the existing load/store exclusive mechanism which >> seems >> to be broken for multithread. >> It follows the intention of the existing mechanism and stores the target >> address >> and data values during a load operation and checks that they remain unchanged >> before a store. >> >> In common with the older approach, this provides weaker semantics than >> required >> in that it could be that a different processor writes the same value as a >> non-exclusive write, however in practise this seems to be irrelevant. > <snip> >> >> +/* Protect cpu_exclusive_* variable .*/ >> +__thread bool cpu_have_exclusive_lock; >> +QemuMutex cpu_exclusive_lock; >> + >> +inline void arm_exclusive_lock(void) >> +{ >> + if (!cpu_have_exclusive_lock) { >> + qemu_mutex_lock(&cpu_exclusive_lock); >> + cpu_have_exclusive_lock = true; >> + } >> +} >> + >> +inline void arm_exclusive_unlock(void) >> +{ >> + if (cpu_have_exclusive_lock) { >> + cpu_have_exclusive_lock = false; >> + qemu_mutex_unlock(&cpu_exclusive_lock); >> + } >> +} > > I don't quite follow. If these locks are mean to be protecting access to > variables then how do they do that? The lock won't block if another > thread is currently messing with the protected values.
Having re-read after coffee I'm still wondering why we need the per-thread bool? All the lock/unlock pairs are for critical sections so don't we just want to serialise on the qemu_mutex_lock(), what do the flags add apart from allowing you to next locks that shouldn't happen? -- Alex Bennée