qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH] smp: autodetect numbers of threads per core


From: Alexey Kardashevskiy
Subject: [Qemu-devel] [RFC PATCH] smp: autodetect numbers of threads per core
Date: Fri, 15 Nov 2013 16:12:38 +1100

At the moment only a whole CPU core can be assigned to a KVM. Since
POWER7/8 support several threads per core, we want all threads of a core
to go to the same KVM so every time we run QEMU with -enable-kvm on
POWER, we have to add -smp X,threads=(4|8)" (4 for POWER7 and
8 for POWER8).

This patch tries to read smp_threads number from an accelerator and
falls back to the default value (1) if the accelerator did not care
to change it.

Signed-off-by: Alexey Kardashevskiy <address@hidden>
---

(!!!)

The usual question - what would be the normal way of doing this?
What does this patch break? I cannot think of anything right now.


---
 target-ppc/kvm.c |  6 ++++++
 vl.c             | 29 ++++++++++++++++-------------
 2 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index 10d0cd9..80c0386 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -109,6 +109,12 @@ int kvm_arch_init(KVMState *s)
                         "VM to stall at times!\n");
     }
 
+    if (!smp_threads) {
+        smp_threads = cap_ppc_smt;
+    } else {
+        smp_threads = MIN(smp_threads, cap_ppc_smt);
+    }
+
     kvm_ppc_register_host_cpu_type();
 
     return 0;
diff --git a/vl.c b/vl.c
index 4ad15b8..97fa203 100644
--- a/vl.c
+++ b/vl.c
@@ -210,7 +210,7 @@ int singlestep = 0;
 int smp_cpus = 1;
 int max_cpus = 0;
 int smp_cores = 1;
-int smp_threads = 1;
+int smp_threads = 0;
 #ifdef CONFIG_VNC
 const char *vnc_display;
 #endif
@@ -1395,7 +1395,9 @@ static void smp_parse(QemuOpts *opts)
         if (cpus == 0 || sockets == 0) {
             sockets = sockets > 0 ? sockets : 1;
             cores = cores > 0 ? cores : 1;
-            threads = threads > 0 ? threads : 1;
+            if (!threads) {
+                threads = smp_threads > 0 ? smp_threads : 1;
+            }
             if (cpus == 0) {
                 cpus = cores * threads * sockets;
             }
@@ -1413,7 +1415,8 @@ static void smp_parse(QemuOpts *opts)
         smp_cpus = cpus;
         smp_cores = cores > 0 ? cores : 1;
         smp_threads = threads > 0 ? threads : 1;
-
+    } else if (!smp_threads) {
+        smp_threads = 1;
     }
 
     if (max_cpus == 0) {
@@ -3880,16 +3883,6 @@ int main(int argc, char **argv, char **envp)
         data_dir[data_dir_idx++] = CONFIG_QEMU_DATADIR;
     }
 
-    smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL));
-
-    machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
-    if (smp_cpus > machine->max_cpus) {
-        fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
-                "supported by machine `%s' (%d)\n", smp_cpus,  machine->name,
-                machine->max_cpus);
-        exit(1);
-    }
-
     /*
      * Get the default machine options from the machine if it is not already
      * specified either by the configuration file or by the command line.
@@ -4039,6 +4032,16 @@ int main(int argc, char **argv, char **envp)
 
     configure_accelerator();
 
+    smp_parse(qemu_opts_find(qemu_find_opts("smp-opts"), NULL));
+
+    machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
+    if (smp_cpus > machine->max_cpus) {
+        fprintf(stderr, "Number of SMP cpus requested (%d), exceeds max cpus "
+                "supported by machine `%s' (%d)\n", smp_cpus,  machine->name,
+                machine->max_cpus);
+        exit(1);
+    }
+
     if (!qtest_enabled() && qtest_chrdev) {
         qtest_init();
     }
-- 
1.8.4.rc4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]