Soon we will call cpu_has_work without the BQL. Cc: Cornelia Huck <coh...@redhat.com> Cc: Richard Henderson <r...@twiddle.net> Cc: Alexander Graf <ag...@suse.de> Cc: David Hildenbrand <da...@redhat.com> Cc: qemu-s3...@nongnu.org Signed-off-by: Emilio G. Cota <c...@braap.org> --- target/s390x/cpu.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c index 1f91df57bc..64c10ad115 100644 --- a/target/s390x/cpu.c +++ b/target/s390x/cpu.c @@ -24,6 +24,7 @@ */ #include "qemu/osdep.h" +#include "qemu/main-loop.h" #include "qapi/error.h" #include "cpu.h" #include "internal.h" @@ -55,10 +56,12 @@ static void s390_cpu_set_pc(CPUState *cs, vaddr value) cpu->env.psw.addr = value; } -static bool s390_cpu_has_work(CPUState *cs) +static bool s390_cpu_has_work_locked(CPUState *cs) { S390CPU *cpu = S390_CPU(cs); + g_assert(qemu_mutex_iothread_locked()); + /* STOPPED cpus can never wake up */ if (s390_cpu_get_state(cpu) != S390_CPU_STATE_LOAD && s390_cpu_get_state(cpu) != S390_CPU_STATE_OPERATING) { @@ -72,6 +75,21 @@ static bool s390_cpu_has_work(CPUState *cs) return s390_cpu_has_int(cpu); } +static bool s390_cpu_has_work(CPUState *cs) +{ + if (!qemu_mutex_iothread_locked()) { + bool ret; + + cpu_mutex_unlock(cs); + qemu_mutex_lock_iothread(); + cpu_mutex_lock(cs); + ret = s390_cpu_has_work_locked(cs); + qemu_mutex_unlock_iothread(); + return ret; + } + return s390_cpu_has_work_locked(cs); +} + #if !defined(CONFIG_USER_ONLY) /* S390CPUClass::load_normal() */ static void s390_cpu_load_normal(CPUState *s) -- 2.17.1