From: "Michael S. Tsirkin" <mst@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 4/4] qdev: switch reset to post-order
Date: Thu, 19 Dec 2013 20:23:14 +0200 [thread overview]
Message-ID: <20131219182314.GA15108@redhat.com> (raw)
In-Reply-To: <1386348867-25038-5-git-send-email-pbonzini@redhat.com>
On Fri, Dec 06, 2013 at 05:54:27PM +0100, Paolo Bonzini wrote:
> Post-order is the only sensible direction for the reset signals.
> For example, suppose pre-order is used and the parent has some data
> structures that cache children state (for example a list of active
> requests). When the reset method is invoked on the parent, these caches
> could be in any state.
>
> If post-order is used, on the other hand, these will be in a known state
> when the reset method is invoked on the parent.
>
> This change means that it is no longer possible to block the visit of
> the devices, so the callback is changed to return void. This is not
> a problem, because PCI was returning 1 exactly in order to achieve the
> same ordering that this patch implements.
>
> PCI can then rely on the qdev core having sent a "reset signal" (whatever
> that means) to the device, and only do the PCI-specific initialization
> with pci_do_device_reset.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> hw/core/qdev.c | 6 +++---
> hw/pci/pci.c | 31 ++++++++++++++++---------------
> include/hw/qdev-core.h | 2 +-
> 3 files changed, 20 insertions(+), 19 deletions(-)
>
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 1c114b7..9ba8ab1 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -233,19 +233,19 @@ static int qbus_reset_one(BusState *bus, void *opaque)
> {
> BusClass *bc = BUS_GET_CLASS(bus);
> if (bc->reset) {
> - return bc->reset(bus);
> + bc->reset(bus);
> }
> return 0;
> }
>
> void qdev_reset_all(DeviceState *dev)
> {
> - qdev_walk_children(dev, qdev_reset_one, qbus_reset_one, NULL, NULL, NULL);
> + qdev_walk_children(dev, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
> }
>
> void qbus_reset_all(BusState *bus)
> {
> - qbus_walk_children(bus, qdev_reset_one, qbus_reset_one, NULL, NULL, NULL);
> + qbus_walk_children(bus, NULL, NULL, qdev_reset_one, qbus_reset_one, NULL);
> }
>
> void qbus_reset_all_fn(void *opaque)
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index 0efc544..e10d74b 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -46,7 +46,7 @@
> static void pcibus_dev_print(Monitor *mon, DeviceState *dev, int indent);
> static char *pcibus_get_dev_path(DeviceState *dev);
> static char *pcibus_get_fw_dev_path(DeviceState *dev);
> -static int pcibus_reset(BusState *qbus);
> +static void pcibus_reset(BusState *qbus);
>
> static Property pci_props[] = {
> DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
> @@ -165,16 +165,10 @@ void pci_device_deassert_intx(PCIDevice *dev)
> }
> }
>
> -/*
> - * This function is called on #RST and FLR.
> - * FLR if PCI_EXP_DEVCTL_BCR_FLR is set
> - */
> -void pci_device_reset(PCIDevice *dev)
> +static void pci_do_device_reset(PCIDevice *dev)
> {
> int r;
>
> - qdev_reset_all(&dev->qdev);
> -
> dev->irq_state = 0;
> pci_update_irq_status(dev);
> pci_device_deassert_intx(dev);
> @@ -207,27 +201,34 @@ void pci_device_reset(PCIDevice *dev)
> }
>
> /*
> + * This function is called on #RST and FLR.
> + * FLR if PCI_EXP_DEVCTL_BCR_FLR is set
> + */
> +void pci_device_reset(PCIDevice *dev)
> +{
> + qdev_reset_all(&dev->qdev);
> + pci_do_device_reset(dev);
> +}
> +
> +/*
> * Trigger pci bus reset under a given bus.
> - * To be called on RST# assert.
> + * Called via qbus_reset_all on RST# assert, after the devices
> + * have been reset qdev_reset_all-ed already.
> */
> -static int pcibus_reset(BusState *qbus)
> +static void pcibus_reset(BusState *qbus)
> {
> PCIBus *bus = DO_UPCAST(PCIBus, qbus, qbus);
> int i;
>
> for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) {
> if (bus->devices[i]) {
> - pci_device_reset(bus->devices[i]);
> + pci_do_device_reset(bus->devices[i]);
> }
> }
>
> for (i = 0; i < bus->nirq; i++) {
> assert(bus->irq_count[i] == 0);
> }
> -
> - /* topology traverse is done by pci_bus_reset().
> - Tell qbus/qdev walker not to traverse the tree */
> - return 1;
> }
>
> static void pci_host_bus_register(PCIBus *bus, DeviceState *parent)
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index 21ea2c6..409fd71 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -178,7 +178,7 @@ struct BusClass {
> * bindings can be found at http://playground.sun.com/1275/bindings/.
> */
> char *(*get_fw_dev_path)(DeviceState *dev);
> - int (*reset)(BusState *bus);
> + void (*reset)(BusState *bus);
> /* maximum devices allowed on the bus, 0: no limit. */
> int max_dev;
> };
> --
> 1.7.1
This seems to break a bunch of stuff:
/scm/qemu/hw/s390x/virtio-ccw.c: In function
‘virtual_css_bus_class_init’:
/scm/qemu/hw/s390x/virtio-ccw.c:47:14: error: assignment from
incompatible pointer type [-Werror]
k->reset = virtual_css_bus_reset;
^
next prev parent reply other threads:[~2013-12-19 18:19 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-06 16:54 [Qemu-devel] [PATCH 0/4] qdev: switch reset to post-order, clean up PCI reset Paolo Bonzini
2013-12-06 16:54 ` [Qemu-devel] [PATCH 1/4] pci: do not export pci_bus_reset Paolo Bonzini
2013-12-06 16:54 ` [Qemu-devel] [PATCH 2/4] pci: clean up resetting of IRQs Paolo Bonzini
2013-12-06 16:54 ` [Qemu-devel] [PATCH 3/4] qdev: allow both pre- and post-order vists in qdev walking functions Paolo Bonzini
2013-12-06 23:27 ` Bandan Das
2013-12-09 9:50 ` Paolo Bonzini
2013-12-09 17:56 ` Bandan Das
2013-12-09 18:04 ` Paolo Bonzini
2013-12-09 18:15 ` Bandan Das
2013-12-09 18:05 ` Paolo Bonzini
2013-12-06 16:54 ` [Qemu-devel] [PATCH 4/4] qdev: switch reset to post-order Paolo Bonzini
2013-12-19 18:23 ` Michael S. Tsirkin [this message]
2013-12-19 19:15 ` [Qemu-devel] [PATCH 0/4] qdev: switch reset to post-order, clean up PCI reset Michael S. Tsirkin
2013-12-19 23:45 ` Paolo Bonzini
-- strict thread matches above, loose matches on Subject: below --
2013-10-03 13:46 Paolo Bonzini
2013-10-03 13:46 ` [Qemu-devel] [PATCH 4/4] qdev: switch reset to post-order Paolo Bonzini
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=20131219182314.GA15108@redhat.com \
--to=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).