[libvirt] [PATCH 03/23] Add support for <hostdev mode="capabilities">
Eric Blake
eblake at redhat.com
Tue Dec 11 00:39:02 UTC 2012
On 11/30/2012 01:26 PM, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> The <hostdev> device type has long had a redundant "mode"
> attribute, which has always been "subsys". This finally
> introduces a new mode "capabilities", which will be used
> by the LXC driver for device assignment. Since container
> based virtualization uses a single kernel, the idea of
> assigning physical PCI devices doesn't make sense. It is
> still reasonable to assign USB devices, but for assinging
s/assinging/assigning/
> arbitrary nodes in /dev, the new 'capabilities' mode is
> to be used.
>
> The first capability support is 'storage', which is for
> assignment of block devices. Functionally this is really
> pretty similar to the <disk> support. The only difference
> is the device node name is identical in both host and
> container namespaces.
>
> <hostdev mode='capabilities' type='storage'>
> <source>
> <block>/dev/sdf1</block>
> </source>
> </hostdev>
>
> The second capability support is 'misc', which is for
> assignment of character devices. There is no existing
> parallel to this. Again the device node is the same
> inside & outside the container.
>
> <hostdev mode='capabilities' type='misc'>
> <source>
> <char>/dev/sdf1</char>
> </source>
> </hostdev>
>
> The reason for keeping the char & storage devices
> separate in the domain XML, is to mirror the split
> in the node device XML. NB the node device XML does
> not yet report character devices, but that's another
> new patch to come
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> docs/schemas/domaincommon.rng | 128 +++++++++++++++++--------
Missing documentation in an appropriate docs/*.html.in. I haven't
checked if you add it later in the series, or completely forgot.
> src/conf/domain_audit.c | 80 +++++++++++-----
> src/conf/domain_conf.c | 175 ++++++++++++++++++++++++++++++++++-
> src/conf/domain_conf.h | 31 +++++--
> src/libvirt_private.syms | 1 +
> tests/lxcxml2xmldata/lxc-hostdev.xml | 34 +++++++
> tests/lxcxml2xmltest.c | 1 +
> 7 files changed, 375 insertions(+), 75 deletions(-)
> create mode 100644 tests/lxcxml2xmldata/lxc-hostdev.xml
But at least you added tests.
> +
> + <define name="hostdevcaps">
> + <attribute name="mode">
> + <value>capabilities</value>
> + </attribute>
> + <choice>
> + <group>
> + <ref name="hostdevcapsstorage"/>
> + </group>
> + </choice>
> + </define>
> + <define name="hostdevcapsstorage">
> + <attribute name="type">
> + <value>storage</value>
> + </attribute>
> + <element name="source">
> + <element name="block">
> + <ref name="absFilePath"/>
> + </element>
> + </element>
I see where you added <hostdev mode='capabilities' type='storage'> but
not where you added <hostdev mode='capabilities' type='misc'>. Did you
mean to have a <choice>storage|misc</choice> for the type attribute in
hostdevcapsstorage?
> +
> + case VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES:
> + switch (hostdev->source.caps.type) {
> + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_STORAGE:
> + if (!(device = virAuditEncode("disk",
> + VIR_AUDIT_STR(hostdev->source.caps.u.storage.block)))) {
> + VIR_WARN("OOM while encoding audit message");
> + goto cleanup;
> + }
> +
> + VIR_AUDIT(VIR_AUDIT_RECORD_RESOURCE, success,
> + "virt=%s resrc=hostdev reason=%s %s uuid=%s %s",
> + virt, reason, vmname, uuidstr, device);
> + break;
> +
> + default:
> + VIR_WARN("Unexpected hostdev type while encoding audit message: %d",
> + hostdev->source.caps.type);
Are you also missing 'misc' handling in this section of C code? I see
places where it appears, but it seems incomplete (maybe I missed
something, though).
> - if (!(device = virAuditEncode("device", VIR_AUDIT_STR(address)))) {
> - VIR_WARN("OOM while encoding audit message");
> + default:
> + VIR_WARN("Unexpected hostdev mode while cndoing audit message: %d",
s/cndoing/encoding/
> +++ b/src/conf/domain_conf.c
> @@ -530,12 +530,16 @@ VIR_ENUM_IMPL(virDomainGraphicsSpiceClipboardCopypaste,
>
> VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST,
> "subsystem",
> - "capabilities")
> + "capabilities");
Why the added ';'...
>
> VIR_ENUM_IMPL(virDomainHostdevSubsys, VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST,
> "usb",
> "pci")
...especially when it's already optional?
> @@ -1440,6 +1444,17 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
> */
> if (def->parent.type == VIR_DOMAIN_DEVICE_NONE)
> virDomainDeviceInfoFree(def->info);
> +
> + if (def->mode == VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES) {
> + switch (def->source.caps.type) {
> + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_STORAGE:
> + VIR_FREE(def->source.caps.u.storage.block);
> + break;
> + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_MISC:
> + VIR_FREE(def->source.caps.u.misc.chardev);
> + break;
> + }
For example, here you do handle both types.
--
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20121210/0f7bce36/attachment-0001.sig>
More information about the libvir-list
mailing list