qdev: hotplug for bus-less devices
Add get_hotplug_handler() method to machine, and make bus-less device use it during hotplug as a means to discover a hotplug handler controller. The returned controller is used to perform hotplug actions. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Acked-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
c270fb9eff
commit
b745454811
|
@ -34,6 +34,7 @@
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "monitor/monitor.h"
|
#include "monitor/monitor.h"
|
||||||
#include "hw/hotplug.h"
|
#include "hw/hotplug.h"
|
||||||
|
#include "hw/boards.h"
|
||||||
|
|
||||||
int qdev_hotplug = 0;
|
int qdev_hotplug = 0;
|
||||||
static bool qdev_hot_added = false;
|
static bool qdev_hot_added = false;
|
||||||
|
@ -813,6 +814,18 @@ static void device_set_realized(Object *obj, bool value, Error **errp)
|
||||||
local_err == NULL) {
|
local_err == NULL) {
|
||||||
hotplug_handler_plug(dev->parent_bus->hotplug_handler,
|
hotplug_handler_plug(dev->parent_bus->hotplug_handler,
|
||||||
dev, &local_err);
|
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) {
|
if (qdev_get_vmsd(dev) && local_err == NULL) {
|
||||||
|
|
|
@ -61,6 +61,11 @@ extern MachineState *current_machine;
|
||||||
/**
|
/**
|
||||||
* MachineClass:
|
* MachineClass:
|
||||||
* @qemu_machine: #QEMUMachine
|
* @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 {
|
struct MachineClass {
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
|
@ -90,6 +95,9 @@ struct MachineClass {
|
||||||
const char *default_boot_order;
|
const char *default_boot_order;
|
||||||
GlobalProperty *compat_props;
|
GlobalProperty *compat_props;
|
||||||
const char *hw_version;
|
const char *hw_version;
|
||||||
|
|
||||||
|
HotplugHandler *(*get_hotplug_handler)(MachineState *machine,
|
||||||
|
DeviceState *dev);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue