提交 09fb8845 编写于 作者: D Daniel Veillard

adds a new <hostdev managed='(yes|no)'> property to host devices in domains

* docs/schemas/domain.rng src/domain_conf.c src/domain_conf.h
  src/qemu_conf.c
  tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml
  tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml
  tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.xml:
  adds a new <hostdev managed='(yes|no)'> property
  to host devices indicating whether or not we should
  automatically dettach/reset, patch by Mark McLoughlin
daniel
上级 34d23b0b
Mon Mar 2 17:35:09 CET 2009 Daniel Veillard <veillard@redhat.com>
* docs/schemas/domain.rng src/domain_conf.c src/domain_conf.h
src/qemu_conf.c
tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml
tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-address.xml
tests/qemuxml2argvdata/qemuxml2argv-hostdev-usb-product.xml:
adds a new <hostdev managed='(yes|no)'> property
to host devices indicating whether or not we should
automatically dettach/reset, patch by Mark McLoughlin
Mon Mar 2 17:31:48 CET 2009 Daniel Veillard <veillard@redhat.com> Mon Mar 2 17:31:48 CET 2009 Daniel Veillard <veillard@redhat.com>
* src/qemu_driver.c: add qemu dettach/reattach/reset implementation * src/qemu_driver.c: add qemu dettach/reattach/reset implementation
......
...@@ -911,6 +911,12 @@ ...@@ -911,6 +911,12 @@
<value>pci</value> <value>pci</value>
</choice> </choice>
</attribute> </attribute>
<attribute name='managed'>
<choice>
<value>yes</value>
<value>no</value>
</choice>
</attribute>
</optional> </optional>
<group> <group>
<element name='source'> <element name='source'>
......
...@@ -1729,7 +1729,7 @@ virDomainHostdevDefParseXML(virConnectPtr conn, ...@@ -1729,7 +1729,7 @@ virDomainHostdevDefParseXML(virConnectPtr conn,
xmlNodePtr cur; xmlNodePtr cur;
virDomainHostdevDefPtr def; virDomainHostdevDefPtr def;
char *mode, *type = NULL; char *mode, *type = NULL, *managed = NULL;
if (VIR_ALLOC(def) < 0) { if (VIR_ALLOC(def) < 0) {
virReportOOMError(conn); virReportOOMError(conn);
...@@ -1761,6 +1761,13 @@ virDomainHostdevDefParseXML(virConnectPtr conn, ...@@ -1761,6 +1761,13 @@ virDomainHostdevDefParseXML(virConnectPtr conn,
goto error; goto error;
} }
managed = virXMLPropString(node, "managed");
if (managed != NULL) {
if (STREQ(managed, "yes"))
def->managed = 1;
VIR_FREE(managed);
}
cur = node->children; cur = node->children;
while (cur != NULL) { while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) { if (cur->type == XML_ELEMENT_NODE) {
...@@ -3185,7 +3192,8 @@ virDomainHostdevDefFormat(virConnectPtr conn, ...@@ -3185,7 +3192,8 @@ virDomainHostdevDefFormat(virConnectPtr conn,
return -1; return -1;
} }
virBufferVSprintf(buf, " <hostdev mode='%s' type='%s'>\n", mode, type); virBufferVSprintf(buf, " <hostdev mode='%s' type='%s' managed='%s'>\n",
mode, type, def->managed ? "yes" : "no");
virBufferAddLit(buf, " <source>\n"); virBufferAddLit(buf, " <source>\n");
if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) { if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
......
...@@ -305,6 +305,7 @@ typedef struct _virDomainHostdevDef virDomainHostdevDef; ...@@ -305,6 +305,7 @@ typedef struct _virDomainHostdevDef virDomainHostdevDef;
typedef virDomainHostdevDef *virDomainHostdevDefPtr; typedef virDomainHostdevDef *virDomainHostdevDefPtr;
struct _virDomainHostdevDef { struct _virDomainHostdevDef {
int mode; /* enum virDomainHostdevMode */ int mode; /* enum virDomainHostdevMode */
unsigned int managed : 1;
union { union {
struct { struct {
int type; /* enum virDomainHostdevBusType */ int type; /* enum virDomainHostdevBusType */
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "datatypes.h" #include "datatypes.h"
#include "xml.h" #include "xml.h"
#include "nodeinfo.h" #include "nodeinfo.h"
#include "pci.h"
#define VIR_FROM_THIS VIR_FROM_QEMU #define VIR_FROM_THIS VIR_FROM_QEMU
...@@ -1394,10 +1395,51 @@ int qemudBuildCommandLine(virConnectPtr conn, ...@@ -1394,10 +1395,51 @@ int qemudBuildCommandLine(virConnectPtr conn,
ADD_ARG_LIT("-pcidevice"); ADD_ARG_LIT("-pcidevice");
ADD_ARG_LIT(pcidev); ADD_ARG_LIT(pcidev);
VIR_FREE(pcidev); VIR_FREE(pcidev);
if (hostdev->managed) {
pciDevice *dev = pciGetDevice(conn,
hostdev->source.subsys.u.pci.domain,
hostdev->source.subsys.u.pci.bus,
hostdev->source.subsys.u.pci.slot,
hostdev->source.subsys.u.pci.function);
if (!dev)
goto error;
if (pciDettachDevice(conn, dev) < 0) {
pciFreeDevice(conn, dev);
goto error;
}
pciFreeDevice(conn, dev);
}
} }
} }
/* Now that all the PCI hostdevs have be dettached, we can reset them */
for (i = 0 ; i < vm->def->nhostdevs ; i++) {
virDomainHostdevDefPtr hostdev = vm->def->hostdevs[i];
pciDevice *dev;
if (!hostdev->managed ||
hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
continue;
dev = pciGetDevice(conn,
hostdev->source.subsys.u.pci.domain,
hostdev->source.subsys.u.pci.bus,
hostdev->source.subsys.u.pci.slot,
hostdev->source.subsys.u.pci.function);
if (!dev)
goto error;
if (pciResetDevice(conn, dev) < 0)
goto error;
pciFreeDevice(conn, dev);
}
if (migrateFrom) { if (migrateFrom) {
ADD_ARG_LIT("-incoming"); ADD_ARG_LIT("-incoming");
ADD_ARG_LIT(migrateFrom); ADD_ARG_LIT(migrateFrom);
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<source dev='/dev/HostVG/QEMUGuest2'/> <source dev='/dev/HostVG/QEMUGuest2'/>
<target dev='hda' bus='ide'/> <target dev='hda' bus='ide'/>
</disk> </disk>
<hostdev mode='subsystem' type='pci'> <hostdev mode='subsystem' type='pci' managed='no'>
<source> <source>
<address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/> <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
</source> </source>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<source dev='/dev/HostVG/QEMUGuest1'/> <source dev='/dev/HostVG/QEMUGuest1'/>
<target dev='hda' bus='ide'/> <target dev='hda' bus='ide'/>
</disk> </disk>
<hostdev mode='subsystem' type='usb'> <hostdev mode='subsystem' type='usb' managed='no'>
<source> <source>
<address bus='14' device='6'/> <address bus='14' device='6'/>
</source> </source>
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<source dev='/dev/HostVG/QEMUGuest1'/> <source dev='/dev/HostVG/QEMUGuest1'/>
<target dev='hda' bus='ide'/> <target dev='hda' bus='ide'/>
</disk> </disk>
<hostdev mode='subsystem' type='usb'> <hostdev mode='subsystem' type='usb' managed='no'>
<source> <source>
<vendor id='0x0204'/> <vendor id='0x0204'/>
<product id='0x6025'/> <product id='0x6025'/>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册