提交 5e96f5d2 编写于 作者: P Paolo Bonzini

virtio-bus: cleanup plug/unplug interface

Right now we have these pairs:

- virtio_bus_plug_device/virtio_bus_destroy_device.  The first
  takes a VirtIODevice, the second takes a VirtioBusState

- device_plugged/device_unplug callbacks in the VirtioBusClass
  (here it's just the naming that is inconsistent)

- virtio_bus_destroy_device is not called by anyone (and since
  it calls qdev_free, it would be called by the proxies---but
  then the callback is useless since the proxies can do whatever
  they want before calling virtio_bus_destroy_device)

And there is a k->init but no k->exit, hence virtio_device_exit is
overwritten by subclasses (except virtio-9p).  This cleans it up by:

- renaming the device_unplug callback to device_unplugged

- renaming virtio_bus_plug_device to virtio_bus_device_plugged,
  matching the callback name

- renaming virtio_bus_destroy_device to virtio_bus_device_unplugged,
  removing the qdev_free, making it take a VirtIODevice and calling it
  from virtio_device_exit

- adding a k->exit callback

virtio_device_exit is still overwritten, the next patches will fix that.

Cc: qemu-stable@nongnu.org
Acked-by: NAndreas Faerber <afaerber@suse.de>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 a3fc66d9
...@@ -37,8 +37,8 @@ do { printf("virtio_bus: " fmt , ## __VA_ARGS__); } while (0) ...@@ -37,8 +37,8 @@ do { printf("virtio_bus: " fmt , ## __VA_ARGS__); } while (0)
#define DPRINTF(fmt, ...) do { } while (0) #define DPRINTF(fmt, ...) do { } while (0)
#endif #endif
/* Plug the VirtIODevice */ /* A VirtIODevice is being plugged */
int virtio_bus_plug_device(VirtIODevice *vdev) int virtio_bus_device_plugged(VirtIODevice *vdev)
{ {
DeviceState *qdev = DEVICE(vdev); DeviceState *qdev = DEVICE(vdev);
BusState *qbus = BUS(qdev_get_parent_bus(qdev)); BusState *qbus = BUS(qdev_get_parent_bus(qdev));
...@@ -64,20 +64,19 @@ void virtio_bus_reset(VirtioBusState *bus) ...@@ -64,20 +64,19 @@ void virtio_bus_reset(VirtioBusState *bus)
} }
} }
/* Destroy the VirtIODevice */ /* A VirtIODevice is being unplugged */
void virtio_bus_destroy_device(VirtioBusState *bus) void virtio_bus_device_unplugged(VirtIODevice *vdev)
{ {
BusState *qbus = BUS(bus); DeviceState *qdev = DEVICE(vdev);
VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(bus); BusState *qbus = BUS(qdev_get_parent_bus(qdev));
VirtIODevice *vdev = virtio_bus_get_device(bus); VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(qbus);
DPRINTF("%s: remove device.\n", qbus->name); DPRINTF("%s: remove device.\n", qbus->name);
if (vdev != NULL) { if (vdev != NULL) {
if (klass->device_unplug != NULL) { if (klass->device_unplugged != NULL) {
klass->device_unplug(qbus->parent); klass->device_unplugged(qbus->parent);
} }
object_unparent(OBJECT(vdev));
} }
} }
......
...@@ -1158,14 +1158,19 @@ static int virtio_device_init(DeviceState *qdev) ...@@ -1158,14 +1158,19 @@ static int virtio_device_init(DeviceState *qdev)
if (k->init(vdev) < 0) { if (k->init(vdev) < 0) {
return -1; return -1;
} }
virtio_bus_plug_device(vdev); virtio_bus_device_plugged(vdev);
return 0; return 0;
} }
static int virtio_device_exit(DeviceState *qdev) static int virtio_device_exit(DeviceState *qdev)
{ {
VirtIODevice *vdev = VIRTIO_DEVICE(qdev); VirtIODevice *vdev = VIRTIO_DEVICE(qdev);
VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(qdev);
virtio_bus_device_unplugged(vdev);
if (k->exit) {
k->exit(vdev);
}
if (vdev->bus_name) { if (vdev->bus_name) {
g_free(vdev->bus_name); g_free(vdev->bus_name);
vdev->bus_name = NULL; vdev->bus_name = NULL;
......
...@@ -61,7 +61,7 @@ typedef struct VirtioBusClass { ...@@ -61,7 +61,7 @@ typedef struct VirtioBusClass {
* transport independent exit function. * transport independent exit function.
* This is called by virtio-bus just before the device is unplugged. * This is called by virtio-bus just before the device is unplugged.
*/ */
void (*device_unplug)(DeviceState *d); void (*device_unplugged)(DeviceState *d);
/* /*
* Does the transport have variable vring alignment? * Does the transport have variable vring alignment?
* (ie can it ever call virtio_queue_set_align()?) * (ie can it ever call virtio_queue_set_align()?)
...@@ -74,9 +74,9 @@ struct VirtioBusState { ...@@ -74,9 +74,9 @@ struct VirtioBusState {
BusState parent_obj; BusState parent_obj;
}; };
int virtio_bus_plug_device(VirtIODevice *vdev); int virtio_bus_device_plugged(VirtIODevice *vdev);
void virtio_bus_reset(VirtioBusState *bus); void virtio_bus_reset(VirtioBusState *bus);
void virtio_bus_destroy_device(VirtioBusState *bus); void virtio_bus_device_unplugged(VirtIODevice *bus);
/* Get the device id of the plugged device. */ /* Get the device id of the plugged device. */
uint16_t virtio_bus_get_vdev_id(VirtioBusState *bus); uint16_t virtio_bus_get_vdev_id(VirtioBusState *bus);
/* Get the config_len field of the plugged device. */ /* Get the config_len field of the plugged device. */
......
...@@ -127,6 +127,7 @@ typedef struct VirtioDeviceClass { ...@@ -127,6 +127,7 @@ typedef struct VirtioDeviceClass {
/* This is what a VirtioDevice must implement */ /* This is what a VirtioDevice must implement */
DeviceClass parent; DeviceClass parent;
int (*init)(VirtIODevice *vdev); int (*init)(VirtIODevice *vdev);
void (*exit)(VirtIODevice *vdev);
uint32_t (*get_features)(VirtIODevice *vdev, uint32_t requested_features); uint32_t (*get_features)(VirtIODevice *vdev, uint32_t requested_features);
uint32_t (*bad_features)(VirtIODevice *vdev); uint32_t (*bad_features)(VirtIODevice *vdev);
void (*set_features)(VirtIODevice *vdev, uint32_t val); void (*set_features)(VirtIODevice *vdev, uint32_t val);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册