Sergey Fedorov <sergey.fedo...@linaro.org> writes: > From: Sergey Fedorov <serge.f...@gmail.com> > > Signed-off-by: Sergey Fedorov <serge.f...@gmail.com> > Signed-off-by: Sergey Fedorov <sergey.fedo...@linaro.org> > --- > cpu-exec.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > > diff --git a/cpu-exec.c b/cpu-exec.c > index dd0bd5007701..54c935039592 100644 > --- a/cpu-exec.c > +++ b/cpu-exec.c > @@ -295,7 +295,8 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, > > /* mmap_lock is needed by tb_gen_code, and mmap_lock must be > * taken outside tb_lock. As system emulation is currently > - * single threaded the locks are NOPs. > + * single threaded the locks are NOPs. Both locks are to be > + * released at the end of tb_find_fast(). > */ > mmap_lock(); > tb_lock(); > @@ -308,9 +309,6 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, > /* if no translated code available, then translate it now */ > tb = tb_gen_code(cpu, pc, cs_base, flags, 0); > } > - > - tb_unlock(); > - mmap_unlock();
Hmm pushing these outside of tb_find_slow() makes me uncomfortable. I guess tb_find_fast/slow are intimately tied together but the idea of taking locks which are the responsibility of the calling function to clear seems ugly to me. > } > > /* We add the TB in the virtual pc hash table for the fast lookup */ > @@ -354,10 +352,15 @@ static inline TranslationBlock *tb_find_fast(CPUState > *cpu, > #endif > /* See if we can patch the calling TB. */ > if (*last_tb && !qemu_loglevel_mask(CPU_LOG_TB_NOCHAIN)) { > - tb_lock(); > + if (!tb_lock_locked()) { > + tb_lock(); > + } > tb_add_jump(*last_tb, tb_exit, tb); > - tb_unlock(); > } > + > + tb_lock_reset(); > + mmap_lock_reset(); > + > return tb; > } -- Alex Bennée