[libvirt] [PATCH 13/25] qemu: Introduce qemuBuildChannelsCommandLine
John Ferlan
jferlan at redhat.com
Tue Mar 1 12:43:10 UTC 2016
On 02/18/2016 12:50 PM, John Ferlan wrote:
> Add new function to manage adding the channel device options to the
> command line removing that task from the mainline qemuBuildCommandLine.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/qemu/qemu_command.c | 159 ++++++++++++++++++++++++++----------------------
> 1 file changed, 87 insertions(+), 72 deletions(-)
>
I've merged my local branch with the latest upstream taking into account
Martin's commit 'a89f05ba8d' with the following adjustment:
The rest of the changes merged fine. I can repost (in parts) if
desired... To make it less onerous to review such a large pile.
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index f161c4f..07328b0 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -7666,6 +7666,91 @@ qemuBuildParallelsCommandLine(virCommandPtr cmd,
>
>
> static int
> +qemuBuildChannelsCommandLine(virCommandPtr cmd,
> + virQEMUDriverConfigPtr cfg,
> + const virDomainDef *def,
> + virQEMUCapsPtr qemuCaps)
> +{
> + size_t i;
> +
> + for (i = 0; i < def->nchannels; i++) {
> + virDomainChrDefPtr channel = def->channels[i];
> + char *devstr;
> +
> + switch (channel->targetType) {
> + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD:
> + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
> + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + "%s", _("guestfwd requires QEMU to support -chardev & -device"));
> + return -1;
> + }
> +
> + virCommandAddArg(cmd, "-chardev");
> + if (!(devstr = qemuBuildChrChardevStr(&channel->source,
> + channel->info.alias,
> + qemuCaps)))
> + return -1;
> + virCommandAddArg(cmd, devstr);
> + VIR_FREE(devstr);
> +
> + if (qemuBuildChrDeviceStr(&devstr, def, channel, qemuCaps) < 0)
> + return -1;
> + virCommandAddArgList(cmd, "-netdev", devstr, NULL);
> + VIR_FREE(devstr);
> + break;
> +
> + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO:
> + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("virtio channel requires QEMU to support -device"));
> + return -1;
> + }
> +
> + /*
> + * TODO: Refactor so that we generate this (and onther
> + * things) somewhere else then where we are building the
> + * command line.
> + */
> + if (channel->source.type == VIR_DOMAIN_CHR_TYPE_UNIX &&
> + !channel->source.data.nix.path) {
> + if (virAsprintf(&channel->source.data.nix.path,
> + "%s/domain-%s/%s",
> + cfg->channelTargetDir, def->name,
- "%s/domain-%s/%s",
- cfg->channelTargetDir, def->name,
++ "%s/%s", domainChannelTargetDir,
> + channel->target.name ? channel->target.name
> + : "unknown.sock") < 0)
> + return -1;
> +
> + channel->source.data.nix.listen = true;
> + }
> +
> + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC) &&
> + channel->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
> + /* spicevmc was originally introduced via a -device
> + * with a backend internal to qemu; although we prefer
> + * the newer -chardev interface. */
> + ;
> + } else {
> + virCommandAddArg(cmd, "-chardev");
> + if (!(devstr = qemuBuildChrChardevStr(&channel->source,
> + channel->info.alias,
> + qemuCaps)))
> + return -1;
> + virCommandAddArg(cmd, devstr);
> + VIR_FREE(devstr);
> + }
> +
> + if (qemuBuildChrDeviceCommandLine(cmd, def, channel, qemuCaps) < 0)
> + return -1;
> + break;
> + }
> + }
> +
> + return 0;
> +}
> +
> +
> +static int
> qemuBuildDomainLoaderCommandLine(virCommandPtr cmd,
> virDomainDefPtr def,
> virQEMUCapsPtr qemuCaps)
> @@ -8221,78 +8306,8 @@ qemuBuildCommandLine(virConnectPtr conn,
> if (qemuBuildParallelsCommandLine(cmd, def, qemuCaps) < 0)
> goto error;
>
> - for (i = 0; i < def->nchannels; i++) {
> - virDomainChrDefPtr channel = def->channels[i];
> - char *devstr;
> -
> - switch (channel->targetType) {
> - case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD:
> - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
> - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> - "%s", _("guestfwd requires QEMU to support -chardev & -device"));
> - goto error;
> - }
> -
> - virCommandAddArg(cmd, "-chardev");
> - if (!(devstr = qemuBuildChrChardevStr(&channel->source,
> - channel->info.alias,
> - qemuCaps)))
> - goto error;
> - virCommandAddArg(cmd, devstr);
> - VIR_FREE(devstr);
> -
> - if (qemuBuildChrDeviceStr(&devstr, def, channel, qemuCaps) < 0)
> - goto error;
> - virCommandAddArgList(cmd, "-netdev", devstr, NULL);
> - VIR_FREE(devstr);
> - break;
> -
> - case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO:
> - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> - _("virtio channel requires QEMU to support -device"));
> - goto error;
> - }
> -
> - /*
> - * TODO: Refactor so that we generate this (and onther
> - * things) somewhere else then where we are building the
> - * command line.
> - */
> - if (channel->source.type == VIR_DOMAIN_CHR_TYPE_UNIX &&
> - !channel->source.data.nix.path) {
> - if (virAsprintf(&channel->source.data.nix.path,
> - "%s/domain-%s/%s",
> - cfg->channelTargetDir, def->name,
> - channel->target.name ? channel->target.name
> - : "unknown.sock") < 0)
> - goto error;
> -
> - channel->source.data.nix.listen = true;
> - }
> -
> - if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC) &&
> - channel->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
> - /* spicevmc was originally introduced via a -device
> - * with a backend internal to qemu; although we prefer
> - * the newer -chardev interface. */
> - ;
> - } else {
> - virCommandAddArg(cmd, "-chardev");
> - if (!(devstr = qemuBuildChrChardevStr(&channel->source,
> - channel->info.alias,
> - qemuCaps)))
> - goto error;
> - virCommandAddArg(cmd, devstr);
> - VIR_FREE(devstr);
> - }
> -
> - if (qemuBuildChrDeviceCommandLine(cmd, def, channel, qemuCaps) < 0)
> - goto error;
> - break;
> - }
> - }
> + if (qemuBuildChannelsCommandLine(cmd, cfg, def, qemuCaps) < 0)
> + goto error;
>
> /* Explicit console devices */
> for (i = 0; i < def->nconsoles; i++) {
>
More information about the libvir-list
mailing list