From: Dov Murik <dovmurik@linux.vnet.ibm.com>
Add a notion of mirror vcpus to CpuTopology, which will allow to
designate a few vcpus (normally 1) for running the guest
migration handler (MH).
Example usage for starting a 4-vcpu guest, of which 1 vcpu is marked as
mirror vcpu.
qemu-system-x86_64 -smp 4,mirrorvcpus=1 ...
Signed-off-by: Dov Murik <dovmurik@linux.vnet.ibm.com>
Co-developed-by: Ashish Kalra <ashish.kalra@amd.com>
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
---
hw/core/machine.c | 7 +++++++
hw/i386/pc.c | 7 +++++++
include/hw/boards.h | 1 +
qapi/machine.json | 5 ++++-
softmmu/vl.c | 3 +++
5 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 943974d411..059262f914 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -749,6 +749,7 @@ static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
unsigned sockets = config->has_sockets ? config->sockets : 0;
unsigned cores = config->has_cores ? config->cores : 0;
unsigned threads = config->has_threads ? config->threads : 0;
+ unsigned mirror_vcpus = config->has_mirrorvcpus ? config->mirrorvcpus : 0;
if (config->has_dies && config->dies != 0 && config->dies != 1) {
error_setg(errp, "dies not supported by this machine's CPU topology");
@@ -787,6 +788,11 @@ static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
return;
}
+ if (mirror_vcpus > ms->smp.max_cpus) {
+ error_setg(errp, "mirror vcpus must be less than max cpus");
+ return;
+ }
+
if (sockets * cores * threads != ms->smp.max_cpus) {
error_setg(errp, "Invalid CPU topology: "
"sockets (%u) * cores (%u) * threads (%u) "
@@ -800,6 +806,7 @@ static void smp_parse(MachineState *ms, SMPConfiguration *config, Error **errp)
ms->smp.cores = cores;
ms->smp.threads = threads;
ms->smp.sockets = sockets;
+ ms->smp.mirror_vcpus = mirror_vcpus;
}
static void machine_get_smp(Object *obj, Visitor *v, const char *name,
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index c2b9d62a35..3856a47390 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -719,6 +719,7 @@ static void pc_smp_parse(MachineState *ms, SMPConfiguration *config, Error **err
unsigned dies = config->has_dies ? config->dies : 1;
unsigned cores = config->has_cores ? config->cores : 0;
unsigned threads = config->has_threads ? config->threads : 0;
+ unsigned mirror_vcpus = config->has_mirrorvcpus ? config->mirrorvcpus : 0;
/* compute missing values, prefer sockets over cores over threads */
if (cpus == 0 || sockets == 0) {
@@ -753,6 +754,11 @@ static void pc_smp_parse(MachineState *ms, SMPConfiguration *config, Error **err
return;
}
+ if (mirror_vcpus > ms->smp.max_cpus) {
+ error_setg(errp, "mirror vcpus must be less than max cpus");
+ return;
+ }
+
if (sockets * dies * cores * threads != ms->smp.max_cpus) {
error_setg(errp, "Invalid CPU topology deprecated: "
"sockets (%u) * dies (%u) * cores (%u) * threads (%u) "
@@ -767,6 +773,7 @@ static void pc_smp_parse(MachineState *ms, SMPConfiguration *config, Error **err
ms->smp.threads = threads;
ms->smp.sockets = sockets;
ms->smp.dies = dies;
+ ms->smp.mirror_vcpus = mirror_vcpus;
}
static
diff --git a/include/hw/boards.h b/include/hw/boards.h
index accd6eff35..b0e599096a 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -286,6 +286,7 @@ typedef struct CpuTopology {
unsigned int threads;
unsigned int sockets;
unsigned int max_cpus;
+ unsigned int mirror_vcpus;
} CpuTopology;
/**
diff --git a/qapi/machine.json b/qapi/machine.json
index c3210ee1fb..7888601715 100644
--- a/qapi/machine.json
+++ b/qapi/machine.json
@@ -1303,6 +1303,8 @@
#
# @maxcpus: maximum number of hotpluggable virtual CPUs in the virtual machine
#
+# @mirrorvcpus: maximum number of mirror virtual CPUs in the virtual machine
+#
# Since: 6.1
##
{ 'struct': 'SMPConfiguration', 'data': {
@@ -1311,4 +1313,5 @@
'*dies': 'int',
'*cores': 'int',
'*threads': 'int',
- '*maxcpus': 'int' } }
+ '*maxcpus': 'int',
+ '*mirrorvcpus': 'int' } }
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 5ca11e7469..6261f1cfb1 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -710,6 +710,9 @@ static QemuOptsList qemu_smp_opts = {
}, {
.name = "maxcpus",
.type = QEMU_OPT_NUMBER,
+ }, {
+ .name = "mirrorvcpus",
+ .type = QEMU_OPT_NUMBER,
},
{ /*End of list */ }
},
--
2.17.1