qdev: add to BusState "hotplug-handler" link
It will allow to reuse field with different BUSes, reducing code duplication. Field is intended for replacing 'hotplug_qdev' field in PCIBus and also will allow to avoid adding equivalent field to DimmBus with possiblitity to refactor other BUSes to use it instead of custom field. In addition once all users of allow_hotplug field are converted to new API, link could replace allow_hotplug field in qdev hotplug code. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
9f117d4184
commit
0ee4de6ce1
|
@ -32,6 +32,7 @@
|
||||||
#include "qapi/visitor.h"
|
#include "qapi/visitor.h"
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "monitor/monitor.h"
|
#include "monitor/monitor.h"
|
||||||
|
#include "hw/hotplug.h"
|
||||||
|
|
||||||
int qdev_hotplug = 0;
|
int qdev_hotplug = 0;
|
||||||
static bool qdev_hot_added = false;
|
static bool qdev_hot_added = false;
|
||||||
|
@ -870,6 +871,9 @@ static void qbus_initfn(Object *obj)
|
||||||
BusState *bus = BUS(obj);
|
BusState *bus = BUS(obj);
|
||||||
|
|
||||||
QTAILQ_INIT(&bus->children);
|
QTAILQ_INIT(&bus->children);
|
||||||
|
object_property_add_link(obj, QDEV_HOTPLUG_HANDLER_PROPERTY,
|
||||||
|
TYPE_HOTPLUG_HANDLER,
|
||||||
|
(Object **)&bus->hotplug_handler, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *default_bus_get_fw_dev_path(DeviceState *dev)
|
static char *default_bus_get_fw_dev_path(DeviceState *dev)
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "qom/object.h"
|
#include "qom/object.h"
|
||||||
#include "hw/irq.h"
|
#include "hw/irq.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
#include "hw/hotplug.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
DEV_NVECTORS_UNSPECIFIED = -1,
|
DEV_NVECTORS_UNSPECIFIED = -1,
|
||||||
|
@ -180,14 +181,18 @@ typedef struct BusChild {
|
||||||
QTAILQ_ENTRY(BusChild) sibling;
|
QTAILQ_ENTRY(BusChild) sibling;
|
||||||
} BusChild;
|
} BusChild;
|
||||||
|
|
||||||
|
#define QDEV_HOTPLUG_HANDLER_PROPERTY "hotplug-handler"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BusState:
|
* BusState:
|
||||||
|
* @hotplug_device: link to a hotplug device associated with bus.
|
||||||
*/
|
*/
|
||||||
struct BusState {
|
struct BusState {
|
||||||
Object obj;
|
Object obj;
|
||||||
DeviceState *parent;
|
DeviceState *parent;
|
||||||
const char *name;
|
const char *name;
|
||||||
int allow_hotplug;
|
int allow_hotplug;
|
||||||
|
HotplugHandler *hotplug_handler;
|
||||||
int max_index;
|
int max_index;
|
||||||
QTAILQ_HEAD(ChildrenHead, BusChild) children;
|
QTAILQ_HEAD(ChildrenHead, BusChild) children;
|
||||||
QLIST_ENTRY(BusState) sibling;
|
QLIST_ENTRY(BusState) sibling;
|
||||||
|
@ -321,4 +326,11 @@ extern int qdev_hotplug;
|
||||||
|
|
||||||
char *qdev_get_dev_path(DeviceState *dev);
|
char *qdev_get_dev_path(DeviceState *dev);
|
||||||
|
|
||||||
|
static inline void qbus_set_hotplug_handler(BusState *bus, DeviceState *handler,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
object_property_set_link(OBJECT(bus), OBJECT(handler),
|
||||||
|
QDEV_HOTPLUG_HANDLER_PROPERTY, errp);
|
||||||
|
bus->allow_hotplug = 1;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue