mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
cpus-common: simplify locking for start_exclusive/end_exclusive
It is not necessary to hold qemu_cpu_list_mutex throughout the exclusive section, because no other exclusive section can run while pending_cpus != 0. exclusive_idle() is called in cpu_exec_start(), and that prevents any CPUs created after start_exclusive() from entering cpu_exec() during an exclusive section. Reviewed-by: Richard Henderson <rth@twiddle.net> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
cf07da65f3
commit
758e1b2b62
3 changed files with 11 additions and 8 deletions
|
@ -171,8 +171,7 @@ static inline void exclusive_idle(void)
|
|||
}
|
||||
|
||||
/* Start an exclusive operation.
|
||||
Must only be called from outside cpu_exec, takes
|
||||
qemu_cpu_list_lock. */
|
||||
Must only be called from outside cpu_exec. */
|
||||
void start_exclusive(void)
|
||||
{
|
||||
CPUState *other_cpu;
|
||||
|
@ -191,11 +190,17 @@ void start_exclusive(void)
|
|||
while (pending_cpus > 1) {
|
||||
qemu_cond_wait(&exclusive_cond, &qemu_cpu_list_lock);
|
||||
}
|
||||
|
||||
/* Can release mutex, no one will enter another exclusive
|
||||
* section until end_exclusive resets pending_cpus to 0.
|
||||
*/
|
||||
qemu_mutex_unlock(&qemu_cpu_list_lock);
|
||||
}
|
||||
|
||||
/* Finish an exclusive operation. Releases qemu_cpu_list_lock. */
|
||||
/* Finish an exclusive operation. */
|
||||
void end_exclusive(void)
|
||||
{
|
||||
qemu_mutex_lock(&qemu_cpu_list_lock);
|
||||
pending_cpus = 0;
|
||||
qemu_cond_broadcast(&exclusive_resume);
|
||||
qemu_mutex_unlock(&qemu_cpu_list_lock);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue