qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 08/35] qdev: hotplug for buss-less devices


From: Igor Mammedov
Subject: Re: [Qemu-devel] [PATCH 08/35] qdev: hotplug for buss-less devices
Date: Mon, 7 Apr 2014 08:51:14 +0200

On Mon, 07 Apr 2014 12:26:23 +1000
Alexey Kardashevskiy <address@hidden> wrote:

> On 04/05/2014 12:36 AM, Igor Mammedov wrote:
> > Adds get_hotplug_handler() method to machine, and
> > makes bus-less device to use it during hotplug
> > as a means to discover hotplug handler controller.
> > Returned controller is used to permorm a hotplug
> > action.
> 
> 
> "returned controller" is a machine here?
not necessary, it could be any device that implements
HotplugHandler interface. Machine only provides simple means to get it
is a simplified version of
https://lists.gnu.org/archive/html/qemu-devel/2014-03/msg04356.html
as suggested by Paolo.

> 
> Why not to make a memory controller + bus instead? I thought this is the
> preferred approach in qom'ed QEMU :)
It's generic mechanism that could be used for hotplugging
any bus-less device.
As regarding bus approach that was used for memory hotplug
in V7, Andreas've made suggestion to get rid of it as it doesn't
map well for generic DIMM device and might be problematic to reuse
on other targets.
In V7 bus was used only as a means to discover a hotplug handler,
with this path bus is not needed anymore.


> 
> 
> 
> > Signed-off-by: Igor Mammedov <address@hidden>
> > ---
> >  hw/core/qdev.c      | 13 +++++++++++++
> >  include/hw/boards.h |  8 ++++++++
> >  2 files changed, 21 insertions(+)
> > 
> > diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> > index 60f9df1..50bb8f5 100644
> > --- a/hw/core/qdev.c
> > +++ b/hw/core/qdev.c
> > @@ -34,6 +34,7 @@
> >  #include "qapi/qmp/qjson.h"
> >  #include "monitor/monitor.h"
> >  #include "hw/hotplug.h"
> > +#include "hw/boards.h"
> >  
> >  int qdev_hotplug = 0;
> >  static bool qdev_hot_added = false;
> > @@ -761,6 +762,18 @@ static void device_set_realized(Object *obj, bool 
> > value, Error **err)
> >              local_err == NULL) {
> >              hotplug_handler_plug(dev->parent_bus->hotplug_handler,
> >                                   dev, &local_err);
> > +        } else if (local_err == NULL &&
> > +                   object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
> > +            HotplugHandler *hotplug_ctrl;
> > +            MachineState *machine = MACHINE(qdev_get_machine());
> > +            MachineClass *mc = MACHINE_GET_CLASS(machine);
> > +
> > +            if (mc->get_hotplug_handler) {
> > +                hotplug_ctrl = mc->get_hotplug_handler(machine, dev);
> > +                if (hotplug_ctrl) {
> > +                    hotplug_handler_plug(hotplug_ctrl, dev, &local_err);
> > +                }
> > +            }
> >          }
> >  
> >          if (qdev_get_vmsd(dev) && local_err == NULL) {
> > diff --git a/include/hw/boards.h b/include/hw/boards.h
> > index 3567190..67750b5 100644
> > --- a/include/hw/boards.h
> > +++ b/include/hw/boards.h
> > @@ -73,6 +73,11 @@ extern MachineState *current_machine;
> >  /**
> >   * MachineClass:
> >   * @qemu_machine: #QEMUMachine
> > + * @get_hotplug_handler: this function is called during bus-less
> > + *    device hotplug. If defined it returns pointer to an instance
> > + *    of HotplugHandler object, which handles hotplug operation
> > + *    for a given @dev. It may return NULL if @dev doesn't require
> > + *    any actions to be performed by hotplug handler.
> >   */
> >  struct MachineClass {
> >      /*< private >*/
> > @@ -80,6 +85,9 @@ struct MachineClass {
> >      /*< public >*/
> >  
> >      QEMUMachine *qemu_machine;
> > +
> > +    HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
> > +                                           DeviceState *dev);
> >  };
> >  
> >  /**
> > 
> 
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]