[libvirt] [PATCH 6/8] Improve PCI host device reset error message
Daniel P. Berrange
berrange at redhat.com
Thu Aug 13 18:43:55 UTC 2009
On Thu, Aug 13, 2009 at 05:44:35PM +0100, Mark McLoughlin wrote:
> 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
> ---
> src/pci.c | 44 +++++++++++++++++++++++++++++++-------------
> src/qemu_driver.c | 4 ++--
> 2 files changed, 33 insertions(+), 15 deletions(-)
>
> diff --git a/src/pci.c b/src/pci.c
> index 11b3e8b..74f7ef0 100644
> --- a/src/pci.c
> +++ b/src/pci.c
> @@ -456,15 +456,18 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
> * are not in use by the host or other guests.
> */
> if (pciBusContainsOtherDevices(conn, dev)) {
> - VIR_WARN("Other devices on bus with %s, not doing bus reset",
> - dev->name);
> + pciReportError(conn, VIR_ERR_NO_SUPPORT,
> + _("Other devices on bus with %s, not doing bus reset"),
> + dev->name);
> return -1;
> }
>
> /* Find the parent bus */
> parent = pciGetParentDevice(conn, dev);
> 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;
> }
>
> @@ -475,7 +478,9 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
> * are multiple devices/functions
> */
> 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;
> }
>
> @@ -492,9 +497,12 @@ pciTrySecondaryBusReset(virConnectPtr conn, pciDevice *dev)
>
> usleep(200 * 1000); /* sleep 200ms */
>
> - if (pciWrite(dev, 0, config_space, PCI_CONF_LEN) < 0)
> - VIR_WARN("Failed to restore PCI config space for %s", dev->name);
> -
> + if (pciWrite(dev, 0, config_space, PCI_CONF_LEN) < 0) {
> + pciReportError(conn, VIR_ERR_NO_SUPPORT,
> + _("Failed to restore PCI config space for %s"),
> + dev->name);
> + goto out;
> + }
> ret = 0;
> out:
> pciFreeDevice(conn, parent);
> @@ -516,7 +524,9 @@ pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
>
> /* Save and restore the device's config space. */
> 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;
> }
>
> @@ -533,8 +543,12 @@ pciTryPowerManagementReset(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
>
> usleep(10 * 1000); /* sleep 10ms */
>
> - if (pciWrite(dev, 0, &config_space[0], PCI_CONF_LEN) < 0)
> - VIR_WARN("Failed to restore PCI config space for %s", dev->name);
> + if (pciWrite(dev, 0, &config_space[0], PCI_CONF_LEN) < 0) {
> + pciReportError(conn, VIR_ERR_NO_SUPPORT,
> + _("Failed to restore PCI config space for %s"),
> + dev->name);
> + return -1;
> + }
>
> return 0;
> }
> @@ -582,10 +596,14 @@ pciResetDevice(virConnectPtr conn, pciDevice *dev)
> if (ret < 0 && dev->bus != 0)
> ret = pciTrySecondaryBusReset(conn, dev);
>
> - if (ret < 0)
> + if (ret < 0) {
> + virErrorPtr err = virGetLastError();
> pciReportError(conn, VIR_ERR_NO_SUPPORT,
> - _("No PCI reset capability available for %s"),
> - dev->name);
> + _("Unable to reset PCI device %s: %s"),
> + dev->name,
> + err ? err->message : _("no FLR, PM reset or bus reset available"));
> + }
> +
> return ret;
> }
>
> diff --git a/src/qemu_driver.c b/src/qemu_driver.c
> index ed2f3c4..6d1ec06 100644
> --- a/src/qemu_driver.c
> +++ b/src/qemu_driver.c
> @@ -1465,9 +1465,9 @@ qemuDomainReAttachHostDevices(virConnectPtr conn, virDomainDefPtr def)
> continue;
> }
>
> - if (pciDettachDevice(conn, dev) < 0) {
> + if (pciReAttachDevice(conn, dev) < 0) {
> 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 : "");
> virResetError(err);
> }
ACK
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list