
Daniel P. Berrange wrote:
The PCI passthrough patches made it so that qemudBuildCommandLine() would actually try to detach your host devices & reset them. Most definitely not what you want when running this via a test case!
This patch moves the host device management out into a separate method, so that qemudBuildCommandLine() doesn't do anything except safely build the command line.
Ah. This fixes the failure I just reported. Looks good.
+ /* Now that all the PCI hostdevs have be dettached, we can safely
Obviously this is just "moved" code, but might as well fix the comment: s/be/been/
+ * reset them */ + for (i = 0 ; i < def->nhostdevs ; i++) { + virDomainHostdevDefPtr hostdev = def->hostdevs[i]; + pciDevice *dev; + + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) + continue; + if (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) { + pciFreeDevice(conn, dev); + goto error; + } + + pciFreeDevice(conn, dev);
You can remove a duplicate free and save two lines by replacing the above with this: int err = pciResetDevice(conn, dev); pciFreeDevice(conn, dev); if (err < 0) goto error;
+ } + + return 0; + +error: + return -1; +}