[libvirt] [PATCH 02/34] Introduce a standardized data structure for device addresses
Daniel Veillard
veillard at redhat.com
Fri Jan 15 12:39:18 UTC 2010
On Fri, Jan 08, 2010 at 05:22:58PM +0000, Daniel P. Berrange wrote:
> All guest devices now use a common device address structure
> summarized by:
>
> enum virDomainDeviceAddressType {
> VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE,
> VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI,
> };
>
> struct _virDomainDevicePCIAddress {
> unsigned int domain;
> unsigned int bus;
> unsigned int slot;
> unsigned int function;
> };
>
> struct _virDomainDeviceInfo {
> int type;
> union {
> virDomainDevicePCIAddress pci;
> } addr;
> };
>
> This replaces the anonymous structs in Disk/Net/Hostdev data
> structures. Where available, the address is *always* printed
> in the XML file, instead of being hidden in the internal state
> file.
>
> <address type='pci' domain='0x0000' bus='0x1e' slot='0x07' function='0x0'/>
>
> The structure definition is based on Wolfgang Mauerer's disk
> controller patch series.
>
> * docs/schemas/domain.rng: Define the <address> syntax and
> associate it with disk/net/hostdev devices
> * src/conf/domain_conf.h, src/conf/domain_conf.c,
> src/libvirt_private.syms: APIs for parsing/formatting address
> information. Also remove the QEMU specific 'pci_addr' attributes
> * src/qemu/qemu_driver.c: Replace use of 'pci_addr' attrs with
> new standardized format.
> ---
> docs/schemas/domain.rng | 55 +++++--
> src/conf/domain_conf.c | 420 +++++++++++++++++++++++++++++++++-------------
> src/conf/domain_conf.h | 84 +++++-----
> src/libvirt_private.syms | 6 +
> src/qemu/qemu_driver.c | 64 ++++---
> 5 files changed, 428 insertions(+), 201 deletions(-)
>
[...]
> +int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info,
> + int type)
> +{
> + if (info->type != type)
> + return 0;
> +
> + switch (info->type) {
> + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
> + return virDomainDevicePCIAddressIsValid(&info->addr.pci);
> + }
Hum, a switch without default and not handling all cases may generate
a warning with some compiler options (I find this useful when extending
the union) maybe we should explicitely return 0 with _NONE
> +static int
> +virDomainDevicePCIAddressParseXML(virConnectPtr conn,
> + xmlNodePtr node,
> + virDomainDevicePCIAddressPtr addr)
> +{
> + char *domain, *slot, *bus, *function;
> + int ret = -1;
> +
> + memset(addr, 0, sizeof(*addr));
> +
> + domain = virXMLPropString(node, "domain");
> + bus = virXMLPropString(node, "bus");
> + slot = virXMLPropString(node, "slot");
> + function = virXMLPropString(node, "function");
> +
> + if (domain &&
> + virStrToLong_ui(domain, NULL, 16, &addr->domain) < 0) {
> + virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Cannot parse <address> 'domain' attribute"));
> + goto cleanup;
> + }
Hum, there is a small mismatch between the parsing function and the
validation, virStrToLong_ uses strtol like function decoding 0 leading
numbers as octal, but we don't match octal in the Relax-NG associated
functions:
<define name="pciDomain">
<data type="string">
<param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
</data>
</define>
Do we really intent to allow 0 started octal values ? I guess in octal
we would need more than 4 digit to cover the address range.
But it's a minor point, we could fix the RNG later
ACK, the new routines are nice and the refactoring is a good cleanup !
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list