The ephemeral flag helps support migration with PCI-passthrough. An ephemeral hostdev is automatically unplugged before migration and replugged (if one is available on the destination) after migration. --- docs/schemas/domaincommon.rng | 16 +++++++++++++ src/conf/domain_conf.c | 23 ++++++++++++++++++- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 1 + .../qemuxml2argv-hostdev-pci-address.xml | 2 +- .../qemuxml2argv-hostdev-usb-address.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml | 4 +- 8 files changed, 44 insertions(+), 7 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index aafb10c..349f22b 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1644,6 +1644,14 @@ </choice> </attribute> </optional> + <optional> + <attribute name="ephemeral"> + <choice> + <value>yes</value> + <value>no</value> + </choice> + </attribute> + </optional> <interleave> <element name="source"> <choice> @@ -2750,6 +2758,14 @@ </choice> </attribute> </optional> + <optional> + <attribute name="ephemeral"> + <choice> + <value>yes</value> + <value>no</value> + </choice> + </attribute> + </optional> <group> <element name="source"> <choice> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index b8ba0e2..0b6332a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -2888,6 +2888,7 @@ virDomainHostdevPartsParse(xmlNodePtr node, { xmlNodePtr sourcenode; char *managed = NULL; + char *ephemeral = NULL; int ret = -1; /* @mode is passed in separately from the caller, since an @@ -2914,6 +2915,16 @@ virDomainHostdevPartsParse(xmlNodePtr node, def->managed = 1; } + /* @ephemeral can be read from the xml document - it is always an + * attribute of the toplevel element, no matter what type of + * element that might be (pure hostdev, or higher level device + * (e.g. <interface>) with type='hostdev') + */ + if ((ephemeral = virXMLPropString(node, "ephemeral"))!= NULL) { + if (STREQ(ephemeral,"yes")) + def->ephemeral = 1; + } + /* @type is passed in from the caller rather than read from the * xml document, because it is specified in different places for * different kinds of defs - it is an attribute of @@ -12027,6 +12038,10 @@ virDomainActualNetDefFormat(virBufferPtr buf, def->data.hostdev.def.managed) { virBufferAddLit(buf, " managed='yes'"); } + if (def->type == VIR_DOMAIN_NET_TYPE_HOSTDEV && + def->data.hostdev.def.ephemeral) { + virBufferAddLit(buf, " ephemeral='yes'"); + } virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); @@ -12097,6 +12112,10 @@ virDomainNetDefFormat(virBufferPtr buf, def->data.hostdev.def.managed) { virBufferAddLit(buf, " managed='yes'"); } + if (def->type == VIR_DOMAIN_NET_TYPE_HOSTDEV && + def->data.hostdev.def.ephemeral) { + virBufferAddLit(buf, " ephemeral='yes'"); + } virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 6); @@ -13063,8 +13082,8 @@ virDomainHostdevDefFormat(virBufferPtr buf, return -1; } - virBufferAsprintf(buf, " <hostdev mode='%s' type='%s' managed='%s'>\n", - mode, type, def->managed ? "yes" : "no"); + virBufferAsprintf(buf, " <hostdev mode='%s' type='%s' managed='%s' ephemeral='%s'>\n", + mode, type, def->managed ? "yes" : "no", def->ephemeral ? "yes" : "no"); virBufferAdjustIndent(buf, 6); if (virDomainHostdevSourceFormat(buf, def, flags, false) < 0) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f0dea48..8263711 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -385,6 +385,7 @@ struct _virDomainHostdevDef { virDomainDeviceDef parent; /* higher level Def containing this */ int mode; /* enum virDomainHostdevMode */ unsigned int managed : 1; + unsigned int ephemeral : 1; union { virDomainHostdevSubsys subsys; struct { diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cbf4aee..b7fbe75 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7410,6 +7410,7 @@ qemuParseCommandLinePCI(const char *val) def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS; def->managed = 1; + def->ephemeral = 1; def->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; def->source.subsys.u.pci.bus = bus; def->source.subsys.u.pci.slot = slot; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml index 3c69f83..fc7ea5c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml @@ -21,7 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> - <hostdev mode='subsystem' type='pci' managed='yes'> + <hostdev mode='subsystem' type='pci' managed='yes' ephemeral='yes'> <source> <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/> </source> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml index 811e987..d07dbe3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml @@ -21,7 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> - <hostdev mode='subsystem' type='usb' managed='no'> + <hostdev mode='subsystem' type='usb' managed='no' ephemeral='no'> <source> <address bus='14' device='6'/> </source> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml index 81f70d0..54aa5e6 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml @@ -21,7 +21,7 @@ </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> - <interface type='hostdev' managed='yes'> + <interface type='hostdev' managed='yes' ephemeral='yes'> <mac address='00:11:22:33:44:55'/> <source> <address type='pci' domain='0x0002' bus='0x03' slot='0x07' function='0x1'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml index 371835d..cce0d7f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml @@ -31,13 +31,13 @@ <model type='virtio'/> <rom file='/etc/fake/bootrom.bin'/> </interface> - <hostdev mode='subsystem' type='pci' managed='yes'> + <hostdev mode='subsystem' type='pci' managed='yes' ephemeral='no'> <source> <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/> </source> <rom bar='off'/> </hostdev> - <hostdev mode='subsystem' type='pci' managed='yes'> + <hostdev mode='subsystem' type='pci' managed='yes' ephemeral='no'> <source> <address domain='0x0000' bus='0x06' slot='0x12' function='0x6'/> </source> -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list