[libvirt] [PATCH v12 02/11] qemu_hostdev: move cfg->relaxedACS as a flag
Laine Stump
laine at laine.org
Mon Feb 17 13:57:49 UTC 2014
On 02/17/2014 11:15 AM, Cedric Bosdonnat wrote:
> On Mon, 2014-02-17 at 14:32 +0800, Chunyan Liu wrote:
>> For extracting hostdev codes from qemu_hostdev.c to common library, change qemu
>> specific cfg->relaxedACS handling to be a flag, and pass it to hostdev
>> functions.
>>
>> Signed-off-by: Chunyan Liu <cyliu at suse.com>
>> ---
>> src/qemu/qemu_hostdev.c | 11 +++++++----
>> src/qemu/qemu_hostdev.h | 10 ++++++++--
>> src/qemu/qemu_hotplug.c | 7 ++++++-
>> src/qemu/qemu_process.c | 5 ++++-
>> 4 files changed, 25 insertions(+), 8 deletions(-)
>>
>> diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
>> index 01c24f9..0d313c0 100644
>> --- a/src/qemu/qemu_hostdev.c
>> +++ b/src/qemu/qemu_hostdev.c
>> @@ -650,7 +650,8 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
>> const unsigned char *uuid,
>> virDomainHostdevDefPtr *hostdevs,
>> int nhostdevs,
>> - virQEMUCapsPtr qemuCaps)
>> + virQEMUCapsPtr qemuCaps,
>> + unsigned int flags)
>> {
>> virPCIDeviceListPtr pcidevs = NULL;
>> int last_processed_hostdev_vf = -1;
>> @@ -682,8 +683,9 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
>> for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) {
>> virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i);
>> virPCIDevicePtr other;
>> + bool strict_acs_check = !!(flags & VIR_STRICT_ACS_CHECK);
> Wouldn't that be more readable to have VIR_RELAXED_ACS_CHECK instead? It
> wouldn't change the logic.
I agree that it would be better to make STRICT the default, and have a
RELAXED flag - this way if someone forgets to add the flag in some
circumstance, we won't be defaulting to lowering the level of security.
>
>> - if (!virPCIDeviceIsAssignable(dev, !cfg->relaxedACS)) {
>> + if (!virPCIDeviceIsAssignable(dev, strict_acs_check)) {
>> virReportError(VIR_ERR_OPERATION_INVALID,
>> _("PCI device %s is not assignable"),
>> virPCIDeviceGetName(dev));
>> @@ -1187,14 +1189,15 @@ int
>> qemuPrepareHostDevices(virQEMUDriverPtr driver,
>> virDomainDefPtr def,
>> virQEMUCapsPtr qemuCaps,
>> - bool coldBoot)
>> + bool coldBoot,
>> + unsigned int flags)
>> {
>> if (!def->nhostdevs)
>> return 0;
>>
>> if (qemuPrepareHostdevPCIDevices(driver, def->name, def->uuid,
>> def->hostdevs, def->nhostdevs,
>> - qemuCaps) < 0)
>> + qemuCaps, flags) < 0)
>> return -1;
>>
>> if (qemuPrepareHostUSBDevices(driver, def, coldBoot) < 0)
>> diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h
>> index ffb3167..ab7fb9f 100644
>> --- a/src/qemu/qemu_hostdev.h
>> +++ b/src/qemu/qemu_hostdev.h
>> @@ -27,6 +27,10 @@
>> # include "qemu_conf.h"
>> # include "domain_conf.h"
>>
>> +typedef enum {
>> + VIR_STRICT_ACS_CHECK = (1 << 0), /* strict acs check */
>> +} qemuHostdevFlag;
>> +
>> int qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver,
>> virDomainDefPtr def);
>> int qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver,
>> @@ -40,7 +44,8 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
>> const unsigned char *uuid,
>> virDomainHostdevDefPtr *hostdevs,
>> int nhostdevs,
>> - virQEMUCapsPtr qemuCaps);
>> + virQEMUCapsPtr qemuCaps,
>> + unsigned int flags);
>> int qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev,
>> bool mandatory,
>> virUSBDevicePtr *usb);
>> @@ -54,7 +59,8 @@ int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver,
>> int qemuPrepareHostDevices(virQEMUDriverPtr driver,
>> virDomainDefPtr def,
>> virQEMUCapsPtr qemuCaps,
>> - bool coldBoot);
>> + bool coldBoot,
>> + unsigned int flags);
>> void qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver,
>> const char *name,
>> virDomainHostdevDefPtr *hostdevs,
>> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>> index 7066be6..c47c5e8 100644
>> --- a/src/qemu/qemu_hotplug.c
>> +++ b/src/qemu/qemu_hotplug.c
>> @@ -1154,12 +1154,16 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
>> bool teardownlabel = false;
>> int backend;
>> unsigned long long memKB;
>> + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
Once you've gotten a valid return from virQEMUDriverGetConfig, you've
increased the refcount on the driver object, and you *must* unref it
when you're finished using it...
>> + unsigned int flags = 0;
>>
>> if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
>> return -1;
...but if you take this return, you've not unrefed (yeah yeah, I know
that if you've had a memalloc failure you're hosed anyway...)
>>
>> + if (!cfg->relaxedACS)
>> + flags |= VIR_STRICT_ACS_CHECK;
>> if (qemuPrepareHostdevPCIDevices(driver, vm->def->name, vm->def->uuid,
>> - &hostdev, 1, priv->qemuCaps) < 0)
>> + &hostdev, 1, priv->qemuCaps, flags) < 0)
>> return -1;
...and similarly here. Both of these returns need to goto cleanup;, and
cleanup needs to be just before the call to virObjectUnref().
>>
>> /* this could have been changed by qemuPrepareHostdevPCIDevices */
>> @@ -1254,6 +1258,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
>> VIR_FREE(devstr);
>> VIR_FREE(configfd_name);
>> VIR_FORCE_CLOSE(configfd);
>> + virObjectUnref(cfg);
>>
>> return 0;
>>
>> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
>> index 33d2a77..c0f0719 100644
>> --- a/src/qemu/qemu_process.c
>> +++ b/src/qemu/qemu_process.c
>> @@ -3596,6 +3596,7 @@ int qemuProcessStart(virConnectPtr conn,
>> unsigned int stop_flags;
>> virQEMUDriverConfigPtr cfg;
>> virCapsPtr caps = NULL;
>> + unsigned int hostdev_flags = 0;
>>
>> VIR_DEBUG("vm=%p name=%s id=%d pid=%llu",
>> vm, vm->def->name, vm->def->id,
>> @@ -3685,8 +3686,10 @@ int qemuProcessStart(virConnectPtr conn,
>>
>> /* Must be run before security labelling */
>> VIR_DEBUG("Preparing host devices");
>> + if (!cfg->relaxedACS)
>> + hostdev_flags |= VIR_STRICT_ACS_CHECK;
>> if (qemuPrepareHostDevices(driver, vm->def, priv->qemuCaps,
>> - !migrateFrom) < 0)
>> + !migrateFrom, hostdev_flags) < 0)
>> goto cleanup;
>>
>> VIR_DEBUG("Preparing chr devices");
> ACK.
With the unref problem fixed, and the polarity of the flag switched.
>
> --
> Cedric
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>
More information about the libvir-list
mailing list