All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Michael S . Tsirkin" <mst@redhat.com>,
	Igor Mammedov <imammedo@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	Alexander Graf <agraf@suse.de>,
	David Gibson <david@gibson.dropbear.id.au>,
	Eduardo Habkost <ehabkost@redhat.com>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
	Cornelia Huck <cohuck@redhat.com>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Richard Henderson <rth@twiddle.net>,
	qemu-ppc@nongnu.org, qemu-s390x@nongnu.org,
	David Hildenbrand <david@redhat.com>
Subject: [Qemu-devel] [PATCH v2 04/10] pci/pcie: stop plug/unplug if the slot is locked
Date: Mon,  5 Nov 2018 11:20:38 +0100	[thread overview]
Message-ID: <20181105102044.20547-5-david@redhat.com> (raw)
In-Reply-To: <20181105102044.20547-1-david@redhat.com>

We better stop right away. While at it, properly move the check
to the pre_plug handler.

Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/pci/pcie.c         | 25 +++++++++++++++++--------
 hw/pci/pcie_port.c    |  1 +
 include/hw/pci/pcie.h |  2 ++
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index 44737cc1cd..ccba29269e 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -316,10 +316,10 @@ static void pcie_cap_slot_event(PCIDevice *dev, PCIExpressHotPlugEvent event)
 }
 
 static void pcie_cap_slot_plug_common(PCIDevice *hotplug_dev, DeviceState *dev,
-                                      uint8_t **exp_cap, Error **errp)
+                                      Error **errp)
 {
-    *exp_cap = hotplug_dev->config + hotplug_dev->exp.exp_cap;
-    uint16_t sltsta = pci_get_word(*exp_cap + PCI_EXP_SLTSTA);
+    uint8_t *exp_cap = hotplug_dev->config + hotplug_dev->exp.exp_cap;
+    uint16_t sltsta = pci_get_word(exp_cap + PCI_EXP_SLTSTA);
 
     PCIE_DEV_PRINTF(PCI_DEVICE(dev), "hotplug state: 0x%x\n", sltsta);
     if (sltsta & PCI_EXP_SLTSTA_EIS) {
@@ -330,14 +330,19 @@ static void pcie_cap_slot_plug_common(PCIDevice *hotplug_dev, DeviceState *dev,
     }
 }
 
+void pcie_cap_slot_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+                               Error **errp)
+{
+    pcie_cap_slot_plug_common(PCI_DEVICE(hotplug_dev), dev, errp);
+}
+
 void pcie_cap_slot_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
                            Error **errp)
 {
-    uint8_t *exp_cap;
+    PCIDevice *hotplug_pdev = PCI_DEVICE(hotplug_dev);
+    uint8_t *exp_cap = hotplug_pdev->config + hotplug_pdev->exp.exp_cap;
     PCIDevice *pci_dev = PCI_DEVICE(dev);
 
-    pcie_cap_slot_plug_common(PCI_DEVICE(hotplug_dev), dev, &exp_cap, errp);
-
     /* Don't send event when device is enabled during qemu machine creation:
      * it is present on boot, no hotplug event is necessary. We do send an
      * event when the device is disabled later. */
@@ -367,11 +372,15 @@ static void pcie_unplug_device(PCIBus *bus, PCIDevice *dev, void *opaque)
 void pcie_cap_slot_unplug_request_cb(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
-    uint8_t *exp_cap;
+    Error *local_err = NULL;
     PCIDevice *pci_dev = PCI_DEVICE(dev);
     PCIBus *bus = pci_get_bus(pci_dev);
 
-    pcie_cap_slot_plug_common(PCI_DEVICE(hotplug_dev), dev, &exp_cap, errp);
+    pcie_cap_slot_plug_common(PCI_DEVICE(hotplug_dev), dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
 
     /* In case user cancel the operation of multi-function hot-add,
      * remove the function that is unexposed to guest individually,
diff --git a/hw/pci/pcie_port.c b/hw/pci/pcie_port.c
index 73e81e5847..7982a87880 100644
--- a/hw/pci/pcie_port.c
+++ b/hw/pci/pcie_port.c
@@ -154,6 +154,7 @@ static void pcie_slot_class_init(ObjectClass *oc, void *data)
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
 
     dc->props = pcie_slot_props;
+    hc->pre_plug = pcie_cap_slot_pre_plug_cb;
     hc->plug = pcie_cap_slot_plug_cb;
     hc->unplug_request = pcie_cap_slot_unplug_request_cb;
 }
diff --git a/include/hw/pci/pcie.h b/include/hw/pci/pcie.h
index 735f8e8154..d9fbcf4a4a 100644
--- a/include/hw/pci/pcie.h
+++ b/include/hw/pci/pcie.h
@@ -131,6 +131,8 @@ void pcie_ari_init(PCIDevice *dev, uint16_t offset, uint16_t nextfn);
 void pcie_dev_ser_num_init(PCIDevice *dev, uint16_t offset, uint64_t ser_num);
 void pcie_ats_init(PCIDevice *dev, uint16_t offset);
 
+void pcie_cap_slot_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
+                               Error **errp);
 void pcie_cap_slot_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
                            Error **errp);
 void pcie_cap_slot_unplug_request_cb(HotplugHandler *hotplug_dev,
-- 
2.17.2

  parent reply	other threads:[~2018-11-05 10:25 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-05 10:20 [Qemu-devel] [PATCH v2 00/10] pci: hotplug handler reworks David Hildenbrand
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 01/10] pci/pcie: rename hotplug handler callbacks David Hildenbrand
2018-11-06  6:03   ` David Gibson
2018-11-06  8:43     ` David Hildenbrand
2018-11-19 15:43   ` Igor Mammedov
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 02/10] pci/shpc: " David Hildenbrand
2018-11-06  8:14   ` David Gibson
2018-11-19 15:56   ` Igor Mammedov
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 03/10] s390x/pci: " David Hildenbrand
2018-11-06  8:14   ` David Gibson
2018-11-08 12:38   ` Cornelia Huck
2018-11-19 15:59   ` Igor Mammedov
2018-11-05 10:20 ` David Hildenbrand [this message]
2018-11-06 23:10   ` [Qemu-devel] [PATCH v2 04/10] pci/pcie: stop plug/unplug if the slot is locked David Gibson
2018-11-07  9:03     ` David Hildenbrand
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 05/10] pci/pcihp: perform check for bus capability in pre_plug handler David Hildenbrand
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 06/10] pci/pcihp: overwrite hotplug handler recursively from the start David Hildenbrand
2018-11-19 16:31   ` Igor Mammedov
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 07/10] pci/pcihp: perform unplug via the hotplug handler David Hildenbrand
2018-11-19 16:36   ` Igor Mammedov
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 08/10] pci/pcie: " David Hildenbrand
2018-11-07  0:55   ` David Gibson
2018-11-19 16:46   ` Igor Mammedov
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 09/10] pci/shpc: " David Hildenbrand
2018-11-07  0:59   ` David Gibson
2018-11-19 17:09   ` Igor Mammedov
2018-11-20 10:11     ` David Hildenbrand
2018-11-20 14:13       ` Igor Mammedov
2018-11-20 14:34         ` David Hildenbrand
2018-11-05 10:20 ` [Qemu-devel] [PATCH v2 10/10] spapr_pci: " David Hildenbrand
2018-11-05 10:31   ` [Qemu-devel] [Qemu-ppc] " Greg Kurz
2018-11-05 10:33     ` David Hildenbrand
2018-11-07  4:22   ` [Qemu-devel] " David Gibson
2018-11-08  3:08     ` [Qemu-devel] QEMU bootup hang in tcg model using mainline QEMU code gengdongjiu
2018-11-19 17:13   ` [Qemu-devel] [PATCH v2 10/10] spapr_pci: perform unplug via the hotplug handler Igor Mammedov

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=20181105102044.20547-5-david@redhat.com \
    --to=david@redhat.com \
    --cc=agraf@suse.de \
    --cc=borntraeger@de.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=dgilbert@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=rth@twiddle.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.