[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks gen
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic |
Date: |
Mon, 7 Apr 2014 18:19:06 +0300 |
On Mon, Apr 07, 2014 at 04:25:30PM +0300, Michael S. Tsirkin wrote:
> On Mon, Apr 07, 2014 at 03:12:11PM +0200, Igor Mammedov wrote:
> > On Mon, 7 Apr 2014 15:07:15 +0300
> > "Michael S. Tsirkin" <address@hidden> wrote:
> >
> > > On Mon, Apr 07, 2014 at 02:00:37PM +0200, Igor Mammedov wrote:
> > > > On Mon, 7 Apr 2014 14:32:41 +0300
> > > > "Michael S. Tsirkin" <address@hidden> wrote:
> > > >
> > > > > On Fri, Apr 04, 2014 at 03:36:48PM +0200, Igor Mammedov wrote:
> > > > > > ... and report error if plugged in device is not supported.
> > > > > > Later generic callbacks will be used by memory hotplug.
> > > > > >
> > > > > > Signed-off-by: Igor Mammedov <address@hidden>
> > > > >
> > > > >
> > > > > OK in that case, how about teaching all hotplug callbacks about this?
> > > > >
> > > > > There are two ATM:
> > > > > shpc_device_hotplug_cb
> > > > > pcie_cap_slot_hotplug_cb
> > > > >
> > > > > Teach them both to fail gracefully if they get
> > > > > an object that is not a pci device.
> > > > >
> > > > > Afterwards, simply iterate over all objects of type
> > > > > TYPE_HOTPLUG_HANDLER
> > > > > and look for one that will accept your object.
> > > > Then you would never know if any hotplug handler has actually
> > > > handled event.
> > >
> > > Why not? Check the error.
> > > If no one accepts your object, return error to user.
> > >
> > > > I think hotplug handler should return error if unsupported
> > > > device passed in rather than ignore it. It makes catching
> > > > wiring errors easier.
> > >
> > > Absolutely.
> > >
> > > > Dropping error so that we could not care which hotplug handler
> > > > should be notified, looks like a wrong direction and makes
> > > > system more fragile.
> > >
> > > That's not what I was suggesting.
> > >
> > > > It shouldn't be up to consumer to determine that event should
> > > > be routed to it, but rather by external routing that knows
> > > > what and when should be notified.
> > >
> > > Yes. So
> > >
> > > for each hotplug handler (&err)
> > > handler->plug(device, &err)
> > > if (!err)
> > > break;
> > here it would break on the first handler that doesn't support device
> > and tells so to caller.
>
> This is pseudo-code, I really mean !err == no error reported.
>
> > And there isn't any routing here, it just blindly broadcast to every
> > handler, regardless whether it's right or not.
>
> Yes - handlers verify what they can support.
>
> > If broadcast should be ever done than it probably should be a part of
> > DEVICE class and part of
> > [Qemu-devel] [PATCH 08/35] qdev: hotplug for buss-less devices
> > patch and be generic to all devices.
>
> Not sure what's suggested here.
>
> >
> > Andreas,
> > since you care about QDEV
> > do you have an opinion on ^^^ discussion?
Actually, there's one useful case that this would help address.
At the moment ACPI code has to poke at SHPC bridges and
modify their hotplug callbacks in order to get notified
of hotplug events.
This means we can't cleanly implement an option for guest to
disable ACPI and switch to native if supported,
like the ACPI spec allows.
If we change hotplug code to walk the tree top down
and invoke all callbacks, then it will be fixed
in a cleaner way: bridges would just do:
if (dev->bus != self) {
set_error
return;
}
and suddently pci host can trap callbacks and redirect
to acpi if it wants to.
> > >
> > >
> > > if (err)
> > > hotplug failed - destroy device
> > >
> > >
> > > > >
> > > > >
> > > > > > ---
> > > > > > hw/acpi/piix4.c | 31 ++++++++++++++++++++++---------
> > > > > > 1 file changed, 22 insertions(+), 9 deletions(-)
> > > > > >
> > > > > > diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
> > > > > > index 67dc075..4341f82 100644
> > > > > > --- a/hw/acpi/piix4.c
> > > > > > +++ b/hw/acpi/piix4.c
> > > > > > @@ -310,19 +310,32 @@ static void piix4_pm_powerdown_req(Notifier
> > > > > > *n, void *opaque)
> > > > > > acpi_pm1_evt_power_down(&s->ar);
> > > > > > }
> > > > > >
> > > > > > -static void piix4_pci_device_plug_cb(HotplugHandler *hotplug_dev,
> > > > > > - DeviceState *dev, Error
> > > > > > **errp)
> > > > > > +static void piix4_device_plug_cb(HotplugHandler *hotplug_dev,
> > > > > > + DeviceState *dev, Error **errp)
> > > > > > {
> > > > > > PIIX4PMState *s = PIIX4_PM(hotplug_dev);
> > > > > > - acpi_pcihp_device_plug_cb(&s->ar, s->irq,
> > > > > > &s->acpi_pci_hotplug, dev, errp);
> > > > > > +
> > > > > > + if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
> > > > > > + acpi_pcihp_device_plug_cb(&s->ar, s->irq,
> > > > > > &s->acpi_pci_hotplug, dev,
> > > > > > + errp);
> > > > > > + } else {
> > > > > > + error_setg(errp, "acpi: device plug request for not
> > > > > > supported device"
> > > > > > + " type: %s", object_get_typename(OBJECT(dev)));
> > > > > > + }
> > > > > > }
> > > > > >
> > > > > > -static void piix4_pci_device_unplug_cb(HotplugHandler *hotplug_dev,
> > > > > > - DeviceState *dev, Error
> > > > > > **errp)
> > > > > > +static void piix4_device_unplug_cb(HotplugHandler *hotplug_dev,
> > > > > > + DeviceState *dev, Error **errp)
> > > > > > {
> > > > > > PIIX4PMState *s = PIIX4_PM(hotplug_dev);
> > > > > > - acpi_pcihp_device_unplug_cb(&s->ar, s->irq,
> > > > > > &s->acpi_pci_hotplug, dev,
> > > > > > - errp);
> > > > > > +
> > > > > > + if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
> > > > > > + acpi_pcihp_device_unplug_cb(&s->ar, s->irq,
> > > > > > &s->acpi_pci_hotplug, dev,
> > > > > > + errp);
> > > > > > + } else {
> > > > > > + error_setg(errp, "acpi: device unplug request for not
> > > > > > supported device"
> > > > > > + " type: %s", object_get_typename(OBJECT(dev)));
> > > > > > + }
> > > > > > }
> > > > > >
> > > > > > static void piix4_update_bus_hotplug(PCIBus *pci_bus, void *opaque)
> > > > > > @@ -553,8 +566,8 @@ static void piix4_pm_class_init(ObjectClass
> > > > > > *klass, void *data)
> > > > > > */
> > > > > > dc->cannot_instantiate_with_device_add_yet = true;
> > > > > > dc->hotpluggable = false;
> > > > > > - hc->plug = piix4_pci_device_plug_cb;
> > > > > > - hc->unplug = piix4_pci_device_unplug_cb;
> > > > > > + hc->plug = piix4_device_plug_cb;
> > > > > > + hc->unplug = piix4_device_unplug_cb;
> > > > > > }
> > > > > >
> > > > > > static const TypeInfo piix4_pm_info = {
> > > > > > --
> > > > > > 1.9.0
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, (continued)
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Igor Mammedov, 2014/04/07
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Michael S. Tsirkin, 2014/04/07
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Igor Mammedov, 2014/04/07
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Michael S. Tsirkin, 2014/04/07
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Igor Mammedov, 2014/04/11
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Paolo Bonzini, 2014/04/29
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Michael S. Tsirkin, 2014/04/29
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Paolo Bonzini, 2014/04/29
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Michael S. Tsirkin, 2014/04/29
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Paolo Bonzini, 2014/04/29
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic,
Michael S. Tsirkin <=
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Paolo Bonzini, 2014/04/11
- Re: [Qemu-devel] [PATCH 23/35] acpi:piix4: make plug/unlug callbacks generic, Michael S. Tsirkin, 2014/04/29
[Qemu-devel] [PATCH 22/35] trace: add DIMM slot & address allocation for target-i386, Igor Mammedov, 2014/04/04
[Qemu-devel] [PATCH 25/35] pc: ich9 lpc: make it work with global/compat properties, Igor Mammedov, 2014/04/04
[Qemu-devel] [PATCH 16/35] pc: add memory hotplug handler to PC_MACHINE, Igor Mammedov, 2014/04/04
[Qemu-devel] [PATCH 27/35] pc: migrate piix4 & ich9 MemHotplugState, Igor Mammedov, 2014/04/04
[Qemu-devel] [PATCH 26/35] acpi:ich9: add memory hotplug handling, Igor Mammedov, 2014/04/04
[Qemu-devel] [PATCH 32/35] pc: ACPI BIOS: use enum for defining memory affinity flags, Igor Mammedov, 2014/04/04