aboutsummaryrefslogtreecommitdiff
path: root/exec.c
diff options
context:
space:
mode:
authorIgor Mammedov <imammedo@redhat.com>2016-07-25 11:59:20 +0200
committerEduardo Habkost <ehabkost@redhat.com>2016-07-26 15:32:00 -0300
commit8b1b835035fda831b405c1947210efcf758a7ca8 (patch)
tree5be390aa590a4643cd51a681b4ebb860cd98164c /exec.c
parent1bc7e522d9cf1b58f2de9c8f1737be0bb5129c35 (diff)
downloadqemu-8b1b835035fda831b405c1947210efcf758a7ca8.zip
qemu-8b1b835035fda831b405c1947210efcf758a7ca8.tar.gz
qemu-8b1b835035fda831b405c1947210efcf758a7ca8.tar.bz2
exec: Don't use cpu_index to detect if cpu_exec_init()'s been called
Instead use QTAIL's tqe_prev field to detect if cpu's been placed in list by cpu_exec_init() which is always set if QTAIL element is in list. Fixes SIGSEGV on failure path in case cpu_index is assigned by board and cpu.relalize() fails before cpu_exec_init() is called. In follow up patches, cpu_index will be assigned by boards that support cpu hot(un)plug and need stable cpu_index that doesn't depend on order cpus are created/removed. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reported-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/exec.c b/exec.c
index 2f57c62..ae45a70 100644
--- a/exec.c
+++ b/exec.c
@@ -643,13 +643,14 @@ void cpu_exec_exit(CPUState *cpu)
CPUClass *cc = CPU_GET_CLASS(cpu);
cpu_list_lock();
- if (cpu->cpu_index == -1) {
- /* cpu_index was never allocated by this @cpu or was already freed. */
+ if (cpu->node.tqe_prev == NULL) {
+ /* there is nothing to undo since cpu_exec_init() hasn't been called */
cpu_list_unlock();
return;
}
QTAILQ_REMOVE(&cpus, cpu, node);
+ cpu->node.tqe_prev = NULL;
cpu_release_index(cpu);
cpu->cpu_index = -1;
cpu_list_unlock();