Prior to this, <address type='pci'/> wasn't allowed when parsing (domain+bus+slot+function needed to be a "valid" PCI address, meaning that at least one of domain/bus/slot had to be non-0), the RNG required bus to be specified, and if type was set to PCI when formatting, domain+bus+slot+function would always be output. This makes all the address attributes optional during parse and RNG validation, and suppresses domain+bus+slot+function if domain+bus+slot are all 0 (NB: if d+b+s are all 0, any value for function is nonsensical as that will never happen in the real world, and after the next patch we will always assign a real working address to any empty PCI address before it is ever output to anywhere). Note that explicitly setting all attributes to 0 is equivalent to setting none of them, which is okay, since 0000:00:00 is reserved in any PCI bus setup, and can't be used anyway. --- docs/schemas/basictypes.rng | 8 +++++--- src/conf/device_conf.c | 6 +++--- src/conf/domain_conf.c | 13 ++++++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng index e2936d8..83fd4ec 100644 --- a/docs/schemas/basictypes.rng +++ b/docs/schemas/basictypes.rng @@ -83,9 +83,11 @@ <ref name="pciDomain"/> </attribute> </optional> - <attribute name="bus"> - <ref name="pciBus"/> - </attribute> + <optional> + <attribute name="bus"> + <ref name="pciBus"/> + </attribute> + </optional> <optional> <attribute name="slot"> <ref name="pciSlot"/> diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c index 9d9f6a7..4280513 100644 --- a/src/conf/device_conf.c +++ b/src/conf/device_conf.c @@ -1,7 +1,7 @@ /* * device_conf.c: device XML handling * - * Copyright (C) 2006-2015 Red Hat, Inc. + * Copyright (C) 2006-2016 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -90,7 +90,7 @@ int virPCIDeviceAddressIsValid(virPCIDeviceAddressPtr addr, addr->function); return 0; } - if (!(addr->domain || addr->bus || addr->slot)) { + if (virPCIDeviceAddressIsEmpty(addr)) { if (report) virReportError(VIR_ERR_XML_ERROR, "%s", _("Invalid PCI address 0000:00:00, at least " @@ -152,7 +152,7 @@ virPCIDeviceAddressParseXML(xmlNodePtr node, goto cleanup; } - if (!virPCIDeviceAddressIsValid(addr, true)) + if (!virPCIDeviceAddressIsEmpty(addr) && !virPCIDeviceAddressIsValid(addr, true)) goto cleanup; ret = 0; diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1dc45f4..531e660 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4522,11 +4522,14 @@ virDomainDeviceInfoFormat(virBufferPtr buf, switch ((virDomainDeviceAddressType) info->type) { case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: - virBufferAsprintf(buf, " domain='0x%.4x' bus='0x%.2x' slot='0x%.2x' function='0x%.1x'", - info->addr.pci.domain, - info->addr.pci.bus, - info->addr.pci.slot, - info->addr.pci.function); + if (!virPCIDeviceAddressIsEmpty(&info->addr.pci)) { + virBufferAsprintf(buf, " domain='0x%.4x' bus='0x%.2x' " + "slot='0x%.2x' function='0x%.1x'", + info->addr.pci.domain, + info->addr.pci.bus, + info->addr.pci.slot, + info->addr.pci.function); + } if (info->addr.pci.multi) { virBufferAsprintf(buf, " multifunction='%s'", virTristateSwitchTypeToString(info->addr.pci.multi)); -- 2.5.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list