提交 ebea3418 编写于 作者: M Mark McLoughlin

Improve PCI host device reset error message

Currently, if we are unable to reset a PCI device we return a fairly
generic 'No PCI reset capability available' error message.

Fix that by returning an error from the individual reset messages and
using that error to construct the higher level error mesage.

* src/pci.c: set errors in pciTryPowerManagementReset() and
  pciTrySecondaryBusReset() on failure; use those error messages
  in pciResetDevice(), or explain that no reset support is available
上级 4035152a
...@@ -456,7 +456,8 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev) ...@@ -456,7 +456,8 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
* are not in use by the host or other guests. * are not in use by the host or other guests.
*/ */
if (pciBusContainsOtherDevices(conn, dev)) { if (pciBusContainsOtherDevices(conn, dev)) {
VIR_WARN("Other devices on bus with %s, not doing bus reset", pciReportError(conn, VIR_ERR_NO_SUPPORT,
_("Other devices on bus with %s, not doing bus reset"),
dev->name); dev->name);
return -1; return -1;
} }
...@@ -464,7 +465,9 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev) ...@@ -464,7 +465,9 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
/* Find the parent bus */ /* Find the parent bus */
parent = pciGetParentDevice(conn, dev); parent = pciGetParentDevice(conn, dev);
if (!parent) { if (!parent) {
VIR_WARN("Failed to find parent device for %s", dev->name); pciReportError(conn, VIR_ERR_NO_SUPPORT,
_("Failed to find parent device for %s"),
dev->name);
return -1; return -1;
} }
...@@ -475,7 +478,9 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev) ...@@ -475,7 +478,9 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
* are multiple devices/functions * are multiple devices/functions
*/ */
if (pciRead(dev, 0, config_space, PCI_CONF_LEN) < 0) { if (pciRead(dev, 0, config_space, PCI_CONF_LEN) < 0) {
VIR_WARN("Failed to save PCI config space for %s", dev->name); pciReportError(conn, VIR_ERR_NO_SUPPORT,
_("Failed to save PCI config space for %s"),
dev->name);
goto out; goto out;
} }
...@@ -492,9 +497,12 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev) ...@@ -492,9 +497,12 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
usleep(200 * 1000); /* sleep 200ms */ usleep(200 * 1000); /* sleep 200ms */
if (pciWrite(dev, 0, config_space, PCI_CONF_LEN) < 0) if (pciWrite(dev, 0, config_space, PCI_CONF_LEN) < 0) {
VIR_WARN("Failed to restore PCI config space for %s", dev->name); pciReportError(conn, VIR_ERR_NO_SUPPORT,
_("Failed to restore PCI config space for %s"),
dev->name);
goto out;
}
ret = 0; ret = 0;
out: out:
pciFreeDevice(conn, parent); pciFreeDevice(conn, parent);
...@@ -516,7 +524,9 @@ pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev) ...@@ -516,7 +524,9 @@ pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
/* Save and restore the device's config space. */ /* Save and restore the device's config space. */
if (pciRead(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) { if (pciRead(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) {
VIR_WARN("Failed to save PCI config space for %s", dev->name); pciReportError(conn, VIR_ERR_NO_SUPPORT,
_("Failed to save PCI config space for %s"),
dev->name);
return -1; return -1;
} }
...@@ -533,8 +543,12 @@ pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev) ...@@ -533,8 +543,12 @@ pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
usleep(10 * 1000); /* sleep 10ms */ usleep(10 * 1000); /* sleep 10ms */
if (pciWrite(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) if (pciWrite(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) {
VIR_WARN("Failed to restore PCI config space for %s", dev->name); pciReportError(conn, VIR_ERR_NO_SUPPORT,
_("Failed to restore PCI config space for %s"),
dev->name);
return -1;
}
return 0; return 0;
} }
...@@ -582,10 +596,14 @@ pciResetDevice(virConnectPtr conn, pciDevice *dev) ...@@ -582,10 +596,14 @@ pciResetDevice(virConnectPtr conn, pciDevice *dev)
if (ret < 0 && dev->bus != 0) if (ret < 0 && dev->bus != 0)
ret = pciTrySecondaryBusReset(conn, dev); ret = pciTrySecondaryBusReset(conn, dev);
if (ret < 0) if (ret < 0) {
virErrorPtr err = virGetLastError();
pciReportError(conn, VIR_ERR_NO_SUPPORT, pciReportError(conn, VIR_ERR_NO_SUPPORT,
_("No PCI reset capability available for %s"), _("Unable to reset PCI device %s: %s"),
dev->name); dev->name,
err ? err->message : _("no FLR, PM reset or bus reset available"));
}
return ret; return ret;
} }
......
...@@ -1465,9 +1465,9 @@ qemuDomainReAttachHostDevices(virConnectPtr conn, virDomainDefPtr def) ...@@ -1465,9 +1465,9 @@ qemuDomainReAttachHostDevices(virConnectPtr conn, virDomainDefPtr def)
continue; continue;
} }
if (pciDettachDevice(conn, dev) < 0) { if (pciReAttachDevice(conn, dev) < 0) {
virErrorPtr err = virGetLastError(); virErrorPtr err = virGetLastError();
VIR_ERROR(_("Failed to reset PCI device: %s\n"), VIR_ERROR(_("Failed to re-attach PCI device: %s\n"),
err ? err->message : ""); err ? err->message : "");
virResetError(err); virResetError(err);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册