[libvirt] PATCH: 7/12: Public API for node devices
Mark McLoughlin
markmc at redhat.com
Fri Nov 14 12:46:09 UTC 2008
Hi,
This is my first time looking at this, so sorry if I bring up stuff
which has already been discussed at length.
On the whole, this all looks pretty great ...
On Thu, 2008-11-13 at 17:30 +0000, Daniel P. Berrange wrote:
> This patch is the public API parts of the node device enumeration code.
> No changes since David's last submission of this, except for some
> Makefile tweaks
>
> Daniel
>
> diff -r 78738f80cf4c include/libvirt/libvirt.h
> --- a/include/libvirt/libvirt.h Wed Nov 12 21:05:32 2008 +0000
> +++ b/include/libvirt/libvirt.h Wed Nov 12 21:11:46 2008 +0000
> @@ -995,6 +995,74 @@
> unsigned int flags);
>
> /*
> + * Host device enumeration
> + */
> +
> +/**
> + * virNodeDevice:
> + *
> + * A virNodeDevice contains a node (host) device details.
> + */
> +
> +typedef struct _virNodeDevice virNodeDevice;
> +
> +/**
> + * virNodeDevicePtr:
> + *
> + * A virNodeDevicePtr is a pointer to a virNodeDevice structure. Get
> + * one via virNodeDeviceLookupByKey, virNodeDeviceLookupByName, or
> + * virNodeDeviceCreate. Be sure to Call virNodeDeviceFree when done
> + * using a virNodeDevicePtr obtained from any of the above functions to
> + * avoid leaking memory.
> + */
> +
> +typedef virNodeDevice *virNodeDevicePtr;
> +
> +
> +int virNodeNumOfDevices (virConnectPtr conn,
> + unsigned int flags);
> +
> +int virNodeListDevices (virConnectPtr conn,
> + char **const names,
> + int maxnames,
> + unsigned int flags);
> +
> +int virNodeNumOfDevicesByCap (virConnectPtr conn,
> + const char *cap,
> + unsigned int flags);
> +
> +int virNodeListDevicesByCap (virConnectPtr conn,
> + const char *cap,
> + char **const names,
> + int maxnames,
> + unsigned int flags);
How about combining these two sets of functions and if the capability
type isn't supplied list all devices?
> +
> +virNodeDevicePtr virNodeDeviceLookupByName (virConnectPtr conn,
> + const char *name);
> +
> +const char * virNodeDeviceGetName (virNodeDevicePtr dev);
> +
How stable are these names? e.g. should we say that no-one should rely
on the format of the name and that the name of a given device could
change across node reboots? Even if HAL guarantees the name to be stable
(does it?), if you switch between HAL and DevKit it could change, right?
> +const char * virNodeDeviceGetParent (virNodeDevicePtr dev);
A GetParent() but no ListChildren() seems a little strange ...
Some of the hierarchy seems a little strange to me, e.g.
# ./virsh node-list-devices --cap net
...
net_00_13_20_f7_4a_06
# ./virsh node-device-dumpxml net_00_13_20_f7_4a_06
<device>
<name>net_00_13_20_f7_4a_06</name>
<parent>pci_8086_10de</parent>
<capability type='net'>
<interface>eth0</interface>
<address>00:13:20:f7:4a:06</address>
<capability type='80203'>
<mac_address>001320f74a06</address>
</capability>
</capability>
</device>
# ./virsh node-device-dumpxml pci_8086_10de
<device>
<name>pci_8086_10de</name>
<parent>computer</parent>
<capability type='pci'>
<domain>0</domain>
<bus>0</bus>
<slot>25</slot>
<function>0</function>
<product id='4318'>82567LM-3 Gigabit Network Connection</product>
<vendor id='32902'>Intel Corporation</vendor>
</capability>
</device>
I see that all this naturally flows from the way hal does things, but
the pci device isn't a parent of the network device in any real
sense ... I guess I would expect to just see one device with both the
'net' and 'pci' capabilities.
> +int virNodeDeviceNumOfCaps (virNodeDevicePtr dev);
> +
> +int virNodeDeviceListCaps (virNodeDevicePtr dev,
> + char **const names,
> + int maxnames);
I think it would make more sense to me if there was a fixed set of
capability types and for them to be an enum in the API rather than
strings ...
> +char * virNodeDeviceGetXMLDesc (virNodeDevicePtr dev,
> + unsigned int flags);
> +
> +virNodeDevicePtr virNodeDeviceCreate (virConnectPtr conn,
> + const char *xml,
> + unsigned int flags);
Very strange, and we don't implement it? What's the idea with this?
Perhaps leave it out until we do implement it?
> +int virNodeDeviceDestroy (virNodeDevicePtr dev,
> + unsigned int flags);
Ditto.
> diff -r 78738f80cf4c include/libvirt/virterror.h
> --- a/include/libvirt/virterror.h Wed Nov 12 21:05:32 2008 +0000
> +++ b/include/libvirt/virterror.h Wed Nov 12 21:11:46 2008 +0000
> @@ -58,6 +58,7 @@
> VIR_FROM_STORAGE, /* Error from storage driver */
> VIR_FROM_NETWORK, /* Error from network config */
> VIR_FROM_DOMAIN, /* Error from domain config */
> + VIR_FROM_DEVMONITOR,/* Error from node device monitor */
This is the only time any mention of a "device monitor" is made in the
public API, so it's a bit odd.
Perhaps VIR_FROM_NODE ?
> diff -r 78738f80cf4c src/libvirt.c
> --- a/src/libvirt.c Wed Nov 12 21:05:32 2008 +0000
> +++ b/src/libvirt.c Wed Nov 12 21:11:46 2008 +0000
...
> +/**
> + * virNodeDeviceGetXMLDesc:
> + * @dev: pointer to the node device
> + * @flags: flags for XML generation (unused, pass 0)
> + *
> + * Fetch an XML document describing all aspects of
> + * the device.
> + *
> + * Return the XML document, or NULL on error
> + */
> +char *virNodeDeviceGetXMLDesc(virNodeDevicePtr dev, unsigned int flags)
> +{
> + DEBUG("dev=%p, conn=%p", dev, dev ? dev->conn : NULL);
> +
> + if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
> + virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
> + return NULL;
> + }
> +
> + if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceDumpXML)
> + return dev->conn->deviceMonitor->deviceDumpXML (dev, flags);
> +
> + virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
> + return NULL;
> +}
Missing check for flags == 0
> +/**
> + * virNodeDeviceListCaps:
> + * @dev: the device
> + * @names: array to collect the list of capability names
> + * @maxnames: size of @names
> + *
> + * Lists the names of the capabilities supported by the device.
> + *
> + * Returns the number of capability names listed in @names.
> + */
> +int virNodeDeviceListCaps(virNodeDevicePtr dev,
> + char **const names,
> + int maxnames)
> +{
> + DEBUG("dev=%p, conn=%p, names=%p, maxnames=%d",
> + dev, dev ? dev->conn : NULL, names, maxnames);
> +
> + if (!VIR_IS_CONNECTED_NODE_DEVICE(dev)) {
> + virLibNodeDeviceError(NULL, VIR_ERR_INVALID_NODE_DEVICE, __FUNCTION__);
> + return -1;
> + }
> +
> + if (dev->conn->deviceMonitor && dev->conn->deviceMonitor->deviceListCaps)
> + return dev->conn->deviceMonitor->deviceListCaps (dev, names, maxnames);
> +
> + virLibConnError (dev->conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
> + return -1;
> +}
No checking of names/maxnames
Cheers,
Mark.
More information about the libvir-list
mailing list