qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 2/3] vl: sanity check cpu topology


From: Andrew Jones
Subject: [Qemu-devel] [PATCH 2/3] vl: sanity check cpu topology
Date: Fri, 7 Nov 2014 17:04:39 +0100

smp_parse allows partial or complete cpu topology to be given.
In either case there may be inconsistencies in the input which
are currently not sounding any alarms. In some cases the input
is even being silently corrected. We shouldn't do this. Add
warnings when input isn't adding up right, and even abort when
the complete cpu topology has been input, but isn't correct.

Signed-off-by: Andrew Jones <address@hidden>
---
 vl.c | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/vl.c b/vl.c
index 9d9855092ab4a..c62fe29aa8075 100644
--- a/vl.c
+++ b/vl.c
@@ -1288,16 +1288,35 @@ static void smp_parse(QemuOpts *opts)
             if (cores == 0) {
                 threads = threads > 0 ? threads : 1;
                 cores = cpus / (sockets * threads);
-            } else {
-                threads = cpus / (cores * sockets);
+                if (cpus % (sockets * threads)) {
+                    fprintf(stderr, "cpu topology: warning: "
+                            "Calculation results in fractional cores number. "
+                            "Adjusting.\n");
+                    cores += 1;
+                }
+            } else if (threads == 0) {
+                threads = cpus / (sockets * cores);
+                if (cpus % (sockets * cores)) {
+                    fprintf(stderr, "cpu topology: warning: "
+                            "Calculation results in fractional threads number. 
"
+                            "Adjusting.\n");
+                    threads += 1;
+                }
             }
         }
 
+        if (sockets * cores * threads < cpus) {
+            fprintf(stderr, "cpu topology: error: "
+                    "sockets (%u) * cores (%u) * threads (%u) < smp_cpus 
(%u)\n",
+                    sockets, cores, threads, cpus);
+            exit(1);
+        }
+
         max_cpus = qemu_opt_get_number(opts, "maxcpus", 0);
 
         smp_cpus = cpus;
-        smp_cores = cores > 0 ? cores : 1;
-        smp_threads = threads > 0 ? threads : 1;
+        smp_cores = cores;
+        smp_threads = threads;
 
     }
 
-- 
1.9.3




reply via email to

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