qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: fred.konrad@greensocs.com, qemu-stable@nongnu.org, mst@redhat.com
Subject: [Qemu-devel] [PATCH 04/11] virtio-bus: cleanup plug/unplug interface
Date: Fri, 20 Sep 2013 16:57:53 +0200	[thread overview]
Message-ID: <1379689080-32396-5-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1379689080-32396-1-git-send-email-pbonzini@redhat.com>

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 669ce38..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);
         }
-        qdev_free(DEVICE(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 48afb7c..0d59315 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);
-- 
1.8.3.1

  parent reply	other threads:[~2013-09-20 14:58 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-20 14:57 [Qemu-devel] [PATCH 00/11] virtio: cleanup and fix hot-unplug Paolo Bonzini
2013-09-20 14:57 ` [Qemu-devel] [PATCH 01/11] virtio-bus: remove vdev field Paolo Bonzini
2013-10-14 16:23   ` [Qemu-devel] [PATCH 12/11] virtio-pci: avoid extra pointer dereferences on fast path Paolo Bonzini
2013-10-15 12:13     ` Frederic Konrad
2013-10-15 12:16       ` Paolo Bonzini
2013-10-15 16:46   ` [Qemu-devel] [PATCH v3 00/12] virtio: cleanup and fix hot-unplug Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 01/12] virtio-ccw: move virtio_ccw_stop_ioeventfd to virtio_ccw_busdev_unplug Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 02/12] virtio-bus: remove vdev field Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 03/12] virtio-ccw: " Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 04/12] virtio-pci: " Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 05/12] virtio-bus: cleanup plug/unplug interface Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 06/12] virtio-blk: switch exit callback to VirtioDeviceClass Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 07/12] virtio-serial: " Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 08/12] virtio-net: " Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 09/12] virtio-scsi: " Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 10/12] virtio-balloon: " Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 11/12] virtio-rng: " Paolo Bonzini
2013-10-15 16:46     ` [Qemu-devel] [PATCH v3 12/12] virtio-pci: add device_unplugged callback Paolo Bonzini
2013-09-20 14:57 ` [Qemu-devel] [PATCH 02/11] virtio-pci: remove vdev field Paolo Bonzini
2013-09-20 14:57 ` [Qemu-devel] [PATCH 03/11] virtio-ccw: " Paolo Bonzini
2013-09-20 14:57 ` Paolo Bonzini [this message]
2013-09-20 14:57 ` [Qemu-devel] [PATCH 05/11] virtio-blk: switch exit callback to VirtioDeviceClass Paolo Bonzini
2013-09-20 14:57 ` [Qemu-devel] [PATCH 06/11] virtio-serial: " Paolo Bonzini
2013-09-20 14:57 ` [Qemu-devel] [PATCH 07/11] virtio-net: " Paolo Bonzini
2013-09-20 14:57 ` [Qemu-devel] [PATCH 08/11] virtio-scsi: " Paolo Bonzini
2013-09-20 14:57 ` [Qemu-devel] [PATCH 09/11] virtio-balloon: " Paolo Bonzini
2013-09-20 14:57 ` [Qemu-devel] [PATCH 10/11] virtio-rng: " Paolo Bonzini
2013-09-20 14:58 ` [Qemu-devel] [PATCH 11/11] virtio-pci: add device_unplugged callback Paolo Bonzini
2013-09-21 19:17 ` [Qemu-devel] [PATCH 00/11] virtio: cleanup and fix hot-unplug Michael S. Tsirkin
2013-09-22  8:08   ` Paolo Bonzini
2013-10-08 15:45     ` Paolo Bonzini
2013-10-08 17:02 ` Paolo Bonzini
2013-10-15 12:32   ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1379689080-32396-5-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=fred.konrad@greensocs.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).