machine: add error propagation to mc->smp_parse

Clean up the smp_parse functions to use Error** instead of exiting.

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20210617155308.928754-9-pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2021-06-17 17:53:05 +02:00
parent 593d3c5148
commit abc2f51144
4 changed files with 34 additions and 32 deletions

View File

@ -739,7 +739,7 @@ void machine_set_cpu_numa_node(MachineState *machine,
} }
} }
static void smp_parse(MachineState *ms, QemuOpts *opts) static void smp_parse(MachineState *ms, QemuOpts *opts, Error **errp)
{ {
unsigned cpus = qemu_opt_get_number(opts, "cpus", 0); unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
unsigned sockets = qemu_opt_get_number(opts, "sockets", 0); unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
@ -766,28 +766,28 @@ static void smp_parse(MachineState *ms, QemuOpts *opts)
threads = cpus / (cores * sockets); threads = cpus / (cores * sockets);
threads = threads > 0 ? threads : 1; threads = threads > 0 ? threads : 1;
} else if (sockets * cores * threads < cpus) { } else if (sockets * cores * threads < cpus) {
error_report("cpu topology: " error_setg(errp, "cpu topology: "
"sockets (%u) * cores (%u) * threads (%u) < " "sockets (%u) * cores (%u) * threads (%u) < "
"smp_cpus (%u)", "smp_cpus (%u)",
sockets, cores, threads, cpus); sockets, cores, threads, cpus);
exit(1); return;
} }
ms->smp.max_cpus = ms->smp.max_cpus =
qemu_opt_get_number(opts, "maxcpus", cpus); qemu_opt_get_number(opts, "maxcpus", cpus);
if (ms->smp.max_cpus < cpus) { if (ms->smp.max_cpus < cpus) {
error_report("maxcpus must be equal to or greater than smp"); error_setg(errp, "maxcpus must be equal to or greater than smp");
exit(1); return;
} }
if (sockets * cores * threads != ms->smp.max_cpus) { if (sockets * cores * threads != ms->smp.max_cpus) {
error_report("Invalid CPU topology: " error_setg(errp, "Invalid CPU topology: "
"sockets (%u) * cores (%u) * threads (%u) " "sockets (%u) * cores (%u) * threads (%u) "
"!= maxcpus (%u)", "!= maxcpus (%u)",
sockets, cores, threads, sockets, cores, threads,
ms->smp.max_cpus); ms->smp.max_cpus);
exit(1); return;
} }
ms->smp.cpus = cpus; ms->smp.cpus = cpus;
@ -1126,9 +1126,13 @@ MemoryRegion *machine_consume_memdev(MachineState *machine,
bool machine_smp_parse(MachineState *ms, QemuOpts *opts, Error **errp) bool machine_smp_parse(MachineState *ms, QemuOpts *opts, Error **errp)
{ {
MachineClass *mc = MACHINE_GET_CLASS(ms); MachineClass *mc = MACHINE_GET_CLASS(ms);
ERRP_GUARD();
if (opts) { if (opts) {
mc->smp_parse(ms, opts); mc->smp_parse(ms, opts, errp);
if (*errp) {
return false;
}
} }
/* sanity-check smp_cpus and max_cpus against mc */ /* sanity-check smp_cpus and max_cpus against mc */

View File

@ -710,7 +710,7 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level)
* This function is very similar to smp_parse() * This function is very similar to smp_parse()
* in hw/core/machine.c but includes CPU die support. * in hw/core/machine.c but includes CPU die support.
*/ */
void pc_smp_parse(MachineState *ms, QemuOpts *opts) static void pc_smp_parse(MachineState *ms, QemuOpts *opts, Error **errp)
{ {
unsigned cpus = qemu_opt_get_number(opts, "cpus", 0); unsigned cpus = qemu_opt_get_number(opts, "cpus", 0);
unsigned sockets = qemu_opt_get_number(opts, "sockets", 0); unsigned sockets = qemu_opt_get_number(opts, "sockets", 0);
@ -738,28 +738,28 @@ void pc_smp_parse(MachineState *ms, QemuOpts *opts)
threads = cpus / (cores * dies * sockets); threads = cpus / (cores * dies * sockets);
threads = threads > 0 ? threads : 1; threads = threads > 0 ? threads : 1;
} else if (sockets * dies * cores * threads < cpus) { } else if (sockets * dies * cores * threads < cpus) {
error_report("cpu topology: " error_setg(errp, "cpu topology: "
"sockets (%u) * dies (%u) * cores (%u) * threads (%u) < " "sockets (%u) * dies (%u) * cores (%u) * threads (%u) < "
"smp_cpus (%u)", "smp_cpus (%u)",
sockets, dies, cores, threads, cpus); sockets, dies, cores, threads, cpus);
exit(1); return;
} }
ms->smp.max_cpus = ms->smp.max_cpus =
qemu_opt_get_number(opts, "maxcpus", cpus); qemu_opt_get_number(opts, "maxcpus", cpus);
if (ms->smp.max_cpus < cpus) { if (ms->smp.max_cpus < cpus) {
error_report("maxcpus must be equal to or greater than smp"); error_setg(errp, "maxcpus must be equal to or greater than smp");
exit(1); return;
} }
if (sockets * dies * cores * threads != ms->smp.max_cpus) { if (sockets * dies * cores * threads != ms->smp.max_cpus) {
error_report("Invalid CPU topology deprecated: " error_setg(errp, "Invalid CPU topology deprecated: "
"sockets (%u) * dies (%u) * cores (%u) * threads (%u) " "sockets (%u) * dies (%u) * cores (%u) * threads (%u) "
"!= maxcpus (%u)", "!= maxcpus (%u)",
sockets, dies, cores, threads, sockets, dies, cores, threads,
ms->smp.max_cpus); ms->smp.max_cpus);
exit(1); return;
} }
ms->smp.cpus = cpus; ms->smp.cpus = cpus;

View File

@ -210,7 +210,7 @@ struct MachineClass {
void (*reset)(MachineState *state); void (*reset)(MachineState *state);
void (*wakeup)(MachineState *state); void (*wakeup)(MachineState *state);
int (*kvm_type)(MachineState *machine, const char *arg); int (*kvm_type)(MachineState *machine, const char *arg);
void (*smp_parse)(MachineState *ms, QemuOpts *opts); void (*smp_parse)(MachineState *ms, QemuOpts *opts, Error **errp);
BlockInterfaceType block_default_type; BlockInterfaceType block_default_type;
int units_per_default_bus; int units_per_default_bus;

View File

@ -138,8 +138,6 @@ extern int fd_bootchk;
void pc_acpi_smi_interrupt(void *opaque, int irq, int level); void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
void pc_smp_parse(MachineState *ms, QemuOpts *opts);
void pc_guest_info_init(PCMachineState *pcms); void pc_guest_info_init(PCMachineState *pcms);
#define PCI_HOST_PROP_PCI_HOLE_START "pci-hole-start" #define PCI_HOST_PROP_PCI_HOLE_START "pci-hole-start"