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

Reply via email to