qemu-kvm: Introduce qemu_cond_wait wrapper
PATCH 1/2 qemu-kvm: Introduce qemu_cond_wait wrapper
As suggested by Anthony, this patch encapsulates the sequence "save cpu_single_env, temporarily drop qemu_mutex, restore cpu_single_env" for condition variables in a helper function. It also adds a safety check to the open-coded kvm_mutex_lock that the caller is not a vcpu thread (as kvm_mutex_unlock clears cpu_single_env).
--- qemu/qemu-kvm.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
qemu/qemu-kvm.c +16 -13
@@ -12,6 +12,7 @@ int kvm_allowed = 1;int kvm_irqchip =1 ;int kvm_pit =1 ; +#include <assert.h> #include <string.h> #include "hw/hw.h" #include "sysemu.h"
@@ -65,6 +66,14 @@ static inline unsigned long kvm_get_threreturn syscall (SYS_gettid); } +static void qemu_cond_wait (pthread_cond_t *cond) +{ +CPUState *env = cpu_single_env; + +pthread_cond_wait (cond, &qemu_mutex); + cpu_single_env = env; +} +CPUState *qemu_kvm_cpu_env (int index) {return vcpu_info[index].env;
@@ -246,11 +255,8 @@ static void pause_all_threads(void) vcpu_info[i].stop =1 ;pthread_kill (vcpu_info[i].thread,SIG_IPI ); } -while (!all_threads_paused ()) { -CPUState *env = cpu_single_env; -pthread_cond_wait (&qemu_pause_cond, &qemu_mutex); - cpu_single_env = env; - } +while (!all_threads_paused ()) +qemu_cond_wait (&qemu_pause_cond); }static void resume_all_threads (void )
@@ -372,7 +378,7 @@ static void *ap_main_loop(void *_env)/* and wait for machine initialization */ while (!qemu_system_ready) -pthread_cond_wait (&qemu_system_cond, &qemu_mutex); +qemu_cond_wait (&qemu_system_cond);pthread_mutex_unlock (&qemu_mutex);kvm_main_loop_cpu (env);
@@ -384,7 +390,7 @@ void kvm_init_new_ap(int cpu, CPUState *pthread_create (&vcpu_info[cpu].thread,NULL , ap_main_loop, env);while (vcpu_info[cpu].created ==0 ) -pthread_cond_wait (&qemu_vcpu_cond, &qemu_mutex); +qemu_cond_wait (&qemu_vcpu_cond); }int kvm_init_ap (void )
@@ -892,8 +898,6 @@ void qemu_kvm_aio_wait_start(void)void qemu_kvm_aio_wait (void ) { -CPUState *cpu_single = cpu_single_env; -if (!cpu_single_env) {if (io_thread_sigfd !=-1 ) {fd_set rfds;
@@ -910,10 +914,8 @@ void qemu_kvm_aio_wait(void)sigfd_handler ((void *)(unsigned long )io_thread_sigfd); }qemu_aio_poll (); - }else { -pthread_cond_wait (&qemu_aio_cond, &qemu_mutex); - cpu_single_env = cpu_single; - } + }else +qemu_cond_wait (&qemu_aio_cond); }void qemu_kvm_aio_wait_end (void )
@@ -939,6 +941,7 @@ void kvm_cpu_destroy_phys_mem(target_phyvoid kvm_mutex_unlock (void ) { +assert (!cpu_single_env);pthread_mutex_unlock (&qemu_mutex); }
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
Avi Kivity
AppliedQuoted 6 lines · Jan Kiszka
As suggested by Anthony, this patch encapsulates the sequence "save
cpu_single_env, temporarily dropqemu_mutex, restorecpu_single_env" for condition variables in a helper function. It also adds a safety check to the open-codedkvm_mutex_lockthat the caller is not a vcpu thread (askvm_mutex_unlockclearscpu_single_env).
Applied, thanks.
Signature · 8 lines
error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone