[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH 01/13] machine: Add mirrorvcpus=N suboption to -smp
From: |
Ashish Kalra |
Subject: |
[RFC PATCH 01/13] machine: Add mirrorvcpus=N suboption to -smp |
Date: |
Mon, 16 Aug 2021 13:26:45 +0000 |
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
- [RFC PATCH 00/13] Add support for Mirror VM., Ashish Kalra, 2021/08/16
- [RFC PATCH 01/13] machine: Add mirrorvcpus=N suboption to -smp,
Ashish Kalra <=
- [RFC PATCH 02/13] hw/boards: Add mirror_vcpu flag to CPUArchId, Ashish Kalra, 2021/08/16
- [RFC PATCH 03/13] hw/i386: Mark mirror vcpus in possible_cpus, Ashish Kalra, 2021/08/16
- [RFC PATCH 04/13] hw/acpi: Don't include mirror vcpus in ACPI tables, Ashish Kalra, 2021/08/16
- [RFC PATCH 05/13] cpu: Add boolean mirror_vcpu field to CPUState, Ashish Kalra, 2021/08/16
- [RFC PATCH 06/13] hw/i386: Set CPUState.mirror_vcpu=true for mirror vcpus, Ashish Kalra, 2021/08/16
- [RFC PATCH 07/13] kvm: Add Mirror VM ioctl and enable cap interfaces., Ashish Kalra, 2021/08/16
- [RFC PATCH 08/13] kvm: Add Mirror VM support., Ashish Kalra, 2021/08/16
- [RFC PATCH 09/13] kvm: create Mirror VM and share primary VM's encryption context., Ashish Kalra, 2021/08/16
- [RFC PATCH 10/13] softmmu/cpu: Skip mirror vcpu's for pause, resume and synchronization., Ashish Kalra, 2021/08/16