qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Aleksandr Bezzubikov <zuban32s@gmail.com>,
	Eduardo Habkost <ehabkost@redhat.com>,
	Marcel Apfelbaum <marcel@redhat.com>,
	Thomas Huth <thuth@redhat.com>
Subject: [Qemu-devel] [PULL 12/26] hw/pci-bridge/pcie_pci_bridge: properly handle MSI unavailability case
Date: Sun, 15 Oct 2017 06:23:19 +0300	[thread overview]
Message-ID: <1508036858-13479-13-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1508036858-13479-1-git-send-email-mst@redhat.com>

From: Aleksandr Bezzubikov <zuban32s@gmail.com>

QEMU with the pcie-pci-bridge device crashes if the guest board doesn't support MSI,
e.g. 'qemu-system-ppc64 -M prep -device pcie-pci-bridge'.
This is caused by wrong pcie-pci-bridge instantiation error handling. This patch fixes this issue
by falling back to legacy INTx if MSI is not available.
Also set the bridge's 'msi' property default value to 'auto' in order to trigger errors
only when user explicitly set msi=on.

Reported-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Aleksandr Bezzubikov <zuban32s@gmail.com>
Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
Tested-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 hw/pci-bridge/pcie_pci_bridge.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
index 9aa5cc3..da562fe 100644
--- a/hw/pci-bridge/pcie_pci_bridge.c
+++ b/hw/pci-bridge/pcie_pci_bridge.c
@@ -65,10 +65,18 @@ static void pcie_pci_bridge_realize(PCIDevice *d, Error **errp)
         goto aer_error;
     }
 
+    Error *local_err = NULL;
     if (pcie_br->msi != ON_OFF_AUTO_OFF) {
-        rc = msi_init(d, 0, 1, true, true, errp);
+        rc = msi_init(d, 0, 1, true, true, &local_err);
         if (rc < 0) {
-            goto msi_error;
+            assert(rc == -ENOTSUP);
+            if (pcie_br->msi != ON_OFF_AUTO_ON) {
+                error_free(local_err);
+            } else {
+                /* failed to satisfy user's explicit request for MSI */
+                error_propagate(errp, local_err);
+                goto msi_error;
+            }
         }
     }
     pci_register_bar(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY |
@@ -81,7 +89,7 @@ aer_error:
 pm_error:
     pcie_cap_exit(d);
 cap_error:
-    shpc_free(d);
+    shpc_cleanup(d, &pcie_br->shpc_bar);
 error:
     pci_bridge_exitfn(d);
 }
@@ -98,7 +106,9 @@ static void pcie_pci_bridge_reset(DeviceState *qdev)
 {
     PCIDevice *d = PCI_DEVICE(qdev);
     pci_bridge_reset(qdev);
-    msi_reset(d);
+    if (msi_present(d)) {
+        msi_reset(d);
+    }
     shpc_reset(d);
 }
 
@@ -106,12 +116,14 @@ static void pcie_pci_bridge_write_config(PCIDevice *d,
         uint32_t address, uint32_t val, int len)
 {
     pci_bridge_write_config(d, address, val, len);
-    msi_write_config(d, address, val, len);
+    if (msi_present(d)) {
+        msi_write_config(d, address, val, len);
+    }
     shpc_cap_write_config(d, address, val, len);
 }
 
 static Property pcie_pci_bridge_dev_properties[] = {
-        DEFINE_PROP_ON_OFF_AUTO("msi", PCIEPCIBridge, msi, ON_OFF_AUTO_ON),
+        DEFINE_PROP_ON_OFF_AUTO("msi", PCIEPCIBridge, msi, ON_OFF_AUTO_AUTO),
         DEFINE_PROP_END_OF_LIST(),
 };
 
-- 
MST

  parent reply	other threads:[~2017-10-15  3:23 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-15  3:22 [Qemu-devel] [PULL 00/26] pc, pci, virtio: fixes, features Michael S. Tsirkin
2017-10-15  3:22 ` [Qemu-devel] [PULL 01/26] xio3130_downstream: Report error if pcie_chassis_add_slot() failed Michael S. Tsirkin
2017-10-15  3:22 ` [Qemu-devel] [PULL 02/26] pci: Set err to errp directly rather than through error_propagate() Michael S. Tsirkin
2017-10-15  3:22 ` [Qemu-devel] [PULL 03/26] fw_cfg: add write callback Michael S. Tsirkin
2017-10-15  3:22 ` [Qemu-devel] [PULL 04/26] hw/misc: add vmcoreinfo device Michael S. Tsirkin
2017-10-15  3:22 ` [Qemu-devel] [PULL 05/26] dump: add guest ELF note Michael S. Tsirkin
2017-10-15  3:22 ` [Qemu-devel] [PULL 06/26] dump: update phys_base header field based on VMCOREINFO content Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 07/26] kdump: set vmcoreinfo location Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 08/26] scripts/dump-guest-memory.py: add vmcoreinfo Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 09/26] MAINTAINERS: add Dump maintainers Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 10/26] virtio/vhost: reset dev->log after syncing Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 11/26] pci: allow 32-bit PCI IO accesses to pass through the PCI bridge Michael S. Tsirkin
2017-10-15  3:23 ` Michael S. Tsirkin [this message]
2017-10-15  3:23 ` [Qemu-devel] [PULL 13/26] virtio/pci/migration: Convert to VMState Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 14/26] PCI: PCIe access should always be little endian Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 15/26] pci: conventional-pci-device and pci-express-device interfaces Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 16/26] pci: Add interface names to hybrid PCI devices Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 17/26] pci: Add INTERFACE_PCIE_DEVICE to all PCIe devices Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 18/26] pci: Add INTERFACE_CONVENTIONAL_PCI_DEVICE to Conventional PCI devices Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 19/26] xen/pt: Mark TYPE_XEN_PT_DEVICE as hybrid Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 20/26] pci: Validate interfaces on base_class_init Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 21/26] hw/gen_pcie_root_port: make IO RO 0 on IO disabled Michael S. Tsirkin
2017-10-15  3:23 ` [Qemu-devel] [PULL 22/26] virtio: fix descriptor counting in virtqueue_pop Michael S. Tsirkin
2017-10-15  3:24 ` [Qemu-devel] [PULL 23/26] virtio-pci: Replace modern_as with direct access to modern_bar Michael S. Tsirkin
2017-10-15  3:24 ` [Qemu-devel] [PULL 24/26] isapc: Remove unnecessary migration compatibility code Michael S. Tsirkin
2017-10-15  3:24 ` [Qemu-devel] [PULL 25/26] pc: remove useless hot_add_cpu initialisation Michael S. Tsirkin
2017-10-15  3:24 ` [Qemu-devel] [PULL 26/26] tests/pxe: Test more NICs when running in SPEED=slow mode Michael S. Tsirkin
2017-10-16 17:29 ` [Qemu-devel] [PULL 00/26] pc, pci, virtio: fixes, features Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1508036858-13479-13-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=marcel@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.com \
    --cc=zuban32s@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).