repository: /home/avi/kvm branch: smp-rework commit 89e5345f01d75589596ec5f8289353bcf461e064 Author: Avi Kivity <[EMAIL PROTECTED]> Date: Mon Oct 15 13:02:32 2007 +0200
kvm: qemu: add a mechanism to schedule functions to be called on vcpus diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index 93a7f17..63e1d6e 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -42,6 +42,13 @@ static int wait_hack; #define SIG_IPI (SIGRTMIN+4) +typedef struct vcpu_callback vcpu_callback_t; + +struct vcpu_callback { + void (*func)(vcpu_callback_t *callback); + vcpu_callback_t *next; +}; + struct vcpu_info { int sipi_needed; int init; @@ -49,8 +56,41 @@ struct vcpu_info { int signalled; int stop; int stopped; + vcpu_callback_t *first_callback, *last_callback; } vcpu_info[4]; +/* + * Schedules a function for execution on a cpu. + */ +static void vcpu_schedule_callback(CPUState *env, + vcpu_callback_t *callback, + void (*func)(vcpu_callback_t *callback)) +{ + struct vcpu_info *info = &vcpu_info[env->cpu_index]; + + if (!info->first_callback) + info->first_callback = info->last_callback = callback; + else + info->last_callback = info->last_callback->next = callback; + callback->next = NULL; + callback->func = func; + pthread_kill(info->thread, SIG_IPI); +} + +static void vcpu_run_callbacks(CPUState *env) +{ + struct vcpu_info *info = &vcpu_info[env->cpu_index]; + vcpu_callback_t *callback; + + while (info->first_callback) { + callback = info->first_callback; + info->first_callback = callback->next; + callback->func(callback); + free(callback); + } + info->last_callback = NULL; +} + static void sig_ipi_handler(int n) { } @@ -735,8 +775,10 @@ static int kvm_main_loop_cpu(CPUState *env) pthread_mutex_lock(&qemu_mutex); cpu_single_env = env; while (1) { - while (!has_work(env)) + while (!has_work(env)) { kvm_main_loop_wait(env, 10); + vcpu_run_callbacks(env); + } if (env->interrupt_request & CPU_INTERRUPT_HARD) env->hflags &= ~HF_HALTED_MASK; if (!kvm_irqchip_in_kernel(kvm_context) && info->sipi_needed) @@ -745,6 +787,7 @@ static int kvm_main_loop_cpu(CPUState *env) update_regs_for_init(env); if (!(env->hflags & HF_HALTED_MASK) && !info->init) kvm_cpu_exec(env); + vcpu_run_callbacks(env); env->interrupt_request &= ~CPU_INTERRUPT_EXIT; kvm_main_loop_wait(env, 0); if (qemu_shutdown_requested()) ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ kvm-commits mailing list kvm-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-commits