cpu_riscv64.c: add update() implementation

At this moment it is not possible to launch a 'riscv64' domain if a CPU
definition is presented in the domain. For example, adding this CPU
definition:

  <cpu mode='custom' match='exact' check='none'>
    <model fallback='forbid'>rv64</model>
  </cpu>

Will trigger the following error:

$ sudo ./run tools/virsh start riscv-virt1
error: Failed to start domain 'riscv-virt1'
error: this function is not supported by the connection driver:
       cannot update guest CPU for riscv64 architecture

The error comes from virCPUUpdate(), via qemuProcessUpdateGuestCPU(),
and it's caused by the absence of the 'update' API in the existing
RISC-V driver.

Add an 'update' API impl to the RISC-V driver to allow for CPU
definitions to be declared in RISC-V domains. This API was copied from
the ARM driver (virCPUarmUpdate()) since it's a good enough
implementation to get us going.

Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Andrea Bolognani <abologna@redhat.com>
This commit is contained in:
Daniel Henrique Barboza 2023-04-28 16:57:28 -03:00 committed by Andrea Bolognani
parent 2f197ab695
commit d4c39bad85
2 changed files with 28 additions and 1 deletions

View File

@ -70,6 +70,7 @@ src/cpu/cpu.c
src/cpu/cpu_arm.c src/cpu/cpu_arm.c
src/cpu/cpu_map.c src/cpu/cpu_map.c
src/cpu/cpu_ppc64.c src/cpu/cpu_ppc64.c
src/cpu/cpu_riscv64.c
src/cpu/cpu_s390.c src/cpu/cpu_s390.c
src/cpu/cpu_x86.c src/cpu/cpu_x86.c
src/datatypes.c src/datatypes.c

View File

@ -46,6 +46,32 @@ virCPURiscv64ValidateFeatures(virCPUDef *cpu G_GNUC_UNUSED)
} }
static int
virCPURiscv64Update(virCPUDef *guest,
const virCPUDef *host,
bool relative)
{
g_autoptr(virCPUDef) updated = virCPUDefCopyWithoutModel(guest);
if (!relative || guest->mode != VIR_CPU_MODE_HOST_MODEL)
return 0;
if (!host) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("unknown host CPU model"));
return -1;
}
updated->mode = VIR_CPU_MODE_CUSTOM;
virCPUDefCopyModel(updated, host, true);
virCPUDefStealModel(guest, updated, false);
guest->mode = VIR_CPU_MODE_CUSTOM;
guest->match = VIR_CPU_MATCH_EXACT;
return 0;
}
struct cpuArchDriver cpuDriverRiscv64 = { struct cpuArchDriver cpuDriverRiscv64 = {
.name = "riscv64", .name = "riscv64",
.arch = archs, .arch = archs,
@ -54,6 +80,6 @@ struct cpuArchDriver cpuDriverRiscv64 = {
.decode = NULL, .decode = NULL,
.encode = NULL, .encode = NULL,
.baseline = NULL, .baseline = NULL,
.update = NULL, .update = virCPURiscv64Update,
.validateFeatures = virCPURiscv64ValidateFeatures, .validateFeatures = virCPURiscv64ValidateFeatures,
}; };