]> git.proxmox.com Git - mirror_qemu.git/commit - include/hw/qdev-core.h
qdev: Let machine hotplug handler to override bus hotplug handler
authorIgor Mammedov <imammedo@redhat.com>
Thu, 28 Feb 2019 12:28:48 +0000 (13:28 +0100)
committerEduardo Habkost <ehabkost@redhat.com>
Wed, 6 Mar 2019 14:51:08 +0000 (11:51 -0300)
commit17cc0128da3d4a211731a79853ea81c7159b26af
treea9d36d7b3b3282718a3cd83e58a07ce2ad97217e
parent07578b0ad6a6792fbe23bcd8477f3331b78f6027
qdev: Let machine hotplug handler to override bus hotplug handler

it will allow to return another hotplug handler than the default
one for a specific bus based device type. Which is needed to handle
non trivial plug/unplug sequences that need the access to resources
configured outside of bus where device is attached.

That will allow for returned hotplug handler to orchestrate wiring
in arbitrary order, by chaining other hotplug handlers when
it's needed.

PS:
It could be used for hybrid virtio-mem and virtio-pmem devices
where it will return machine as hotplug handler which will do
necessary wiring at machine level and then pass control down
the chain to bus specific hotplug handler.

Example of top level hotplug handler override and custom plug sequence:

  some_machine_get_hotplug_handler(machine){
      if (object_dynamic_cast(OBJECT(dev), TYPE_SOME_BUS_DEVICE)) {
          return HOTPLUG_HANDLER(machine);
      }
      return NULL;
  }

  some_machine_device_plug(hotplug_dev, dev) {
      if (object_dynamic_cast(OBJECT(dev), TYPE_SOME_BUS_DEVICE)) {
          /* do machine specific initialization */
          some_machine_init_special_device(dev)

          /* pass control to bus specific handler */
          hotplug_handler_plug(dev->parent_bus->hotplug_handler, dev)
      }
  }

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20190228122849.4296-3-david@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
hw/core/qdev.c
include/hw/qdev-core.h