2
0
Эх сурвалжийг харах

Prevent abortion on multiple VCPU kicks

If we call qemu_cpu_kick more than once before the target was able to
process the signal, pthread_kill will fail, and qemu will abort. Prevent
this by avoiding the redundant signal.

This logic can be found in qemu-kvm as well.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Jan Kiszka 14 жил өмнө
parent
commit
aa2c364b4c
2 өөрчлөгдсөн 6 нэмэгдсэн , 1 устгасан
  1. 1 0
      cpu-defs.h
  2. 5 1
      cpus.c

+ 1 - 0
cpu-defs.h

@@ -205,6 +205,7 @@ typedef struct CPUWatchpoint {
     uint32_t stopped; /* Artificially stopped */                        \
     uint32_t stopped; /* Artificially stopped */                        \
     struct QemuThread *thread;                                          \
     struct QemuThread *thread;                                          \
     struct QemuCond *halt_cond;                                         \
     struct QemuCond *halt_cond;                                         \
+    int thread_kicked;                                                  \
     struct qemu_work_item *queued_work_first, *queued_work_last;        \
     struct qemu_work_item *queued_work_first, *queued_work_last;        \
     const char *cpu_model_str;                                          \
     const char *cpu_model_str;                                          \
     struct KVMState *kvm_state;                                         \
     struct KVMState *kvm_state;                                         \

+ 5 - 1
cpus.c

@@ -481,6 +481,7 @@ static void qemu_wait_io_event_common(CPUState *env)
         qemu_cond_signal(&qemu_pause_cond);
         qemu_cond_signal(&qemu_pause_cond);
     }
     }
     flush_queued_work(env);
     flush_queued_work(env);
+    env->thread_kicked = false;
 }
 }
 
 
 static void qemu_tcg_wait_io_event(void)
 static void qemu_tcg_wait_io_event(void)
@@ -648,7 +649,10 @@ void qemu_cpu_kick(void *_env)
 {
 {
     CPUState *env = _env;
     CPUState *env = _env;
     qemu_cond_broadcast(env->halt_cond);
     qemu_cond_broadcast(env->halt_cond);
-    qemu_thread_signal(env->thread, SIG_IPI);
+    if (!env->thread_kicked) {
+        qemu_thread_signal(env->thread, SIG_IPI);
+        env->thread_kicked = true;
+    }
 }
 }
 
 
 int qemu_cpu_self(void *_env)
 int qemu_cpu_self(void *_env)