bacd9b0468
Rebase to qemu-1.7 GA New monitor command blockdev-add for full featured block device hotplug. Performance and functionality improvements for USB 3.0. Many VFIO improvements ACPI tables can be generated by QEMU and can be used by firmware directly. Support creating and writing .vhdx images. qemu-img map: dump detailed image file metadata
149 lines
5.2 KiB
Diff
149 lines
5.2 KiB
Diff
From e26f88b6280b2386c36d3b3d5ec820deb1ac7749 Mon Sep 17 00:00:00 2001
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Date: Fri, 20 Sep 2013 16:57:53 +0200
|
|
Subject: [PATCH] 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
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
hw/virtio/virtio-bus.c | 18 +++++++++---------
|
|
hw/virtio/virtio.c | 7 ++++++-
|
|
include/hw/virtio/virtio-bus.h | 6 +++---
|
|
include/hw/virtio/virtio.h | 1 +
|
|
4 files changed, 19 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
|
|
index 17dd06e..7aed6a4 100644
|
|
--- a/hw/virtio/virtio-bus.c
|
|
+++ b/hw/virtio/virtio-bus.c
|
|
@@ -37,8 +37,8 @@ do { printf("virtio_bus: " fmt , ## __VA_ARGS__); } while (0)
|
|
#define DPRINTF(fmt, ...) do { } while (0)
|
|
#endif
|
|
|
|
-/* Plug the VirtIODevice */
|
|
-int virtio_bus_plug_device(VirtIODevice *vdev)
|
|
+/* A VirtIODevice is being plugged */
|
|
+int virtio_bus_device_plugged(VirtIODevice *vdev)
|
|
{
|
|
DeviceState *qdev = DEVICE(vdev);
|
|
BusState *qbus = BUS(qdev_get_parent_bus(qdev));
|
|
@@ -64,20 +64,20 @@ void virtio_bus_reset(VirtioBusState *bus)
|
|
}
|
|
}
|
|
|
|
-/* Destroy the VirtIODevice */
|
|
-void virtio_bus_destroy_device(VirtioBusState *bus)
|
|
+/* A VirtIODevice is being unplugged */
|
|
+void virtio_bus_device_unplugged(VirtIODevice *vdev)
|
|
{
|
|
- BusState *qbus = BUS(bus);
|
|
+ DeviceState *qdev = DEVICE(vdev);
|
|
+ BusState *qbus = BUS(qdev_get_parent_bus(qdev));
|
|
+ VirtioBusState *bus = VIRTIO_BUS(qbus);
|
|
VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(bus);
|
|
- VirtIODevice *vdev = virtio_bus_get_device(bus);
|
|
|
|
DPRINTF("%s: remove device.\n", qbus->name);
|
|
|
|
if (vdev != NULL) {
|
|
- if (klass->device_unplug != NULL) {
|
|
- klass->device_unplug(qbus->parent);
|
|
+ if (klass->device_unplugged != NULL) {
|
|
+ klass->device_unplugged(qbus->parent);
|
|
}
|
|
- object_unparent(OBJECT(vdev));
|
|
}
|
|
}
|
|
|
|
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
|
|
index 2f1e73b..965b2c0 100644
|
|
--- a/hw/virtio/virtio.c
|
|
+++ b/hw/virtio/virtio.c
|
|
@@ -1158,14 +1158,19 @@ static int virtio_device_init(DeviceState *qdev)
|
|
if (k->init(vdev) < 0) {
|
|
return -1;
|
|
}
|
|
- virtio_bus_plug_device(vdev);
|
|
+ virtio_bus_device_plugged(vdev);
|
|
return 0;
|
|
}
|
|
|
|
static int virtio_device_exit(DeviceState *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) {
|
|
g_free(vdev->bus_name);
|
|
vdev->bus_name = NULL;
|
|
diff --git a/include/hw/virtio/virtio-bus.h b/include/hw/virtio/virtio-bus.h
|
|
index ba0f86a..0756545 100644
|
|
--- a/include/hw/virtio/virtio-bus.h
|
|
+++ b/include/hw/virtio/virtio-bus.h
|
|
@@ -61,7 +61,7 @@ typedef struct VirtioBusClass {
|
|
* transport independent exit function.
|
|
* 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?
|
|
* (ie can it ever call virtio_queue_set_align()?)
|
|
@@ -74,9 +74,9 @@ struct VirtioBusState {
|
|
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_destroy_device(VirtioBusState *bus);
|
|
+void virtio_bus_device_unplugged(VirtIODevice *bus);
|
|
/* Get the device id of the plugged device. */
|
|
uint16_t virtio_bus_get_vdev_id(VirtioBusState *bus);
|
|
/* Get the config_len field of the plugged device. */
|
|
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
|
|
index a90522d..59756c2 100644
|
|
--- a/include/hw/virtio/virtio.h
|
|
+++ b/include/hw/virtio/virtio.h
|
|
@@ -127,6 +127,7 @@ typedef struct VirtioDeviceClass {
|
|
/* This is what a VirtioDevice must implement */
|
|
DeviceClass parent;
|
|
int (*init)(VirtIODevice *vdev);
|
|
+ void (*exit)(VirtIODevice *vdev);
|
|
uint32_t (*get_features)(VirtIODevice *vdev, uint32_t requested_features);
|
|
uint32_t (*bad_features)(VirtIODevice *vdev);
|
|
void (*set_features)(VirtIODevice *vdev, uint32_t val);
|