提交 d45dadae 编写于 作者: H Huanle Han 提交者: John Ferlan

hostdev: fix net config restore error

Fix for such a case:
1. Domain A and B xml contain the same SRIOV net hostdev(<interface
type='hostdev' /> with same pci address).
2. virsh start A (Successfully, and configure the SRIOV net with
custom mac)
3. virsh start B (Fail because of the hostdev used by domain A or other
reason.)
In step 3, 'virHostdevNetConfigRestore' is called for the hostdev
which is still used by domain A. It makes the mac/vlan of the SRIOV net
change.

Code Change in this fix:
1. As the pci used by other domain have been removed from
'pcidevs' in previous loop, we only restore the nic config for
the hostdev still in 'pcidevs'(used by this domain)
2. update the comments to make it more clear
Signed-off-by: NHuanle Han <hanxueluo@gmail.com>
上级 7ec3f805
...@@ -783,19 +783,20 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, ...@@ -783,19 +783,20 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr,
goto cleanup; goto cleanup;
} }
/* Again 4 loops; mark all devices as inactive before reset /* Here are 4 loops; mark all devices as inactive before reset
* them and reset all the devices before re-attach. * them and reset all the devices before re-attach.
* Attach mac and port profile parameters to devices * Attach mac and port profile parameters to devices
*/ */
/* Loop 1: delete the copy of the dev from pcidevs if it's used by
* other domain. Or delete it from activePCIHostDevs if it had
* been used by this domain.
*/
i = 0; i = 0;
while (i < virPCIDeviceListCount(pcidevs)) { while (i < virPCIDeviceListCount(pcidevs)) {
virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i);
virPCIDevicePtr activeDev = NULL; virPCIDevicePtr activeDev = NULL;
/* delete the copy of the dev from pcidevs if it's used by
* other domain. Or delete it from activePCIHostDevs if it had
* been used by this domain.
*/
activeDev = virPCIDeviceListFind(hostdev_mgr->activePCIHostdevs, dev); activeDev = virPCIDeviceListFind(hostdev_mgr->activePCIHostdevs, dev);
if (activeDev) { if (activeDev) {
const char *usedby_drvname; const char *usedby_drvname;
...@@ -817,13 +818,33 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, ...@@ -817,13 +818,33 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr,
*/ */
/* /*
* For SRIOV net host devices, unset mac and port profile before * Loop 2: For SRIOV net host devices used by this domain,
* reset and reattach device * unset mac and port profile before resetting and reattaching device
*/ */
for (i = 0; i < nhostdevs; i++) for (i = 0; i < nhostdevs; i++) {
virHostdevNetConfigRestore(hostdevs[i], hostdev_mgr->stateDir, virDomainHostdevDefPtr hostdev = hostdevs[i];
oldStateDir);
if (virHostdevIsPCINetDevice(hostdev)) {
virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci;
virPCIDevicePtr dev = NULL;
dev = virPCIDeviceNew(pcisrc->addr.domain, pcisrc->addr.bus,
pcisrc->addr.slot, pcisrc->addr.function);
if (dev) {
if (virPCIDeviceListFind(pcidevs, dev)) {
virHostdevNetConfigRestore(hostdev, hostdev_mgr->stateDir,
oldStateDir);
}
} else {
virErrorPtr err = virGetLastError();
VIR_ERROR(_("Failed to new PCI device: %s"),
err ? err->message : _("unknown error"));
virResetError(err);
}
virPCIDeviceFree(dev);
}
}
/* Loop 3: reset pci device used by this domain */
for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) {
virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i);
...@@ -836,6 +857,9 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr, ...@@ -836,6 +857,9 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr,
} }
} }
/* Loop 4: reattach pci devices used by this domain
* and steal all the devices from pcidevs
*/
while (virPCIDeviceListCount(pcidevs) > 0) { while (virPCIDeviceListCount(pcidevs) > 0) {
virPCIDevicePtr dev = virPCIDeviceListStealIndex(pcidevs, 0); virPCIDevicePtr dev = virPCIDeviceListStealIndex(pcidevs, 0);
virHostdevReattachPCIDevice(dev, hostdev_mgr); virHostdevReattachPCIDevice(dev, hostdev_mgr);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册