cpus: tcg: unregister thread with RCU, fix exiting of loop on unplug
Keep running until cpu_can_run(cpu) becomes false, for consistency with other acceslerators. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d2831ab065
commit
9b0605f983
14
cpus.c
14
cpus.c
|
@ -1467,6 +1467,7 @@ static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
|
||||||
deal_with_unplugged_cpus();
|
deal_with_unplugged_cpus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rcu_unregister_thread();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1603,18 +1604,17 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
|
||||||
/* Ignore everything else? */
|
/* Ignore everything else? */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (cpu->unplug) {
|
|
||||||
qemu_tcg_destroy_vcpu(cpu);
|
|
||||||
cpu->created = false;
|
|
||||||
qemu_cond_signal(&qemu_cpu_cond);
|
|
||||||
qemu_mutex_unlock_iothread();
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_mb_set(&cpu->exit_request, 0);
|
atomic_mb_set(&cpu->exit_request, 0);
|
||||||
qemu_wait_io_event(cpu);
|
qemu_wait_io_event(cpu);
|
||||||
}
|
} while (!cpu->unplug || cpu_can_run(cpu));
|
||||||
|
|
||||||
|
qemu_tcg_destroy_vcpu(cpu);
|
||||||
|
cpu->created = false;
|
||||||
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
|
rcu_unregister_thread();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue