[libvirt] [PATCH 12/24] qemu: Separate raw IO code from qemuProcessStart
Peter Krempa
pkrempa at redhat.com
Fri Nov 13 10:40:26 UTC 2015
On Thu, Nov 12, 2015 at 19:37:14 +0100, Jiri Denemark wrote:
> qemuProcessStart is so big that any nontrivial code should be moved to
> dedicated functions to make the code easier to read and maintain.
>
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
> src/qemu/qemu_process.c | 105 ++++++++++++++++++++++++++++--------------------
> 1 file changed, 62 insertions(+), 43 deletions(-)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 4b871a8..d5f6750 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -4333,6 +4333,65 @@ qemuProcessSetupGraphics(virQEMUDriverPtr driver,
> }
>
>
> +static int
> +qemuProcessSetupRawIO(virQEMUDriverPtr driver,
> + virDomainObjPtr vm,
> + virCommandPtr cmd ATTRIBUTE_UNUSED)
> +{
> + bool rawio = false;
> + size_t i;
> + int ret = -1;
> +
> + /* in case a certain disk is desirous of CAP_SYS_RAWIO, add this */
> + for (i = 0; i < vm->def->ndisks; i++) {
> + virDomainDeviceDef dev;
> + virDomainDiskDefPtr disk = vm->def->disks[i];
> +
> + if (disk->rawio == VIR_TRISTATE_BOOL_YES) {
> + rawio = true;
> +#ifndef CAP_SYS_RAWIO
Yuck!, but pre-existing ...
> + break;
> +#endif
> + }
> +
> + dev.type = VIR_DOMAIN_DEVICE_DISK;
> + dev.data.disk = disk;
> + if (qemuAddSharedDevice(driver, &dev, vm->def->name) < 0)
> + goto cleanup;
> +
> + if (qemuSetUnprivSGIO(&dev) < 0)
> + goto cleanup;
> + }
> +
> + /* If rawio not already set, check hostdevs as well */
> + if (!rawio) {
> + for (i = 0; i < vm->def->nhostdevs; i++) {
> + virDomainHostdevSubsysSCSIPtr scsisrc =
> + &vm->def->hostdevs[i]->source.subsys.u.scsi;
> + if (scsisrc->rawio == VIR_TRISTATE_BOOL_YES) {
> + rawio = true;
> + break;
> + }
> + }
> + }
> +
> + ret = 0;
> +
> + cleanup:
> + if (rawio) {
> +#ifdef CAP_SYS_RAWIO
> + if (ret == 0)
> + virCommandAllowCap(cmd, CAP_SYS_RAWIO);
> +#else
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("Raw I/O is not supported on this platform"));
> + ret = -1;
> +#endif
> + }
> + return ret;
> +}
> +
> +
> int qemuProcessStart(virConnectPtr conn,
> virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> @@ -4353,7 +4412,6 @@ int qemuProcessStart(virConnectPtr conn,
> virCommandPtr cmd = NULL;
> struct qemuProcessHookData hookData;
> size_t i;
> - bool rawio_set = false;
> char *nodeset = NULL;
> unsigned int stop_flags;
> virQEMUDriverConfigPtr cfg;
> @@ -4689,48 +4747,9 @@ int qemuProcessStart(virConnectPtr conn,
> if (cfg->clearEmulatorCapabilities)
> virCommandClearCaps(cmd);
>
> - /* in case a certain disk is desirous of CAP_SYS_RAWIO, add this */
> - for (i = 0; i < vm->def->ndisks; i++) {
> - virDomainDeviceDef dev;
> - virDomainDiskDefPtr disk = vm->def->disks[i];
> -
> - if (vm->def->disks[i]->rawio == VIR_TRISTATE_BOOL_YES) {
> -#ifdef CAP_SYS_RAWIO
> - virCommandAllowCap(cmd, CAP_SYS_RAWIO);
> - rawio_set = true;
> -#else
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> - _("Raw I/O is not supported on this platform"));
> - goto error;
> -#endif
... but the new code is possibly less-yuck than this.
> - }
> -
> - dev.type = VIR_DOMAIN_DEVICE_DISK;
> - dev.data.disk = disk;
> - if (qemuAddSharedDevice(driver, &dev, vm->def->name) < 0)
> - goto error;
> -
> - if (qemuSetUnprivSGIO(&dev) < 0)
> - goto error;
> - }
> -
> - /* If rawio not already set, check hostdevs as well */
> - if (!rawio_set) {
> - for (i = 0; i < vm->def->nhostdevs; i++) {
> - virDomainHostdevSubsysSCSIPtr scsisrc =
> - &vm->def->hostdevs[i]->source.subsys.u.scsi;
> - if (scsisrc->rawio == VIR_TRISTATE_BOOL_YES) {
> -#ifdef CAP_SYS_RAWIO
> - virCommandAllowCap(cmd, CAP_SYS_RAWIO);
> - break;
> -#else
> - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> - _("Raw I/O is not supported on this platform"));
> - goto error;
> -#endif
> - }
> - }
> - }
> + VIR_DEBUG("Setting up raw IO");
> + if (qemuProcessSetupRawIO(driver, vm, cmd) < 0)
> + goto error;
>
> virCommandSetPreExecHook(cmd, qemuProcessHook, &hookData);
> virCommandSetMaxProcesses(cmd, cfg->maxProcesses);
We probably should add a function that will be conditionally compiled
and determinign whether rawio works or not so that the code can be
cleaner.
This is a improvement compared to the old code though, so ...
ACK.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20151113/65814d45/attachment-0001.sig>
More information about the libvir-list
mailing list