From: Dov Murik <dovmurik@xxxxxxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxxxxx> Co-developed-by: Ashish Kalra <ashish.kalra@xxxxxxx> Signed-off-by: Ashish Kalra <ashish.kalra@xxxxxxx> --- 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