qemu-devel.nongnu.org archive mirror
 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 06/10] pci/pcihp: overwrite hotplug handler recursively from the start
Date: Mon,  5 Nov 2018 11:20:40 +0100	[thread overview]
Message-ID: <20181105102044.20547-7-david@redhat.com> (raw)
In-Reply-To: <20181105102044.20547-1-david@redhat.com>

For now, the hotplug handler is not called for devices that are
being cold plugged. The hotplug handler is setup when the machine
initialization is fully done. Only bridges that were cold plugged are
considered.

Set the hotplug handler for the root piix bus directly when realizing.
Overwrite the hotplug handler of bridges when coldplugging them.

This will now make sure that the ACPI PCI hotplug handler is also called
for cold plugged devices (also on bridges) but not for bridges that were
hotplugged (keeping the current behavior).

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/acpi/pcihp.c | 15 +++++++++++++++
 hw/acpi/piix4.c | 16 +---------------
 2 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
index 5e7cef173c..05e3f8d11e 100644
--- a/hw/acpi/pcihp.c
+++ b/hw/acpi/pcihp.c
@@ -30,6 +30,7 @@
 #include "hw/hw.h"
 #include "hw/i386/pc.h"
 #include "hw/pci/pci.h"
+#include "hw/pci/pci_bridge.h"
 #include "hw/acpi/acpi.h"
 #include "sysemu/sysemu.h"
 #include "exec/address-spaces.h"
@@ -240,6 +241,20 @@ void acpi_pcihp_device_plug_cb(HotplugHandler *hotplug_dev, AcpiPciHpState *s,
      * it is present on boot, no hotplug event is necessary. We do send an
      * event when the device is disabled later. */
     if (!dev->hotplugged) {
+        /*
+         * Overwrite the default hotplug handler with the ACPI PCI one
+         * for cold plugged bridges only.
+         */
+        if (!s->legacy_piix &&
+            object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
+            PCIBus *sec = pci_bridge_get_sec_bus(PCI_BRIDGE(pdev));
+
+            qbus_set_hotplug_handler(BUS(sec), DEVICE(hotplug_dev),
+                                     &error_abort);
+            /* We don't have to overwrite any other hotplug handler yet */
+            assert(QLIST_EMPTY(&sec->child));
+        }
+
         return;
     }
 
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
index e586cfdc53..160f727a5e 100644
--- a/hw/acpi/piix4.c
+++ b/hw/acpi/piix4.c
@@ -446,15 +446,6 @@ static void piix4_device_unplug_cb(HotplugHandler *hotplug_dev,
     }
 }
 
-static void piix4_update_bus_hotplug(PCIBus *pci_bus, void *opaque)
-{
-    PIIX4PMState *s = opaque;
-
-    /* pci_bus cannot outlive PIIX4PMState, because /machine keeps it alive
-     * and it's not hot-unpluggable */
-    qbus_set_hotplug_handler(BUS(pci_bus), DEVICE(s), &error_abort);
-}
-
 static void piix4_pm_machine_ready(Notifier *n, void *opaque)
 {
     PIIX4PMState *s = container_of(n, PIIX4PMState, machine_ready);
@@ -468,12 +459,6 @@ static void piix4_pm_machine_ready(Notifier *n, void *opaque)
     pci_conf[0x63] = 0x60;
     pci_conf[0x67] = (memory_region_present(io_as, 0x3f8) ? 0x08 : 0) |
         (memory_region_present(io_as, 0x2f8) ? 0x90 : 0);
-
-    if (s->use_acpi_pci_hotplug) {
-        pci_for_each_bus(pci_get_bus(d), piix4_update_bus_hotplug, s);
-    } else {
-        piix4_update_bus_hotplug(pci_get_bus(d), s);
-    }
 }
 
 static void piix4_pm_add_propeties(PIIX4PMState *s)
@@ -547,6 +532,7 @@ static void piix4_pm_realize(PCIDevice *dev, Error **errp)
 
     piix4_acpi_system_hot_add_init(pci_address_space_io(dev),
                                    pci_get_bus(dev), s);
+    qbus_set_hotplug_handler(BUS(pci_get_bus(dev)), DEVICE(s), &error_abort);
 
     piix4_pm_add_propeties(s);
 }
-- 
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 ` [Qemu-devel] [PATCH v2 04/10] pci/pcie: stop plug/unplug if the slot is locked David Hildenbrand
2018-11-06 23:10   ` 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 ` David Hildenbrand [this message]
2018-11-19 16:31   ` [Qemu-devel] [PATCH v2 06/10] pci/pcihp: overwrite hotplug handler recursively from the start 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-7-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 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).