On Mon, 12 Jul 2021 at 16:46, Richard Henderson <[email protected]> wrote: > > Request that the one TB returns immediately, so that > we release the exclusive lock as soon as possible. > > Signed-off-by: Richard Henderson <[email protected]> > --- > accel/tcg/cpu-exec.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c > index 2206c463f5..5bb099174f 100644 > --- a/accel/tcg/cpu-exec.c > +++ b/accel/tcg/cpu-exec.c > @@ -330,8 +330,7 @@ void cpu_exec_step_atomic(CPUState *cpu) > CPUArchState *env = (CPUArchState *)cpu->env_ptr; > TranslationBlock *tb; > target_ulong cs_base, pc; > - uint32_t flags; > - uint32_t cflags = (curr_cflags(cpu) & ~CF_PARALLEL) | 1; > + uint32_t flags, cflags; > int tb_exit; > > if (sigsetjmp(cpu->jmp_env, 0) == 0) { > @@ -341,8 +340,14 @@ void cpu_exec_step_atomic(CPUState *cpu) > cpu->running = true; > > cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); > - tb = tb_lookup(cpu, pc, cs_base, flags, cflags); > > + cflags = curr_cflags(cpu); > + /* Execute in a serial context. */ > + cflags &= ~CF_PARALLEL; > + /* After 1 insn, return and release the exclusive lock. */ > + cflags |= CF_NO_GOTO_TB | CF_NO_GOTO_PTR | 1; > + > + tb = tb_lookup(cpu, pc, cs_base, flags, cflags); > if (tb == NULL) { > mmap_lock(); > tb = tb_gen_code(cpu, pc, cs_base, flags, cflags);
So previously we would have executed possibly a chain of TBs before releasing the lock, and now we definitely execute just one? (I guess the execute-a-chain case is unlikely given the TB only has one insn and we know it's an exclusive insn...) Reviewed-by: Peter Maydell <[email protected]> thanks -- PMM
