Before kernel 2.6.24, smp_call_function_mask() is not defined for architecture
x86_64 and not for architecture i386.

This patch defines it in external-module-compat.h to emulate it for older
kernel, it uses codes from arch/x86/kernel/smp_64.c modified to call 
smp_call_single_function() (like in previous version of KVM) instead of 
send_IPI_mask().

Signed-off-by: Laurent Vivier <[EMAIL PROTECTED]>
---
 kernel/external-module-compat.h |   75 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 75 insertions(+), 0 deletions(-)

diff --git a/kernel/external-module-compat.h b/kernel/external-module-compat.h
index bd637db..adc5cd4 100644
--- a/kernel/external-module-compat.h
+++ b/kernel/external-module-compat.h
@@ -421,3 +421,78 @@ typedef _Bool bool;
 #ifndef PF_VCPU
 #define PF_VCPU 0
 #endif
+
+/* 
+ * smp_call_function_mask() is not defined/exported below 2.6.24
+ */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+struct kvm_call_data_struct {
+       void (*func) (void *info);
+       void *info;
+       atomic_t started;
+       atomic_t finished;
+       int wait;
+};
+
+static void kvm_ack_smp_call(void *_data)
+{
+       struct kvm_call_data_struct *data = _data;
+       /* if wait == 0, data can be out of scope
+        * after atomic_inc(info->started)
+        */
+       void (*func) (void *info) = data->func;
+       void *info = data->info;
+       int wait = data->wait;
+
+       smp_mb();
+       atomic_inc(&data->started);
+       (*func)(info);
+       if (wait) {
+               smp_mb();
+               atomic_inc(&data->finished);
+       }
+}
+
+static inline int smp_call_function_mask(cpumask_t mask, 
+       void (*func) (void *info), void *info, int wait)
+{
+       struct kvm_call_data_struct data;
+       cpumask_t allbutself;
+       int cpus;
+       int cpu;
+
+       allbutself = cpu_online_map;
+       cpu_clear(smp_processor_id(), allbutself);
+
+       cpus_and(mask, mask, allbutself);
+       cpus = cpus_weight(mask);
+
+       if (!cpus)
+               return 0;
+
+       data.func = func;
+       data.info = info;
+       atomic_set(&data.started, 0);
+       data.wait = wait;
+       if (wait)
+               atomic_set(&data.finished, 0);
+
+       for (cpu = first_cpu(mask); cpu != NR_CPUS; cpu = next_cpu(cpu, mask))
+               smp_call_function_single(cpu, kvm_ack_smp_call, &data, 1, 0);
+
+       while (atomic_read(&data.started) != cpus) {
+               cpu_relax();
+               barrier();
+       }
+
+       if (!wait)
+               return 0;
+
+       while (atomic_read(&data.finished) != cpus) {
+               cpu_relax();
+               barrier();
+       }
+       return 0;
+}
+#endif
-- 
1.5.2.4


-------------------------------------------------------------------------
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-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to