[PATCH RFC 1/2] qemu: use "-accel" option to specify accelerator instead of "-machine"

Paolo Bonzini pbonzini at redhat.com
Mon Jan 11 07:38:51 UTC 2021


On 09/01/21 19:58, huangy81 at chinatelecom.cn wrote:
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 6f970a3..9a64473 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -6711,40 +6711,6 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,
>       virCommandAddArg(cmd, "-machine");
>       virBufferAdd(&buf, def->os.machine, -1);
>   
> -    switch ((virDomainVirtType)def->virtType) {
> -    case VIR_DOMAIN_VIRT_QEMU:
> -        virBufferAddLit(&buf, ",accel=tcg");
> -        break;
> -
> -    case VIR_DOMAIN_VIRT_KVM:
> -        virBufferAddLit(&buf, ",accel=kvm");
> -        break;
> -
> -    case VIR_DOMAIN_VIRT_KQEMU:
> -    case VIR_DOMAIN_VIRT_XEN:
> -    case VIR_DOMAIN_VIRT_LXC:
> -    case VIR_DOMAIN_VIRT_UML:
> -    case VIR_DOMAIN_VIRT_OPENVZ:
> -    case VIR_DOMAIN_VIRT_TEST:
> -    case VIR_DOMAIN_VIRT_VMWARE:
> -    case VIR_DOMAIN_VIRT_HYPERV:
> -    case VIR_DOMAIN_VIRT_VBOX:
> -    case VIR_DOMAIN_VIRT_PHYP:
> -    case VIR_DOMAIN_VIRT_PARALLELS:
> -    case VIR_DOMAIN_VIRT_BHYVE:
> -    case VIR_DOMAIN_VIRT_VZ:
> -    case VIR_DOMAIN_VIRT_NONE:
> -        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -                       _("the QEMU binary does not support %s"),
> -                       virDomainVirtTypeToString(def->virtType));
> -        return -1;
> -
> -    case VIR_DOMAIN_VIRT_LAST:
> -    default:
> -        virReportEnumRangeError(virDomainVirtType, def->virtType);
> -        return -1;
> -    }
> -
>       /* To avoid the collision of creating USB controllers when calling
>        * machine->init in QEMU, it needs to set usb=off
>        */
> @@ -6945,6 +6911,52 @@ qemuBuildMachineCommandLine(virCommandPtr cmd,
>       return 0;
>   }
>   
> +static int
> +qemuBuildAccelCommandLine(virCommandPtr cmd,
> +                          const virDomainDef *def)
> +{
> +    /* the '-machine' options for accelerator are legacy,
> +     * using the '-accel' options by default */
> +    g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
> +    virCommandAddArg(cmd, "-accel");
> +
> +    switch ((virDomainVirtType)def->virtType) {
> +    case VIR_DOMAIN_VIRT_QEMU:
> +        virBufferAddLit(&buf, "tcg");
> +        break;
> +
> +    case VIR_DOMAIN_VIRT_KVM:
> +        virBufferAddLit(&buf, "kvm");
> +        break;
> +
> +    case VIR_DOMAIN_VIRT_KQEMU:
> +    case VIR_DOMAIN_VIRT_XEN:
> +    case VIR_DOMAIN_VIRT_LXC:
> +    case VIR_DOMAIN_VIRT_UML:
> +    case VIR_DOMAIN_VIRT_OPENVZ:
> +    case VIR_DOMAIN_VIRT_TEST:
> +    case VIR_DOMAIN_VIRT_VMWARE:
> +    case VIR_DOMAIN_VIRT_HYPERV:
> +    case VIR_DOMAIN_VIRT_VBOX:
> +    case VIR_DOMAIN_VIRT_PHYP:
> +    case VIR_DOMAIN_VIRT_PARALLELS:
> +    case VIR_DOMAIN_VIRT_BHYVE:
> +    case VIR_DOMAIN_VIRT_VZ:
> +    case VIR_DOMAIN_VIRT_NONE:
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("the QEMU binary does not support %s"),
> +                       virDomainVirtTypeToString(def->virtType));
> +        return -1;
> +
> +    case VIR_DOMAIN_VIRT_LAST:
> +    default:
> +        virReportEnumRangeError(virDomainVirtType, def->virtType);
> +        return -1;
> +    }
> +
> +    virCommandAddArgBuffer(cmd, &buf);
> +    return 0;
> +}
>   
>   static void
>   qemuBuildTSEGCommandLine(virCommandPtr cmd,
> @@ -9840,6 +9852,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
>       if (qemuBuildMachineCommandLine(cmd, cfg, def, qemuCaps, priv) < 0)
>           return NULL;
>   
> +    if (qemuBuildAccelCommandLine(cmd, def) < 0)
> +        return NULL;
> +
>       qemuBuildTSEGCommandLine(cmd, def);

This unfortunately cannot be done unconditionally.  You need to probe 
for the availability of -accel, using something like

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 4d132defbd..23efaccbad 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -609,6 +609,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
                "ncr53c90",
                "dc390",
                "am53c974",
+              "accel",
      );


@@ -3220,6 +3221,7 @@ static struct virQEMUCapsCommandLineProps 
virQEMUCapsCommandLine[] = {
      { "fsdev", "multidevs", QEMU_CAPS_FSDEV_MULTIDEVS },
      { "fw_cfg", "file", QEMU_CAPS_FW_CFG },
      { "fsdev", "fmode", QEMU_CAPS_FSDEV_CREATEMODE }, /* Could have 
also checked fsdev->dmode */
+    { "accel", "accel", QEMU_CAPS_ACCEL },
  };

  static int

Then you can choose between the two code paths using 
virQEMUCapsGet(qemuCaps, QEMU_CAPS_ACCEL).

Thanks,

Paolo




More information about the libvir-list mailing list