[PATCHv3] qdev: DEVICE_DELETED event

Submitted by Michael S. Tsirkin on March 7, 2013, 4:48 p.m.

Details

Message ID 20130307164812.GA29676@redhat.com
State New
Headers show

Commit Message

Michael S. Tsirkin March 7, 2013, 4:48 p.m.
libvirt has a long-standing bug: when removing the device,
it can request removal but does not know when the
removal completes. Add an event so we can fix this in a robust way.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---

Changes from v3:
    - Document that we only emit events for devices with
      and ID, as suggested by Markus
Changes from v2:
    - move event toward the end of device_unparent,
      so that parents are reported after their children,
      as suggested by Paolo
Changes from v1:
    - move to device_unparent
    - address comments by Andreas and Eric


 QMP/qmp-events.txt        | 17 +++++++++++++++++
 hw/qdev.c                 |  6 ++++++
 include/monitor/monitor.h |  1 +
 monitor.c                 |  1 +
 qapi-schema.json          |  4 +++-
 5 files changed, 28 insertions(+), 1 deletion(-)

Comments

Markus Armbruster March 7, 2013, 5:24 p.m.
"Michael S. Tsirkin" <mst@redhat.com> writes:

> libvirt has a long-standing bug: when removing the device,
> it can request removal but does not know when the
> removal completes. Add an event so we can fix this in a robust way.

This is *v4*.  I think you should respin to avoid confusing Anthony's
tools.  Recommend to delay the respin until the discussion we're having
in the v1 thread has run its course.
Anthony Liguori March 7, 2013, 5:39 p.m.
Markus Armbruster <armbru@redhat.com> writes:

> "Michael S. Tsirkin" <mst@redhat.com> writes:
>
>> libvirt has a long-standing bug: when removing the device,
>> it can request removal but does not know when the
>> removal completes. Add an event so we can fix this in a robust way.
>
> This is *v4*.  I think you should respin to avoid confusing Anthony's
> tools.

Ack and thanks for pointing this out.  Please put a space before the v3
too.

Regards,

Anthony Liguori

  Recommend to delay the respin until the discussion we're having
> in the v1 thread has run its course.
Michael S. Tsirkin March 7, 2013, 6:04 p.m.
On Thu, Mar 07, 2013 at 11:39:21AM -0600, Anthony Liguori wrote:
> Markus Armbruster <armbru@redhat.com> writes:
> 
> > "Michael S. Tsirkin" <mst@redhat.com> writes:
> >
> >> libvirt has a long-standing bug: when removing the device,
> >> it can request removal but does not know when the
> >> removal completes. Add an event so we can fix this in a robust way.
> >
> > This is *v4*.  I think you should respin to avoid confusing Anthony's
> > tools.
> 
> Ack and thanks for pointing this out.  Please put a space before the v3
> too.
> 
> Regards,
> 
> Anthony Liguori

Do you need me to respin or can you apply this for now?

>   Recommend to delay the respin until the discussion we're having
> > in the v1 thread has run its course.

Patch hide | download patch | download mbox

diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt
index b2698e4..0ab5017 100644
--- a/QMP/qmp-events.txt
+++ b/QMP/qmp-events.txt
@@ -136,6 +136,23 @@  Example:
 Note: The "ready to complete" status is always reset by a BLOCK_JOB_ERROR
 event.
 
+DEVICE_DELETED
+-----------------
+
+Emitted whenever the device removal completion is acknowledged
+by the guest. This event is only emitted for devices with
+a user-specified ID.
+At this point, it's safe to reuse the specified device ID.
+Device removal can be initiated by the guest or by HMP/QMP commands.
+
+Data:
+
+- "device": device name (json-string)
+
+{ "event": "DEVICE_DELETED",
+  "data": { "device": "virtio-net-pci-0" },
+  "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
+
 DEVICE_TRAY_MOVED
 -----------------
 
diff --git a/hw/qdev.c b/hw/qdev.c
index 689cd54..393e83e 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -29,6 +29,7 @@ 
 #include "sysemu/sysemu.h"
 #include "qapi/error.h"
 #include "qapi/visitor.h"
+#include "qapi/qmp/qjson.h"
 
 int qdev_hotplug = 0;
 static bool qdev_hot_added = false;
@@ -778,6 +779,11 @@  static void device_unparent(Object *obj)
         object_unref(OBJECT(dev->parent_bus));
         dev->parent_bus = NULL;
     }
+    if (dev->id) {
+        QObject *data = qobject_from_jsonf("{ 'device': %s }", dev->id);
+        monitor_protocol_event(QEVENT_DEVICE_DELETED, data);
+        qobject_decref(data);
+    }
 }
 
 static void device_class_init(ObjectClass *class, void *data)
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index 87fb49c..b868760 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -39,6 +39,7 @@  typedef enum MonitorEvent {
     QEVENT_BLOCK_JOB_CANCELLED,
     QEVENT_BLOCK_JOB_ERROR,
     QEVENT_BLOCK_JOB_READY,
+    QEVENT_DEVICE_DELETED,
     QEVENT_DEVICE_TRAY_MOVED,
     QEVENT_SUSPEND,
     QEVENT_SUSPEND_DISK,
diff --git a/monitor.c b/monitor.c
index 32a6e74..2a5e7b6 100644
--- a/monitor.c
+++ b/monitor.c
@@ -457,6 +457,7 @@  static const char *monitor_event_names[] = {
     [QEVENT_BLOCK_JOB_CANCELLED] = "BLOCK_JOB_CANCELLED",
     [QEVENT_BLOCK_JOB_ERROR] = "BLOCK_JOB_ERROR",
     [QEVENT_BLOCK_JOB_READY] = "BLOCK_JOB_READY",
+    [QEVENT_DEVICE_DELETED] = "DEVICE_DELETED",
     [QEVENT_DEVICE_TRAY_MOVED] = "DEVICE_TRAY_MOVED",
     [QEVENT_SUSPEND] = "SUSPEND",
     [QEVENT_SUSPEND_DISK] = "SUSPEND_DISK",
diff --git a/qapi-schema.json b/qapi-schema.json
index 28b070f..bb361e1 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2354,7 +2354,9 @@ 
 # Notes: When this command completes, the device may not be removed from the
 #        guest.  Hot removal is an operation that requires guest cooperation.
 #        This command merely requests that the guest begin the hot removal
-#        process.
+#        process.  Completion of the device removal process is signaled with a
+#        DEVICE_DELETED event. Guest reset will automatically complete removal
+#        for all devices.
 #
 # Since: 0.14.0
 ##