qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 00/13] QMP queue
@ 2013-12-18 16:59 Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 01/13] vl: add missing transition debug->finish_migrate Luiz Capitulino
                   ` (14 more replies)
  0 siblings, 15 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

The following changes since commit e157b8fdd412d48eacfbb8c67d3d58780154faa3:

  Merge remote-tracking branch 'bonzini/virtio' into staging (2013-12-13 11:10:33 -0800)

are available in the git repository at:


  git://repo.or.cz/qemu/qmp-unstable.git queue/qmp

for you to fetch changes up to 2e89b6d1cd378602f2c8ea982145213aededf0f2:

  qemu-monitor: HMP cpu-add wrapper (2013-12-18 11:12:16 -0500)

----------------------------------------------------------------
Jason J. Herne (1):
      qemu-monitor: HMP cpu-add wrapper

Paolo Bonzini (6):
      vl: add missing transition debug->finish_migrate
      rng: initialize file descriptor to -1
      qom: fix leak for objects created with -object
      qom: catch errors in object_property_add_child
      monitor: add object-add (QMP) and object_add (HMP) command
      monitor: add object-del (QMP) and object_del (HMP) command

Peter Crosthwaite (6):
      error: Add error_abort
      hw/core/qdev: Delete dead code
      hw: Remove assert_no_error usages
      target-i386: Remove assert_no_error usage
      qemu-option: Remove qemu_opts_create_nofail
      qerror: Remove assert_no_error()

 backends/rng-random.c            |  4 +--
 block/blkdebug.c                 |  2 +-
 block/blkverify.c                |  2 +-
 block/curl.c                     |  2 +-
 block/gluster.c                  |  2 +-
 block/iscsi.c                    |  2 +-
 block/nbd.c                      |  3 +-
 block/qcow2.c                    |  2 +-
 block/raw-posix.c                |  2 +-
 block/raw-win32.c                |  5 +--
 block/rbd.c                      |  2 +-
 block/sheepdog.c                 |  2 +-
 block/vvfat.c                    |  2 +-
 blockdev.c                       |  6 ++--
 hmp-commands.hx                  | 41 +++++++++++++++++++++
 hmp.c                            | 77 ++++++++++++++++++++++++++++++++++++++++
 hmp.h                            |  3 ++
 hw/core/qdev-properties-system.c |  8 ++---
 hw/core/qdev-properties.c        | 40 ++++++---------------
 hw/core/qdev.c                   | 28 ++++-----------
 hw/dma/xilinx_axidma.c           | 13 +++----
 hw/net/xilinx_axienet.c          | 13 +++----
 hw/watchdog/watchdog.c           |  3 +-
 include/hw/xilinx.h              | 14 +++-----
 include/monitor/monitor.h        |  3 ++
 include/qapi/error.h             |  6 ++++
 include/qapi/qmp/qerror.h        |  1 -
 include/qapi/visitor.h           |  3 +-
 include/qemu/option.h            |  1 -
 include/qemu/typedefs.h          |  2 ++
 qapi-schema.json                 | 34 ++++++++++++++++++
 qdev-monitor.c                   |  2 +-
 qemu-img.c                       |  2 +-
 qmp-commands.hx                  | 51 ++++++++++++++++++++++++++
 qmp.c                            | 75 ++++++++++++++++++++++++++++++++++++++
 qobject/qerror.c                 |  8 -----
 qom/object.c                     |  9 +++--
 target-i386/cpu.c                |  4 +--
 util/error.c                     | 22 +++++++++++-
 util/qemu-config.c               |  2 +-
 util/qemu-option.c               |  9 -----
 util/qemu-sockets.c              | 18 +++++-----
 vl.c                             | 19 ++++++----
 43 files changed, 400 insertions(+), 149 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 01/13] vl: add missing transition debug->finish_migrate
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 02/13] error: Add error_abort Luiz Capitulino
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Paolo Bonzini <pbonzini@redhat.com>

This fixes an abort if you invoke the "migrate" command while the
guest is being debugged.

Cc: qemu-stable@nongnu.org
Cc: lcapitulino@redhat.com
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 vl.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/vl.c b/vl.c
index 60dbbcb..10e6c0e 100644
--- a/vl.c
+++ b/vl.c
@@ -591,6 +591,7 @@ typedef struct {
 static const RunStateTransition runstate_transitions_def[] = {
     /*     from      ->     to      */
     { RUN_STATE_DEBUG, RUN_STATE_RUNNING },
+    { RUN_STATE_DEBUG, RUN_STATE_FINISH_MIGRATE },
 
     { RUN_STATE_INMIGRATE, RUN_STATE_RUNNING },
     { RUN_STATE_INMIGRATE, RUN_STATE_PAUSED },
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 02/13] error: Add error_abort
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 01/13] vl: add missing transition debug->finish_migrate Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 03/13] hw/core/qdev: Delete dead code Luiz Capitulino
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Add a special Error * that can be passed to error handling APIs to
signal that any errors are fatal and should abort QEMU. There are two
advantages to this:

- allows for brevity when wishing to assert success of Error **
  accepting APIs. No need for this pattern:
        Error * local_err = NULL;
        api_call(foo, bar, &local_err);
        assert_no_error(local_err);
  This also removes the need for _nofail variants of APIs with
  asserting call sites now reduced to 1LOC.
- SIGABRT happens from within the offending API. When a fatal error
  occurs in an API call (when the caller is asserting sucess) failure
  often means the API itself is broken. With the abort happening in the
  API call now, the stack frames into the call are available at debug
  time. In the assert_no_error scheme the abort happens after the fact.

The exact semantic is that when an error is raised, if the argument
Error ** matches &error_abort, then the abort occurs immediately. The
error messaged is reported.

For error_propagate, if the destination error is &error_abort, then
the abort happens at propagation time.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 include/qapi/error.h |  6 ++++++
 util/error.c         | 22 +++++++++++++++++++++-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/include/qapi/error.h b/include/qapi/error.h
index 7d4c696..c0f0c3b 100644
--- a/include/qapi/error.h
+++ b/include/qapi/error.h
@@ -95,4 +95,10 @@ void error_propagate(Error **dst_err, Error *local_err);
  */
 void error_free(Error *err);
 
+/**
+ * If passed to error_set and friends, abort().
+ */
+
+extern Error *error_abort;
+
 #endif
diff --git a/util/error.c b/util/error.c
index 3ee362a..f11f1d5 100644
--- a/util/error.c
+++ b/util/error.c
@@ -23,6 +23,8 @@ struct Error
     ErrorClass err_class;
 };
 
+Error *error_abort;
+
 void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
 {
     Error *err;
@@ -41,6 +43,11 @@ void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
     va_end(ap);
     err->err_class = err_class;
 
+    if (errp == &error_abort) {
+        error_report("%s", error_get_pretty(err));
+        abort();
+    }
+
     *errp = err;
 
     errno = saved_errno;
@@ -72,6 +79,11 @@ void error_set_errno(Error **errp, int os_errno, ErrorClass err_class,
     va_end(ap);
     err->err_class = err_class;
 
+    if (errp == &error_abort) {
+        error_report("%s", error_get_pretty(err));
+        abort();
+    }
+
     *errp = err;
 
     errno = saved_errno;
@@ -112,6 +124,11 @@ void error_set_win32(Error **errp, int win32_err, ErrorClass err_class,
     va_end(ap);
     err->err_class = err_class;
 
+    if (errp == &error_abort) {
+        error_report("%s", error_get_pretty(err));
+        abort();
+    }
+
     *errp = err;
 }
 
@@ -153,7 +170,10 @@ void error_free(Error *err)
 
 void error_propagate(Error **dst_err, Error *local_err)
 {
-    if (dst_err && !*dst_err) {
+    if (local_err && dst_err == &error_abort) {
+        error_report("%s", error_get_pretty(local_err));
+        abort();
+    } else if (dst_err && !*dst_err) {
         *dst_err = local_err;
     } else if (local_err) {
         error_free(local_err);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 03/13] hw/core/qdev: Delete dead code
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 01/13] vl: add missing transition debug->finish_migrate Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 02/13] error: Add error_abort Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 04/13] hw: Remove assert_no_error usages Luiz Capitulino
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

This is unreachable code, as it's already asserted that no errors have
occurred. Delete.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 hw/core/qdev.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index e374a93..adbff18 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -746,11 +746,6 @@ static void device_initfn(Object *obj)
         }
         class = object_class_get_parent(class);
     } while (class != object_class_by_name(TYPE_DEVICE));
-    if (err != NULL) {
-        qerror_report_err(err);
-        error_free(err);
-        exit(1);
-    }
 
     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
                              (Object **)&dev->parent_bus, &err);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 04/13] hw: Remove assert_no_error usages
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (2 preceding siblings ...)
  2013-12-18 16:59 ` [Qemu-devel] [PULL 03/13] hw/core/qdev: Delete dead code Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 05/13] target-i386: Remove assert_no_error usage Luiz Capitulino
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Replace assert_no_error() usages with the error_abort system.
&error_abort is passed into API calls to signal to the Error sub-system
that any errors are fatal. Removes need for caller assertions.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 hw/core/qdev-properties-system.c |  8 ++------
 hw/core/qdev-properties.c        | 40 ++++++++++------------------------------
 hw/core/qdev.c                   | 23 +++++++----------------
 hw/dma/xilinx_axidma.c           | 13 ++++---------
 hw/net/xilinx_axienet.c          | 13 ++++---------
 include/hw/xilinx.h              | 14 ++++----------
 6 files changed, 31 insertions(+), 80 deletions(-)

diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 729efa8..3f29b49 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -352,21 +352,17 @@ void qdev_prop_set_drive_nofail(DeviceState *dev, const char *name,
 void qdev_prop_set_chr(DeviceState *dev, const char *name,
                        CharDriverState *value)
 {
-    Error *errp = NULL;
     assert(!value || value->label);
     object_property_set_str(OBJECT(dev),
-                            value ? value->label : "", name, &errp);
-    assert_no_error(errp);
+                            value ? value->label : "", name, &error_abort);
 }
 
 void qdev_prop_set_netdev(DeviceState *dev, const char *name,
                           NetClientState *value)
 {
-    Error *errp = NULL;
     assert(!value || value->name);
     object_property_set_str(OBJECT(dev),
-                            value ? value->name : "", name, &errp);
-    assert_no_error(errp);
+                            value ? value->name : "", name, &error_abort);
 }
 
 void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index dc8ae69..b949f0e 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -1003,73 +1003,55 @@ void qdev_prop_parse(DeviceState *dev, const char *name, const char *value,
 
 void qdev_prop_set_bit(DeviceState *dev, const char *name, bool value)
 {
-    Error *errp = NULL;
-    object_property_set_bool(OBJECT(dev), value, name, &errp);
-    assert_no_error(errp);
+    object_property_set_bool(OBJECT(dev), value, name, &error_abort);
 }
 
 void qdev_prop_set_uint8(DeviceState *dev, const char *name, uint8_t value)
 {
-    Error *errp = NULL;
-    object_property_set_int(OBJECT(dev), value, name, &errp);
-    assert_no_error(errp);
+    object_property_set_int(OBJECT(dev), value, name, &error_abort);
 }
 
 void qdev_prop_set_uint16(DeviceState *dev, const char *name, uint16_t value)
 {
-    Error *errp = NULL;
-    object_property_set_int(OBJECT(dev), value, name, &errp);
-    assert_no_error(errp);
+    object_property_set_int(OBJECT(dev), value, name, &error_abort);
 }
 
 void qdev_prop_set_uint32(DeviceState *dev, const char *name, uint32_t value)
 {
-    Error *errp = NULL;
-    object_property_set_int(OBJECT(dev), value, name, &errp);
-    assert_no_error(errp);
+    object_property_set_int(OBJECT(dev), value, name, &error_abort);
 }
 
 void qdev_prop_set_int32(DeviceState *dev, const char *name, int32_t value)
 {
-    Error *errp = NULL;
-    object_property_set_int(OBJECT(dev), value, name, &errp);
-    assert_no_error(errp);
+    object_property_set_int(OBJECT(dev), value, name, &error_abort);
 }
 
 void qdev_prop_set_uint64(DeviceState *dev, const char *name, uint64_t value)
 {
-    Error *errp = NULL;
-    object_property_set_int(OBJECT(dev), value, name, &errp);
-    assert_no_error(errp);
+    object_property_set_int(OBJECT(dev), value, name, &error_abort);
 }
 
 void qdev_prop_set_string(DeviceState *dev, const char *name, const char *value)
 {
-    Error *errp = NULL;
-    object_property_set_str(OBJECT(dev), value, name, &errp);
-    assert_no_error(errp);
+    object_property_set_str(OBJECT(dev), value, name, &error_abort);
 }
 
 void qdev_prop_set_macaddr(DeviceState *dev, const char *name, uint8_t *value)
 {
-    Error *errp = NULL;
     char str[2 * 6 + 5 + 1];
     snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x",
              value[0], value[1], value[2], value[3], value[4], value[5]);
 
-    object_property_set_str(OBJECT(dev), str, name, &errp);
-    assert_no_error(errp);
+    object_property_set_str(OBJECT(dev), str, name, &error_abort);
 }
 
 void qdev_prop_set_enum(DeviceState *dev, const char *name, int value)
 {
     Property *prop;
-    Error *errp = NULL;
 
     prop = qdev_prop_find(dev, name);
     object_property_set_str(OBJECT(dev), prop->info->enum_table[value],
-                            name, &errp);
-    assert_no_error(errp);
+                            name, &error_abort);
 }
 
 void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value)
@@ -1161,12 +1143,10 @@ static void set_size(Object *obj, Visitor *v, void *opaque,
 static int parse_size(DeviceState *dev, Property *prop, const char *str)
 {
     uint64_t *ptr = qdev_get_prop_ptr(dev, prop);
-    Error *errp = NULL;
 
     if (str != NULL) {
-        parse_option_size(prop->name, str, ptr, &errp);
+        parse_option_size(prop->name, str, ptr, &error_abort);
     }
-    assert_no_error(errp);
     return 0;
 }
 
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index adbff18..7d869fc 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -656,14 +656,13 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
     }
 
     if (prop->qtype == QTYPE_QBOOL) {
-        object_property_set_bool(obj, prop->defval, prop->name, &local_err);
+        object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
     } else if (prop->info->enum_table) {
         object_property_set_str(obj, prop->info->enum_table[prop->defval],
-                                prop->name, &local_err);
+                                prop->name, &error_abort);
     } else if (prop->qtype == QTYPE_QINT) {
-        object_property_set_int(obj, prop->defval, prop->name, &local_err);
+        object_property_set_int(obj, prop->defval, prop->name, &error_abort);
     }
-    assert_no_error(local_err);
 }
 
 static bool device_get_realized(Object *obj, Error **err)
@@ -723,7 +722,6 @@ static void device_initfn(Object *obj)
     DeviceState *dev = DEVICE(obj);
     ObjectClass *class;
     Property *prop;
-    Error *err = NULL;
 
     if (qdev_hotplug) {
         dev->hotplugged = 1;
@@ -739,26 +737,19 @@ static void device_initfn(Object *obj)
     class = object_get_class(OBJECT(dev));
     do {
         for (prop = DEVICE_CLASS(class)->props; prop && prop->name; prop++) {
-            qdev_property_add_legacy(dev, prop, &err);
-            assert_no_error(err);
-            qdev_property_add_static(dev, prop, &err);
-            assert_no_error(err);
+            qdev_property_add_legacy(dev, prop, &error_abort);
+            qdev_property_add_static(dev, prop, &error_abort);
         }
         class = object_class_get_parent(class);
     } while (class != object_class_by_name(TYPE_DEVICE));
 
     object_property_add_link(OBJECT(dev), "parent_bus", TYPE_BUS,
-                             (Object **)&dev->parent_bus, &err);
-    assert_no_error(err);
+                             (Object **)&dev->parent_bus, &error_abort);
 }
 
 static void device_post_init(Object *obj)
 {
-    DeviceState *dev = DEVICE(obj);
-    Error *err = NULL;
-
-    qdev_prop_set_globals(dev, &err);
-    assert_no_error(err);
+    qdev_prop_set_globals(DEVICE(obj), &error_abort);
 }
 
 /* Unlink device from bus and free the structure.  */
diff --git a/hw/dma/xilinx_axidma.c b/hw/dma/xilinx_axidma.c
index d67c5f1..19f07b3 100644
--- a/hw/dma/xilinx_axidma.c
+++ b/hw/dma/xilinx_axidma.c
@@ -569,26 +569,21 @@ static void xilinx_axidma_init(Object *obj)
 {
     XilinxAXIDMA *s = XILINX_AXI_DMA(obj);
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
-    Error *errp = NULL;
 
     object_property_add_link(obj, "axistream-connected", TYPE_STREAM_SLAVE,
-                             (Object **) &s->tx_data_dev, &errp);
-    assert_no_error(errp);
+                             (Object **)&s->tx_data_dev, &error_abort);
     object_property_add_link(obj, "axistream-control-connected",
                              TYPE_STREAM_SLAVE,
-                             (Object **) &s->tx_control_dev, &errp);
-    assert_no_error(errp);
+                             (Object **)&s->tx_control_dev, &error_abort);
 
     object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
                       TYPE_XILINX_AXI_DMA_DATA_STREAM);
     object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
                       TYPE_XILINX_AXI_DMA_CONTROL_STREAM);
     object_property_add_child(OBJECT(s), "axistream-connected-target",
-                              (Object *)&s->rx_data_dev, &errp);
-    assert_no_error(errp);
+                              (Object *)&s->rx_data_dev, &error_abort);
     object_property_add_child(OBJECT(s), "axistream-control-connected-target",
-                              (Object *)&s->rx_control_dev, &errp);
-    assert_no_error(errp);
+                              (Object *)&s->rx_control_dev, &error_abort);
 
     sysbus_init_irq(sbd, &s->streams[0].irq);
     sysbus_init_irq(sbd, &s->streams[1].irq);
diff --git a/hw/net/xilinx_axienet.c b/hw/net/xilinx_axienet.c
index 3eb7715..0bd5eda 100644
--- a/hw/net/xilinx_axienet.c
+++ b/hw/net/xilinx_axienet.c
@@ -980,26 +980,21 @@ static void xilinx_enet_init(Object *obj)
 {
     XilinxAXIEnet *s = XILINX_AXI_ENET(obj);
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
-    Error *errp = NULL;
 
     object_property_add_link(obj, "axistream-connected", TYPE_STREAM_SLAVE,
-                             (Object **) &s->tx_data_dev, &errp);
-    assert_no_error(errp);
+                             (Object **) &s->tx_data_dev, &error_abort);
     object_property_add_link(obj, "axistream-control-connected",
                              TYPE_STREAM_SLAVE,
-                             (Object **) &s->tx_control_dev, &errp);
-    assert_no_error(errp);
+                             (Object **) &s->tx_control_dev, &error_abort);
 
     object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
                       TYPE_XILINX_AXI_ENET_DATA_STREAM);
     object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
                       TYPE_XILINX_AXI_ENET_CONTROL_STREAM);
     object_property_add_child(OBJECT(s), "axistream-connected-target",
-                              (Object *)&s->rx_data_dev, &errp);
-    assert_no_error(errp);
+                              (Object *)&s->rx_data_dev, &error_abort);
     object_property_add_child(OBJECT(s), "axistream-control-connected-target",
-                              (Object *)&s->rx_control_dev, &errp);
-    assert_no_error(errp);
+                              (Object *)&s->rx_control_dev, &error_abort);
 
     sysbus_init_irq(sbd, &s->irq);
 
diff --git a/include/hw/xilinx.h b/include/hw/xilinx.h
index 0c0251a..9d6debe 100644
--- a/include/hw/xilinx.h
+++ b/include/hw/xilinx.h
@@ -59,16 +59,13 @@ xilinx_axiethernet_init(DeviceState *dev, NICInfo *nd, StreamSlave *ds,
                         StreamSlave *cs, hwaddr base, qemu_irq irq, int txmem,
                         int rxmem)
 {
-    Error *errp = NULL;
-
     qdev_set_nic_properties(dev, nd);
     qdev_prop_set_uint32(dev, "rxmem", rxmem);
     qdev_prop_set_uint32(dev, "txmem", txmem);
     object_property_set_link(OBJECT(dev), OBJECT(ds),
-                             "axistream-connected", &errp);
+                             "axistream-connected", &error_abort);
     object_property_set_link(OBJECT(dev), OBJECT(cs),
-                             "axistream-control-connected", &errp);
-    assert_no_error(errp);
+                             "axistream-control-connected", &error_abort);
     qdev_init_nofail(dev);
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
     sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq);
@@ -78,14 +75,11 @@ static inline void
 xilinx_axidma_init(DeviceState *dev, StreamSlave *ds, StreamSlave *cs,
                    hwaddr base, qemu_irq irq, qemu_irq irq2, int freqhz)
 {
-    Error *errp = NULL;
-
     qdev_prop_set_uint32(dev, "freqhz", freqhz);
     object_property_set_link(OBJECT(dev), OBJECT(ds),
-                             "axistream-connected", &errp);
+                             "axistream-connected", &error_abort);
     object_property_set_link(OBJECT(dev), OBJECT(cs),
-                             "axistream-control-connected", &errp);
-    assert_no_error(errp);
+                             "axistream-control-connected", &error_abort);
     qdev_init_nofail(dev);
 
     sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 05/13] target-i386: Remove assert_no_error usage
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (3 preceding siblings ...)
  2013-12-18 16:59 ` [Qemu-devel] [PULL 04/13] hw: Remove assert_no_error usages Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 06/13] qemu-option: Remove qemu_opts_create_nofail Luiz Capitulino
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Replace an assert_no_error() usage with the error_abort system.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 target-i386/cpu.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index bb98f6d..6b7b1a9 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1600,7 +1600,6 @@ static int cpu_x86_find_by_name(X86CPU *cpu, x86_def_t *x86_cpu_def,
                                 const char *name)
 {
     x86_def_t *def;
-    Error *err = NULL;
     int i;
 
     if (name == NULL) {
@@ -1608,8 +1607,7 @@ static int cpu_x86_find_by_name(X86CPU *cpu, x86_def_t *x86_cpu_def,
     }
     if (kvm_enabled() && strcmp(name, "host") == 0) {
         kvm_cpu_fill_host(x86_cpu_def);
-        object_property_set_bool(OBJECT(cpu), true, "pmu", &err);
-        assert_no_error(err);
+        object_property_set_bool(OBJECT(cpu), true, "pmu", &error_abort);
         return 0;
     }
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 06/13] qemu-option: Remove qemu_opts_create_nofail
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (4 preceding siblings ...)
  2013-12-18 16:59 ` [Qemu-devel] [PULL 05/13] target-i386: Remove assert_no_error usage Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 07/13] qerror: Remove assert_no_error() Luiz Capitulino
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

This is a boiler-plate _nofail variant of qemu_opts_create. Remove and
use error_abort in call sites.

null/0 arguments needs to be added for the id and fail_if_exists fields
in affected callsites due to argument inconsistency between the normal and
no_fail variants.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 block/blkdebug.c       |  2 +-
 block/blkverify.c      |  2 +-
 block/curl.c           |  2 +-
 block/gluster.c        |  2 +-
 block/iscsi.c          |  2 +-
 block/nbd.c            |  3 ++-
 block/qcow2.c          |  2 +-
 block/raw-posix.c      |  2 +-
 block/raw-win32.c      |  5 +++--
 block/rbd.c            |  2 +-
 block/sheepdog.c       |  2 +-
 block/vvfat.c          |  2 +-
 blockdev.c             |  6 ++++--
 hw/watchdog/watchdog.c |  3 ++-
 include/qemu/option.h  |  1 -
 qdev-monitor.c         |  2 +-
 qemu-img.c             |  2 +-
 util/qemu-config.c     |  2 +-
 util/qemu-option.c     |  9 ---------
 util/qemu-sockets.c    | 18 +++++++++---------
 vl.c                   | 15 +++++++++------
 21 files changed, 42 insertions(+), 44 deletions(-)

diff --git a/block/blkdebug.c b/block/blkdebug.c
index 37cf028..422f4c4 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -359,7 +359,7 @@ static int blkdebug_open(BlockDriverState *bs, QDict *options, int flags,
     const char *filename, *config;
     int ret;
 
-    opts = qemu_opts_create_nofail(&runtime_opts);
+    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         error_propagate(errp, local_err);
diff --git a/block/blkverify.c b/block/blkverify.c
index 3c63528..1c1637f 100644
--- a/block/blkverify.c
+++ b/block/blkverify.c
@@ -125,7 +125,7 @@ static int blkverify_open(BlockDriverState *bs, QDict *options, int flags,
     const char *filename, *raw;
     int ret;
 
-    opts = qemu_opts_create_nofail(&runtime_opts);
+    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         error_propagate(errp, local_err);
diff --git a/block/curl.c b/block/curl.c
index 5a46f97..a603936 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -413,7 +413,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
         return -EROFS;
     }
 
-    opts = qemu_opts_create_nofail(&runtime_opts);
+    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         qerror_report_err(local_err);
diff --git a/block/gluster.c b/block/gluster.c
index 877686a..563d497 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -298,7 +298,7 @@ static int qemu_gluster_open(BlockDriverState *bs,  QDict *options,
     Error *local_err = NULL;
     const char *filename;
 
-    opts = qemu_opts_create_nofail(&runtime_opts);
+    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         qerror_report_err(local_err);
diff --git a/block/iscsi.c b/block/iscsi.c
index fa69408..02eba5d 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1109,7 +1109,7 @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
         return -EINVAL;
     }
 
-    opts = qemu_opts_create_nofail(&runtime_opts);
+    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         qerror_report_err(local_err);
diff --git a/block/nbd.c b/block/nbd.c
index c8deeee..5bd9359 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -234,7 +234,8 @@ static int nbd_config(BDRVNBDState *s, QDict *options)
         return -EINVAL;
     }
 
-    s->socket_opts = qemu_opts_create_nofail(&socket_optslist);
+    s->socket_opts = qemu_opts_create(&socket_optslist, NULL, 0,
+                                      &error_abort);
 
     qemu_opts_absorb_qdict(s->socket_opts, options, &local_err);
     if (error_is_set(&local_err)) {
diff --git a/block/qcow2.c b/block/qcow2.c
index f29aa88..8ec9db1 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -669,7 +669,7 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     /* Enable lazy_refcounts according to image and command line options */
-    opts = qemu_opts_create_nofail(&qcow2_runtime_opts);
+    opts = qemu_opts_create(&qcow2_runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         error_propagate(errp, local_err);
diff --git a/block/raw-posix.c b/block/raw-posix.c
index 10c6b34..0676037 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -287,7 +287,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
     int fd, ret;
     struct stat st;
 
-    opts = qemu_opts_create_nofail(&raw_runtime_opts);
+    opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         error_propagate(errp, local_err);
diff --git a/block/raw-win32.c b/block/raw-win32.c
index 2bad5a3..ce314fd 100644
--- a/block/raw-win32.c
+++ b/block/raw-win32.c
@@ -248,7 +248,7 @@ static int raw_open(BlockDriverState *bs, QDict *options, int flags,
 
     s->type = FTYPE_FILE;
 
-    opts = qemu_opts_create_nofail(&raw_runtime_opts);
+    opts = qemu_opts_create(&raw_runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         error_propagate(errp, local_err);
@@ -550,7 +550,8 @@ static int hdev_open(BlockDriverState *bs, QDict *options, int flags,
     Error *local_err = NULL;
     const char *filename;
 
-    QemuOpts *opts = qemu_opts_create_nofail(&raw_runtime_opts);
+    QemuOpts *opts = qemu_opts_create(&raw_runtime_opts, NULL, 0,
+                                      &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         error_propagate(errp, local_err);
diff --git a/block/rbd.c b/block/rbd.c
index 4a1ea5b..f453f04 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -461,7 +461,7 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
     const char *filename;
     int r;
 
-    opts = qemu_opts_create_nofail(&runtime_opts);
+    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         qerror_report_err(local_err);
diff --git a/block/sheepdog.c b/block/sheepdog.c
index b4ae50f..20e3380 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -1383,7 +1383,7 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags,
 
     s->bs = bs;
 
-    opts = qemu_opts_create_nofail(&runtime_opts);
+    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         qerror_report_err(local_err);
diff --git a/block/vvfat.c b/block/vvfat.c
index 3ddaa0b..f67d8ae 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -1085,7 +1085,7 @@ DLOG(if (stderr == NULL) {
     setbuf(stderr, NULL);
 })
 
-    opts = qemu_opts_create_nofail(&runtime_opts);
+    opts = qemu_opts_create(&runtime_opts, NULL, 0, &error_abort);
     qemu_opts_absorb_qdict(opts, options, &local_err);
     if (error_is_set(&local_err)) {
         qerror_report_err(local_err);
diff --git a/blockdev.c b/blockdev.c
index 44755e1..90b90bf 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -682,7 +682,8 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type)
     bs_opts = qdict_new();
     qemu_opts_to_qdict(all_opts, bs_opts);
 
-    legacy_opts = qemu_opts_create_nofail(&qemu_legacy_drive_opts);
+    legacy_opts = qemu_opts_create(&qemu_legacy_drive_opts, NULL, 0,
+                                   &error_abort);
     qemu_opts_absorb_qdict(legacy_opts, bs_opts, &local_err);
     if (error_is_set(&local_err)) {
         qerror_report_err(local_err);
@@ -853,7 +854,8 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type)
 
     if (type == IF_VIRTIO) {
         QemuOpts *devopts;
-        devopts = qemu_opts_create_nofail(qemu_find_opts("device"));
+        devopts = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
+                                   &error_abort);
         if (arch_type == QEMU_ARCH_S390X) {
             qemu_opt_set(devopts, "driver", "virtio-blk-s390");
         } else {
diff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c
index 387962e..f28161b 100644
--- a/hw/watchdog/watchdog.c
+++ b/hw/watchdog/watchdog.c
@@ -66,7 +66,8 @@ int select_watchdog(const char *p)
     QLIST_FOREACH(model, &watchdog_list, entry) {
         if (strcasecmp(model->wdt_name, p) == 0) {
             /* add the device */
-            opts = qemu_opts_create_nofail(qemu_find_opts("device"));
+            opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
+                                    &error_abort);
             qemu_opt_set(opts, "driver", p);
             return 0;
         }
diff --git a/include/qemu/option.h b/include/qemu/option.h
index 5c0c6dd..3ea871a 100644
--- a/include/qemu/option.h
+++ b/include/qemu/option.h
@@ -136,7 +136,6 @@ int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
 QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id);
 QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
                            int fail_if_exists, Error **errp);
-QemuOpts *qemu_opts_create_nofail(QemuOptsList *list);
 void qemu_opts_reset(QemuOptsList *list);
 void qemu_opts_loc_restore(QemuOpts *opts);
 int qemu_opts_set(QemuOptsList *list, const char *id,
diff --git a/qdev-monitor.c b/qdev-monitor.c
index dc37a43..6280771 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -730,7 +730,7 @@ int qemu_global_option(const char *str)
         return -1;
     }
 
-    opts = qemu_opts_create_nofail(&qemu_global_opts);
+    opts = qemu_opts_create(&qemu_global_opts, NULL, 0, &error_abort);
     qemu_opt_set(opts, "driver", driver);
     qemu_opt_set(opts, "property", property);
     qemu_opt_set(opts, "value", str+offset+1);
diff --git a/qemu-img.c b/qemu-img.c
index 7dfe982..2261ff3 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -2548,7 +2548,7 @@ static int img_resize(int argc, char **argv)
     }
 
     /* Parse size */
-    param = qemu_opts_create_nofail(&resize_options);
+    param = qemu_opts_create(&resize_options, NULL, 0, &error_abort);
     if (qemu_opt_set(param, BLOCK_OPT_SIZE, size)) {
         /* Error message already printed when size parsing fails */
         ret = -1;
diff --git a/util/qemu-config.c b/util/qemu-config.c
index 04da942..7973659 100644
--- a/util/qemu-config.c
+++ b/util/qemu-config.c
@@ -311,7 +311,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
                 error_free(local_err);
                 goto out;
             }
-            opts = qemu_opts_create_nofail(list);
+            opts = qemu_opts_create(list, NULL, 0, &error_abort);
             continue;
         }
         if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) {
diff --git a/util/qemu-option.c b/util/qemu-option.c
index efcb5dc..668e5d9 100644
--- a/util/qemu-option.c
+++ b/util/qemu-option.c
@@ -791,15 +791,6 @@ QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
     return opts;
 }
 
-QemuOpts *qemu_opts_create_nofail(QemuOptsList *list)
-{
-    QemuOpts *opts;
-    Error *errp = NULL;
-    opts = qemu_opts_create(list, NULL, 0, &errp);
-    assert_no_error(errp);
-    return opts;
-}
-
 void qemu_opts_reset(QemuOptsList *list)
 {
     QemuOpts *opts, *next_opts;
diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 6b97dc1..8818d7c 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -578,7 +578,7 @@ int inet_listen(const char *str, char *ostr, int olen,
 
     addr = inet_parse(str, errp);
     if (addr != NULL) {
-        opts = qemu_opts_create_nofail(&socket_optslist);
+        opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
         inet_addr_to_opts(opts, addr);
         qapi_free_InetSocketAddress(addr);
         sock = inet_listen_opts(opts, port_offset, errp);
@@ -617,7 +617,7 @@ int inet_connect(const char *str, Error **errp)
 
     addr = inet_parse(str, errp);
     if (addr != NULL) {
-        opts = qemu_opts_create_nofail(&socket_optslist);
+        opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
         inet_addr_to_opts(opts, addr);
         qapi_free_InetSocketAddress(addr);
         sock = inet_connect_opts(opts, errp, NULL, NULL);
@@ -651,7 +651,7 @@ int inet_nonblocking_connect(const char *str,
 
     addr = inet_parse(str, errp);
     if (addr != NULL) {
-        opts = qemu_opts_create_nofail(&socket_optslist);
+        opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
         inet_addr_to_opts(opts, addr);
         qapi_free_InetSocketAddress(addr);
         sock = inet_connect_opts(opts, errp, callback, opaque);
@@ -794,7 +794,7 @@ int unix_listen(const char *str, char *ostr, int olen, Error **errp)
     char *path, *optstr;
     int sock, len;
 
-    opts = qemu_opts_create_nofail(&socket_optslist);
+    opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
 
     optstr = strchr(str, ',');
     if (optstr) {
@@ -822,7 +822,7 @@ int unix_connect(const char *path, Error **errp)
     QemuOpts *opts;
     int sock;
 
-    opts = qemu_opts_create_nofail(&socket_optslist);
+    opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
     qemu_opt_set(opts, "path", path);
     sock = unix_connect_opts(opts, errp, NULL, NULL);
     qemu_opts_del(opts);
@@ -839,7 +839,7 @@ int unix_nonblocking_connect(const char *path,
 
     g_assert(callback != NULL);
 
-    opts = qemu_opts_create_nofail(&socket_optslist);
+    opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
     qemu_opt_set(opts, "path", path);
     sock = unix_connect_opts(opts, errp, callback, opaque);
     qemu_opts_del(opts);
@@ -889,7 +889,7 @@ int socket_connect(SocketAddress *addr, Error **errp,
     QemuOpts *opts;
     int fd;
 
-    opts = qemu_opts_create_nofail(&socket_optslist);
+    opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
     switch (addr->kind) {
     case SOCKET_ADDRESS_KIND_INET:
         inet_addr_to_opts(opts, addr->inet);
@@ -921,7 +921,7 @@ int socket_listen(SocketAddress *addr, Error **errp)
     QemuOpts *opts;
     int fd;
 
-    opts = qemu_opts_create_nofail(&socket_optslist);
+    opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
     switch (addr->kind) {
     case SOCKET_ADDRESS_KIND_INET:
         inet_addr_to_opts(opts, addr->inet);
@@ -949,7 +949,7 @@ int socket_dgram(SocketAddress *remote, SocketAddress *local, Error **errp)
     QemuOpts *opts;
     int fd;
 
-    opts = qemu_opts_create_nofail(&socket_optslist);
+    opts = qemu_opts_create(&socket_optslist, NULL, 0, &error_abort);
     switch (remote->kind) {
     case SOCKET_ADDRESS_KIND_INET:
         qemu_opt_set(opts, "host", remote->inet->host);
diff --git a/vl.c b/vl.c
index 10e6c0e..1f189d3 100644
--- a/vl.c
+++ b/vl.c
@@ -545,7 +545,7 @@ QemuOpts *qemu_get_machine_opts(void)
     assert(list);
     opts = qemu_opts_find(list, NULL);
     if (!opts) {
-        opts = qemu_opts_create_nofail(list);
+        opts = qemu_opts_create(list, NULL, 0, &error_abort);
     }
     return opts;
 }
@@ -2255,7 +2255,8 @@ static int balloon_parse(const char *arg)
                 return  -1;
         } else {
             /* create empty opts */
-            opts = qemu_opts_create_nofail(qemu_find_opts("device"));
+            opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
+                                    &error_abort);
         }
         qemu_opt_set(opts, "driver", "virtio-balloon");
         return 0;
@@ -2515,14 +2516,14 @@ static int virtcon_parse(const char *devname)
         exit(1);
     }
 
-    bus_opts = qemu_opts_create_nofail(device);
+    bus_opts = qemu_opts_create(device, NULL, 0, &error_abort);
     if (arch_type == QEMU_ARCH_S390X) {
         qemu_opt_set(bus_opts, "driver", "virtio-serial-s390");
     } else {
         qemu_opt_set(bus_opts, "driver", "virtio-serial-pci");
     }
 
-    dev_opts = qemu_opts_create_nofail(device);
+    dev_opts = qemu_opts_create(device, NULL, 0, &error_abort);
     qemu_opt_set(dev_opts, "driver", "virtconsole");
 
     snprintf(label, sizeof(label), "virtcon%d", index);
@@ -3381,7 +3382,8 @@ int main(int argc, char **argv, char **envp)
 
                 qemu_opt_set_bool(fsdev, "readonly",
                                 qemu_opt_get_bool(opts, "readonly", 0));
-                device = qemu_opts_create_nofail(qemu_find_opts("device"));
+                device = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
+                                          &error_abort);
                 qemu_opt_set(device, "driver", "virtio-9p-pci");
                 qemu_opt_set(device, "fsdev",
                              qemu_opt_get(opts, "mount_tag"));
@@ -3401,7 +3403,8 @@ int main(int argc, char **argv, char **envp)
                 }
                 qemu_opt_set(fsdev, "fsdriver", "synth");
 
-                device = qemu_opts_create_nofail(qemu_find_opts("device"));
+                device = qemu_opts_create(qemu_find_opts("device"), NULL, 0,
+                                          &error_abort);
                 qemu_opt_set(device, "driver", "virtio-9p-pci");
                 qemu_opt_set(device, "fsdev", "v_synth");
                 qemu_opt_set(device, "mount_tag", "v_synth");
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 07/13] qerror: Remove assert_no_error()
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (5 preceding siblings ...)
  2013-12-18 16:59 ` [Qemu-devel] [PULL 06/13] qemu-option: Remove qemu_opts_create_nofail Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 08/13] rng: initialize file descriptor to -1 Luiz Capitulino
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

This is no longer needed, and is obsoleted by error_abort. Remove.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 include/qapi/qmp/qerror.h | 1 -
 qobject/qerror.c          | 8 --------
 2 files changed, 9 deletions(-)

diff --git a/include/qapi/qmp/qerror.h b/include/qapi/qmp/qerror.h
index c30c2f6..73c67b7 100644
--- a/include/qapi/qmp/qerror.h
+++ b/include/qapi/qmp/qerror.h
@@ -29,7 +29,6 @@ typedef struct QError {
 QString *qerror_human(const QError *qerror);
 void qerror_report(ErrorClass err_class, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
 void qerror_report_err(Error *err);
-void assert_no_error(Error *err);
 
 /*
  * QError class list
diff --git a/qobject/qerror.c b/qobject/qerror.c
index fc8331a..e3608e2 100644
--- a/qobject/qerror.c
+++ b/qobject/qerror.c
@@ -121,14 +121,6 @@ void qerror_report_err(Error *err)
     }
 }
 
-void assert_no_error(Error *err)
-{
-    if (err) {
-        qerror_report_err(err);
-        abort();
-    }
-}
-
 /**
  * qobject_to_qerror(): Convert a QObject into a QError
  */
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 08/13] rng: initialize file descriptor to -1
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (6 preceding siblings ...)
  2013-12-18 16:59 ` [Qemu-devel] [PULL 07/13] qerror: Remove assert_no_error() Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 16:59 ` [Qemu-devel] [PULL 09/13] qom: fix leak for objects created with -object Luiz Capitulino
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Paolo Bonzini <pbonzini@redhat.com>

The file descriptor is never initialized to -1, which makes rng-random
close stdin if an object is created and immediately destroyed.  If we
change it to -1, we also need to protect qemu_set_fd_handler from
receiving a bogus file descriptor.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-By: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 backends/rng-random.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/backends/rng-random.c b/backends/rng-random.c
index 68dfc8a..136499d 100644
--- a/backends/rng-random.c
+++ b/backends/rng-random.c
@@ -123,15 +123,15 @@ static void rng_random_init(Object *obj)
                             NULL);
 
     s->filename = g_strdup("/dev/random");
+    s->fd = -1;
 }
 
 static void rng_random_finalize(Object *obj)
 {
     RndRandom *s = RNG_RANDOM(obj);
 
-    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
-
     if (s->fd != -1) {
+        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
         qemu_close(s->fd);
     }
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 09/13] qom: fix leak for objects created with -object
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (7 preceding siblings ...)
  2013-12-18 16:59 ` [Qemu-devel] [PULL 08/13] rng: initialize file descriptor to -1 Luiz Capitulino
@ 2013-12-18 16:59 ` Luiz Capitulino
  2013-12-18 17:00 ` [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child Luiz Capitulino
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 16:59 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Paolo Bonzini <pbonzini@redhat.com>

The object must be unref-ed when its variable goes out of scope.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-By: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 vl.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/vl.c b/vl.c
index 1f189d3..fcf2cc3 100644
--- a/vl.c
+++ b/vl.c
@@ -2811,12 +2811,13 @@ static int object_create(QemuOpts *opts, void *opaque)
 
     obj = object_new(type);
     if (qemu_opt_foreach(opts, object_set_property, obj, 1) < 0) {
+        object_unref(obj);
         return -1;
     }
 
     object_property_add_child(container_get(object_get_root(), "/objects"),
                               id, obj, NULL);
-
+    object_unref(obj);
     return 0;
 }
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (8 preceding siblings ...)
  2013-12-18 16:59 ` [Qemu-devel] [PULL 09/13] qom: fix leak for objects created with -object Luiz Capitulino
@ 2013-12-18 17:00 ` Luiz Capitulino
  2013-12-18 19:09   ` Andreas Färber
  2013-12-20  2:27   ` Peter Crosthwaite
  2013-12-18 17:00 ` [Qemu-devel] [PULL 11/13] monitor: add object-add (QMP) and object_add (HMP) command Luiz Capitulino
                   ` (4 subsequent siblings)
  14 siblings, 2 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 17:00 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Paolo Bonzini <pbonzini@redhat.com>

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-By: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 qom/object.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/qom/object.c b/qom/object.c
index fc19cf6..68fe07a 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -988,17 +988,22 @@ static void object_finalize_child_property(Object *obj, const char *name,
 void object_property_add_child(Object *obj, const char *name,
                                Object *child, Error **errp)
 {
+    Error *local_err = NULL;
     gchar *type;
 
     type = g_strdup_printf("child<%s>", object_get_typename(OBJECT(child)));
 
     object_property_add(obj, name, type, object_get_child_property,
-                        NULL, object_finalize_child_property, child, errp);
-
+                        NULL, object_finalize_child_property, child, &local_err);
+    if (error_is_set(&local_err)) {
+        error_propagate(errp, local_err);
+        goto out;
+    }
     object_ref(child);
     g_assert(child->parent == NULL);
     child->parent = obj;
 
+out:
     g_free(type);
 }
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 11/13] monitor: add object-add (QMP) and object_add (HMP) command
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (9 preceding siblings ...)
  2013-12-18 17:00 ` [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child Luiz Capitulino
@ 2013-12-18 17:00 ` Luiz Capitulino
  2013-12-20  2:15   ` Peter Crosthwaite
  2013-12-18 17:00 ` [Qemu-devel] [PULL 12/13] monitor: add object-del (QMP) and object_del " Luiz Capitulino
                   ` (3 subsequent siblings)
  14 siblings, 1 reply; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 17:00 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Paolo Bonzini <pbonzini@redhat.com>

Add two commands that are the monitor counterparts of -object.  The commands
have the same Visitor-based implementation, but use different kinds of
visitors so that the HMP command has a DWIM string-based syntax, while
the QMP variant accepts a stricter JSON-based properties dictionary.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-By: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 hmp-commands.hx           | 14 +++++++++++
 hmp.c                     | 58 ++++++++++++++++++++++++++++++++++++++++++++
 hmp.h                     |  1 +
 include/monitor/monitor.h |  3 +++
 include/qapi/visitor.h    |  3 +--
 include/qemu/typedefs.h   |  2 ++
 qapi-schema.json          | 20 +++++++++++++++
 qmp-commands.hx           | 27 +++++++++++++++++++++
 qmp.c                     | 62 +++++++++++++++++++++++++++++++++++++++++++++++
 9 files changed, 188 insertions(+), 2 deletions(-)

diff --git a/hmp-commands.hx b/hmp-commands.hx
index ebe8e78..2951d1e 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1243,6 +1243,20 @@ STEXI
 Remove host network device.
 ETEXI
 
+    {
+        .name       = "object_add",
+        .args_type  = "object:O",
+        .params     = "[qom-type=]type,id=str[,prop=value][,...]",
+        .help       = "create QOM object",
+        .mhandler.cmd = hmp_object_add,
+    },
+
+STEXI
+@item object_add
+@findex object_add
+Create QOM object.
+ETEXI
+
 #ifdef CONFIG_SLIRP
     {
         .name       = "hostfwd_add",
diff --git a/hmp.c b/hmp.c
index 32ee285..a1669ab 100644
--- a/hmp.c
+++ b/hmp.c
@@ -21,6 +21,7 @@
 #include "qmp-commands.h"
 #include "qemu/sockets.h"
 #include "monitor/monitor.h"
+#include "qapi/opts-visitor.h"
 #include "ui/console.h"
 #include "block/qapi.h"
 #include "qemu-io.h"
@@ -1354,6 +1355,63 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, &err);
 }
 
+void hmp_object_add(Monitor *mon, const QDict *qdict)
+{
+    Error *err = NULL;
+    QemuOpts *opts;
+    char *type = NULL;
+    char *id = NULL;
+    void *dummy = NULL;
+    OptsVisitor *ov;
+    QDict *pdict;
+
+    opts = qemu_opts_from_qdict(qemu_find_opts("object"), qdict, &err);
+    if (error_is_set(&err)) {
+        goto out;
+    }
+
+    ov = opts_visitor_new(opts);
+    pdict = qdict_clone_shallow(qdict);
+
+    visit_start_struct(opts_get_visitor(ov), &dummy, NULL, NULL, 0, &err);
+    if (error_is_set(&err)) {
+        goto out_clean;
+    }
+
+    qdict_del(pdict, "qom-type");
+    visit_type_str(opts_get_visitor(ov), &type, "qom-type", &err);
+    if (error_is_set(&err)) {
+        goto out_clean;
+    }
+
+    qdict_del(pdict, "id");
+    visit_type_str(opts_get_visitor(ov), &id, "id", &err);
+    if (error_is_set(&err)) {
+        goto out_clean;
+    }
+
+    object_add(type, id, pdict, opts_get_visitor(ov), &err);
+    if (error_is_set(&err)) {
+        goto out_clean;
+    }
+    visit_end_struct(opts_get_visitor(ov), &err);
+    if (error_is_set(&err)) {
+        qmp_object_del(id, NULL);
+    }
+
+out_clean:
+    opts_visitor_cleanup(ov);
+
+    QDECREF(pdict);
+    qemu_opts_del(opts);
+    g_free(id);
+    g_free(type);
+    g_free(dummy);
+
+out:
+    hmp_handle_error(mon, &err);
+}
+
 void hmp_getfd(Monitor *mon, const QDict *qdict)
 {
     const char *fdname = qdict_get_str(qdict, "fdname");
diff --git a/hmp.h b/hmp.h
index 54cf71f..521449b 100644
--- a/hmp.h
+++ b/hmp.h
@@ -89,5 +89,6 @@ void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict);
 void hmp_chardev_add(Monitor *mon, const QDict *qdict);
 void hmp_chardev_remove(Monitor *mon, const QDict *qdict);
 void hmp_qemu_io(Monitor *mon, const QDict *qdict);
+void hmp_object_add(Monitor *mon, const QDict *qdict);
 
 #endif
diff --git a/include/monitor/monitor.h b/include/monitor/monitor.h
index 10fa0e3..22d8b8f 100644
--- a/include/monitor/monitor.h
+++ b/include/monitor/monitor.h
@@ -93,6 +93,9 @@ int monitor_read_password(Monitor *mon, ReadLineFunc *readline_func,
 int qmp_qom_set(Monitor *mon, const QDict *qdict, QObject **ret);
 
 int qmp_qom_get(Monitor *mon, const QDict *qdict, QObject **ret);
+int qmp_object_add(Monitor *mon, const QDict *qdict, QObject **ret);
+void object_add(const char *type, const char *id, const QDict *qdict,
+                Visitor *v, Error **errp);
 
 AddfdInfo *monitor_fdset_add_fd(int fd, bool has_fdset_id, int64_t fdset_id,
                                 bool has_opaque, const char *opaque,
diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
index 48a2a2e..29da211 100644
--- a/include/qapi/visitor.h
+++ b/include/qapi/visitor.h
@@ -13,6 +13,7 @@
 #ifndef QAPI_VISITOR_CORE_H
 #define QAPI_VISITOR_CORE_H
 
+#include "qemu/typedefs.h"
 #include "qapi/qmp/qobject.h"
 #include "qapi/error.h"
 #include <stdlib.h>
@@ -26,8 +27,6 @@ typedef struct GenericList
     struct GenericList *next;
 } GenericList;
 
-typedef struct Visitor Visitor;
-
 void visit_start_handle(Visitor *v, void **obj, const char *kind,
                         const char *name, Error **errp);
 void visit_end_handle(Visitor *v, Error **errp);
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
index a4c1b84..4524496 100644
--- a/include/qemu/typedefs.h
+++ b/include/qemu/typedefs.h
@@ -10,6 +10,8 @@ typedef struct QEMUBH QEMUBH;
 
 typedef struct AioContext AioContext;
 
+typedef struct Visitor Visitor;
+
 struct Monitor;
 typedef struct Monitor Monitor;
 typedef struct MigrationParams MigrationParams;
diff --git a/qapi-schema.json b/qapi-schema.json
index d6f8615..451310b 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2759,6 +2759,26 @@
 { 'command': 'netdev_del', 'data': {'id': 'str'} }
 
 ##
+# @object-add:
+#
+# Create a QOM object.
+#
+# @qom-type: the class name for the object to be created
+#
+# @id: the name of the new object
+#
+# @props: #optional a dictionary of properties to be passed to the backend
+#
+# Returns: Nothing on success
+#          Error if @qom-type is not a valid class name
+#
+# Since: 2.0
+##
+{ 'command': 'object-add',
+  'data': {'qom-type': 'str', 'id': 'str', '*props': 'dict'},
+  'gen': 'no' }
+
+##
 # @NetdevNoneOptions
 #
 # Use it alone to have zero network devices.
diff --git a/qmp-commands.hx b/qmp-commands.hx
index fba15cd..d09ea53 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -879,6 +879,33 @@ Example:
 EQMP
 
     {
+        .name       = "object-add",
+        .args_type  = "qom-type:s,id:s,props:q?",
+        .mhandler.cmd_new = qmp_object_add,
+    },
+
+SQMP
+object-add
+----------
+
+Create QOM object.
+
+Arguments:
+
+- "qom-type": the object's QOM type, i.e. the class name (json-string)
+- "id": the object's ID, must be unique (json-string)
+- "props": a dictionary of object property values (optional, json-dict)
+
+Example:
+
+-> { "execute": "object-add", "arguments": { "qom-type": "rng-random", "id": "rng1",
+     "props": { "filename": "/dev/hwrng" } } }
+<- { "return": {} }
+
+EQMP
+
+
+    {
         .name       = "block_resize",
         .args_type  = "device:B,size:o",
         .mhandler.cmd_new = qmp_marshal_input_block_resize,
diff --git a/qmp.c b/qmp.c
index 4c149b3..580f5e6 100644
--- a/qmp.c
+++ b/qmp.c
@@ -24,6 +24,8 @@
 #include "hw/qdev.h"
 #include "sysemu/blockdev.h"
 #include "qom/qom-qobject.h"
+#include "qapi/qmp/qobject.h"
+#include "qapi/qmp-input-visitor.h"
 #include "hw/boards.h"
 
 NameInfo *qmp_query_name(Error **errp)
@@ -529,3 +531,63 @@ void qmp_add_client(const char *protocol, const char *fdname,
     error_setg(errp, "protocol '%s' is invalid", protocol);
     close(fd);
 }
+
+void object_add(const char *type, const char *id, const QDict *qdict,
+                Visitor *v, Error **errp)
+{
+    Object *obj;
+    const QDictEntry *e;
+    Error *local_err = NULL;
+
+    if (!object_class_by_name(type)) {
+        error_setg(errp, "invalid class name");
+        return;
+    }
+
+    obj = object_new(type);
+    if (qdict) {
+        for (e = qdict_first(qdict); e; e = qdict_next(qdict, e)) {
+            object_property_set(obj, v, e->key, &local_err);
+            if (error_is_set(&local_err)) {
+                error_propagate(errp, local_err);
+                object_unref(obj);
+                return;
+            }
+        }
+    }
+
+    object_property_add_child(container_get(object_get_root(), "/objects"),
+                              id, obj, errp);
+    object_unref(obj);
+}
+
+int qmp_object_add(Monitor *mon, const QDict *qdict, QObject **ret)
+{
+    const char *type = qdict_get_str(qdict, "qom-type");
+    const char *id = qdict_get_str(qdict, "id");
+    QObject *props = qdict_get(qdict, "props");
+    const QDict *pdict = NULL;
+    Error *local_err = NULL;
+    QmpInputVisitor *qiv;
+
+    if (props) {
+        pdict = qobject_to_qdict(props);
+        if (!pdict) {
+            error_set(&local_err, QERR_INVALID_PARAMETER_TYPE, "props", "dict");
+            goto out;
+        }
+    }
+
+    qiv = qmp_input_visitor_new(props);
+    object_add(type, id, pdict, qmp_input_get_visitor(qiv), &local_err);
+    qmp_input_visitor_cleanup(qiv);
+
+out:
+    if (local_err) {
+        qerror_report_err(local_err);
+        error_free(local_err);
+        return -1;
+    }
+
+    return 0;
+}
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 12/13] monitor: add object-del (QMP) and object_del (HMP) command
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (10 preceding siblings ...)
  2013-12-18 17:00 ` [Qemu-devel] [PULL 11/13] monitor: add object-add (QMP) and object_add (HMP) command Luiz Capitulino
@ 2013-12-18 17:00 ` Luiz Capitulino
  2013-12-18 17:00 ` [Qemu-devel] [PULL 13/13] qemu-monitor: HMP cpu-add wrapper Luiz Capitulino
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 17:00 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: Paolo Bonzini <pbonzini@redhat.com>

These two commands invoke the "unparent" method of Object.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-By: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 hmp-commands.hx  | 14 ++++++++++++++
 hmp.c            |  9 +++++++++
 hmp.h            |  1 +
 qapi-schema.json | 14 ++++++++++++++
 qmp-commands.hx  | 24 ++++++++++++++++++++++++
 qmp.c            | 13 +++++++++++++
 6 files changed, 75 insertions(+)

diff --git a/hmp-commands.hx b/hmp-commands.hx
index 2951d1e..0ace14f 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1257,6 +1257,20 @@ STEXI
 Create QOM object.
 ETEXI
 
+    {
+        .name       = "object_del",
+        .args_type  = "id:s",
+        .params     = "id",
+        .help       = "destroy QOM object",
+        .mhandler.cmd = hmp_object_del,
+    },
+
+STEXI
+@item object_del
+@findex object_del
+Destroy QOM object.
+ETEXI
+
 #ifdef CONFIG_SLIRP
     {
         .name       = "hostfwd_add",
diff --git a/hmp.c b/hmp.c
index a1669ab..9f4c9b3 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1622,3 +1622,12 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict)
 
     hmp_handle_error(mon, &err);
 }
+
+void hmp_object_del(Monitor *mon, const QDict *qdict)
+{
+    const char *id = qdict_get_str(qdict, "id");
+    Error *err = NULL;
+
+    qmp_object_del(id, &err);
+    hmp_handle_error(mon, &err);
+}
diff --git a/hmp.h b/hmp.h
index 521449b..94264d6 100644
--- a/hmp.h
+++ b/hmp.h
@@ -90,5 +90,6 @@ void hmp_chardev_add(Monitor *mon, const QDict *qdict);
 void hmp_chardev_remove(Monitor *mon, const QDict *qdict);
 void hmp_qemu_io(Monitor *mon, const QDict *qdict);
 void hmp_object_add(Monitor *mon, const QDict *qdict);
+void hmp_object_del(Monitor *mon, const QDict *qdict);
 
 #endif
diff --git a/qapi-schema.json b/qapi-schema.json
index 451310b..4b9a34e 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2779,6 +2779,20 @@
   'gen': 'no' }
 
 ##
+# @object-del:
+#
+# Remove a QOM object.
+#
+# @id: the name of the QOM object to remove
+#
+# Returns: Nothing on success
+#          Error if @id is not a valid id for a QOM object
+#
+# Since: 2.0
+##
+{ 'command': 'object-del', 'data': {'id': 'str'} }
+
+##
 # @NetdevNoneOptions
 #
 # Use it alone to have zero network devices.
diff --git a/qmp-commands.hx b/qmp-commands.hx
index d09ea53..02cc815 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -904,6 +904,30 @@ Example:
 
 EQMP
 
+    {
+        .name       = "object-del",
+        .args_type  = "id:s",
+        .mhandler.cmd_new = qmp_marshal_input_object_del,
+    },
+
+SQMP
+object-del
+----------
+
+Remove QOM object.
+
+Arguments:
+
+- "id": the object's ID (json-string)
+
+Example:
+
+-> { "execute": "object-del", "arguments": { "id": "rng1" } }
+<- { "return": {} }
+
+
+EQMP
+
 
     {
         .name       = "block_resize",
diff --git a/qmp.c b/qmp.c
index 580f5e6..b662217 100644
--- a/qmp.c
+++ b/qmp.c
@@ -591,3 +591,16 @@ out:
 
     return 0;
 }
+
+void qmp_object_del(const char *id, Error **errp)
+{
+    Object *obj;
+
+    obj = object_resolve_path_component(container_get(object_get_root(), "/objects"),
+                                        id);
+    if (!obj) {
+        error_setg(errp, "object id not found");
+        return;
+    }
+    object_unparent(obj);
+}
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [Qemu-devel] [PULL 13/13] qemu-monitor: HMP cpu-add wrapper
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (11 preceding siblings ...)
  2013-12-18 17:00 ` [Qemu-devel] [PULL 12/13] monitor: add object-del (QMP) and object_del " Luiz Capitulino
@ 2013-12-18 17:00 ` Luiz Capitulino
  2013-12-20  0:32 ` [Qemu-devel] [PULL 00/13] QMP queue Peter Maydell
  2013-12-20  0:49 ` Anthony Liguori
  14 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 17:00 UTC (permalink / raw)
  To: anthony; +Cc: qemu-devel

From: "Jason J. Herne" <jjherne@us.ibm.com>

Add HMP cpu-add wrapper to allow cpu hot plugging via monitor.

Signed-off-by: Jason J. Herne <jjherne@us.ibm.com>
Reviewed-By: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
---
 hmp-commands.hx | 13 +++++++++++++
 hmp.c           | 10 ++++++++++
 hmp.h           |  1 +
 3 files changed, 24 insertions(+)

diff --git a/hmp-commands.hx b/hmp-commands.hx
index 0ace14f..feca084 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1648,6 +1648,19 @@ Executes a qemu-io command on the given block device.
 ETEXI
 
     {
+        .name       = "cpu-add",
+        .args_type  = "id:i",
+        .params     = "id",
+        .help       = "add cpu",
+        .mhandler.cmd  = hmp_cpu_add,
+    },
+
+STEXI
+@item cpu-add @var{id}
+Add CPU with id @var{id}
+ETEXI
+
+    {
         .name       = "info",
         .args_type  = "item:s?",
         .params     = "[subcommand]",
diff --git a/hmp.c b/hmp.c
index 9f4c9b3..e86c237 100644
--- a/hmp.c
+++ b/hmp.c
@@ -1583,6 +1583,16 @@ void hmp_nbd_server_stop(Monitor *mon, const QDict *qdict)
     hmp_handle_error(mon, &errp);
 }
 
+void hmp_cpu_add(Monitor *mon, const QDict *qdict)
+{
+    int cpuid;
+    Error *err = NULL;
+
+    cpuid = qdict_get_int(qdict, "id");
+    qmp_cpu_add(cpuid, &err);
+    hmp_handle_error(mon, &err);
+}
+
 void hmp_chardev_add(Monitor *mon, const QDict *qdict)
 {
     const char *args = qdict_get_str(qdict, "args");
diff --git a/hmp.h b/hmp.h
index 94264d6..a91aed5 100644
--- a/hmp.h
+++ b/hmp.h
@@ -91,5 +91,6 @@ void hmp_chardev_remove(Monitor *mon, const QDict *qdict);
 void hmp_qemu_io(Monitor *mon, const QDict *qdict);
 void hmp_object_add(Monitor *mon, const QDict *qdict);
 void hmp_object_del(Monitor *mon, const QDict *qdict);
+void hmp_cpu_add(Monitor *mon, const QDict *qdict);
 
 #endif
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child
  2013-12-18 17:00 ` [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child Luiz Capitulino
@ 2013-12-18 19:09   ` Andreas Färber
  2013-12-18 19:58     ` Markus Armbruster
  2013-12-18 22:17     ` Luiz Capitulino
  2013-12-20  2:27   ` Peter Crosthwaite
  1 sibling, 2 replies; 25+ messages in thread
From: Andreas Färber @ 2013-12-18 19:09 UTC (permalink / raw)
  To: Luiz Capitulino, Paolo Bonzini; +Cc: Igor Mammedov, qemu-devel, anthony

Am 18.12.2013 18:00, schrieb Luiz Capitulino:
> From: Paolo Bonzini <pbonzini@redhat.com>
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> Reviewed-By: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
>  qom/object.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/qom/object.c b/qom/object.c
> index fc19cf6..68fe07a 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -988,17 +988,22 @@ static void object_finalize_child_property(Object *obj, const char *name,
>  void object_property_add_child(Object *obj, const char *name,
>                                 Object *child, Error **errp)
>  {
> +    Error *local_err = NULL;
>      gchar *type;
>  
>      type = g_strdup_printf("child<%s>", object_get_typename(OBJECT(child)));
>  
>      object_property_add(obj, name, type, object_get_child_property,
> -                        NULL, object_finalize_child_property, child, errp);
> -
> +                        NULL, object_finalize_child_property, child, &local_err);
> +    if (error_is_set(&local_err)) {

I've been told we shouldn't error_is_set() that way but instead write:
if (local_err) {

No need to respin, but giving me a chance to ack this QOM patch would've
been nice.

Andreas

> +        error_propagate(errp, local_err);
> +        goto out;
> +    }
>      object_ref(child);
>      g_assert(child->parent == NULL);
>      child->parent = obj;
>  
> +out:
>      g_free(type);
>  }
>  
> 


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child
  2013-12-18 19:09   ` Andreas Färber
@ 2013-12-18 19:58     ` Markus Armbruster
  2013-12-18 22:17     ` Luiz Capitulino
  1 sibling, 0 replies; 25+ messages in thread
From: Markus Armbruster @ 2013-12-18 19:58 UTC (permalink / raw)
  To: Andreas Färber
  Cc: Paolo Bonzini, Igor Mammedov, qemu-devel, anthony,
	Luiz Capitulino

Andreas Färber <afaerber@suse.de> writes:

> Am 18.12.2013 18:00, schrieb Luiz Capitulino:
>> From: Paolo Bonzini <pbonzini@redhat.com>
>> 
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>> Reviewed-By: Igor Mammedov <imammedo@redhat.com>
>> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
>> ---
>>  qom/object.c | 9 +++++++--
>>  1 file changed, 7 insertions(+), 2 deletions(-)
>> 
>> diff --git a/qom/object.c b/qom/object.c
>> index fc19cf6..68fe07a 100644
>> --- a/qom/object.c
>> +++ b/qom/object.c
>> @@ -988,17 +988,22 @@ static void object_finalize_child_property(Object *obj, const char *name,
>>  void object_property_add_child(Object *obj, const char *name,
>>                                 Object *child, Error **errp)
>>  {
>> +    Error *local_err = NULL;
>>      gchar *type;
>>  
>>      type = g_strdup_printf("child<%s>", object_get_typename(OBJECT(child)));
>>  
>>      object_property_add(obj, name, type, object_get_child_property,
>> -                        NULL, object_finalize_child_property, child, errp);
>> -
>> +                        NULL, object_finalize_child_property, child, &local_err);
>> +    if (error_is_set(&local_err)) {
>
> I've been told we shouldn't error_is_set() that way but instead write:
> if (local_err) {

"if (local_err)" is immediately obvious.

"if (error_is_set(&local_err))" isn't.  But it's consistent with places
where you do "if (error_is_set(errp))", where errp may be null, for
whatever that's worth.

Obvious is preferable.  Anyway, hardly a NAK-worthy crime.

[...]

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child
  2013-12-18 19:09   ` Andreas Färber
  2013-12-18 19:58     ` Markus Armbruster
@ 2013-12-18 22:17     ` Luiz Capitulino
  1 sibling, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-18 22:17 UTC (permalink / raw)
  To: Andreas Färber; +Cc: Paolo Bonzini, qemu-devel, anthony, Igor Mammedov

On Wed, 18 Dec 2013 20:09:03 +0100
Andreas Färber <afaerber@suse.de> wrote:

> Am 18.12.2013 18:00, schrieb Luiz Capitulino:
> > From: Paolo Bonzini <pbonzini@redhat.com>
> > 
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > Reviewed-By: Igor Mammedov <imammedo@redhat.com>
> > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> > ---
> >  qom/object.c | 9 +++++++--
> >  1 file changed, 7 insertions(+), 2 deletions(-)
> > 
> > diff --git a/qom/object.c b/qom/object.c
> > index fc19cf6..68fe07a 100644
> > --- a/qom/object.c
> > +++ b/qom/object.c
> > @@ -988,17 +988,22 @@ static void object_finalize_child_property(Object *obj, const char *name,
> >  void object_property_add_child(Object *obj, const char *name,
> >                                 Object *child, Error **errp)
> >  {
> > +    Error *local_err = NULL;
> >      gchar *type;
> >  
> >      type = g_strdup_printf("child<%s>", object_get_typename(OBJECT(child)));
> >  
> >      object_property_add(obj, name, type, object_get_child_property,
> > -                        NULL, object_finalize_child_property, child, errp);
> > -
> > +                        NULL, object_finalize_child_property, child, &local_err);
> > +    if (error_is_set(&local_err)) {
> 
> I've been told we shouldn't error_is_set() that way but instead write:
> if (local_err) {

We've talked about adopting an idiom, and the general consensus seems
to be checking the error pointer straight is better than calling
error_is_set(). I'm OK with both ways and didn't consider rejecting
a patch because of that.

> No need to respin, but giving me a chance to ack this QOM patch would've
> been nice.

Oh, sorry for that. As I was preparing a pull request and as this
series got two Reviewed-bys (mine and Igor's) I just included it.

> 
> Andreas
> 
> > +        error_propagate(errp, local_err);
> > +        goto out;
> > +    }
> >      object_ref(child);
> >      g_assert(child->parent == NULL);
> >      child->parent = obj;
> >  
> > +out:
> >      g_free(type);
> >  }
> >  
> > 
> 
> 

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 00/13] QMP queue
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (12 preceding siblings ...)
  2013-12-18 17:00 ` [Qemu-devel] [PULL 13/13] qemu-monitor: HMP cpu-add wrapper Luiz Capitulino
@ 2013-12-20  0:32 ` Peter Maydell
  2013-12-20  0:44   ` Li Guang
  2013-12-20  0:49 ` Anthony Liguori
  14 siblings, 1 reply; 25+ messages in thread
From: Peter Maydell @ 2013-12-20  0:32 UTC (permalink / raw)
  To: Luiz Capitulino, Peter Crosthwaite; +Cc: QEMU Developers, Anthony Liguori

On 18 December 2013 16:59, Luiz Capitulino <lcapitulino@redhat.com> wrote:
>       qerror: Remove assert_no_error()

This broke my target-arm pullreq :-(

-- PMM

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 00/13] QMP queue
  2013-12-20  0:32 ` [Qemu-devel] [PULL 00/13] QMP queue Peter Maydell
@ 2013-12-20  0:44   ` Li Guang
  0 siblings, 0 replies; 25+ messages in thread
From: Li Guang @ 2013-12-20  0:44 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Peter Crosthwaite, QEMU Developers, Anthony Liguori,
	Luiz Capitulino

Peter Maydell wrote:
> On 18 December 2013 16:59, Luiz Capitulino<lcapitulino@redhat.com>  wrote:
>    
>>        qerror: Remove assert_no_error()
>>      
> This broke my target-arm pullreq :-(
>    

Yes, QMP queue and qemu-arm queue will conflict,
because patch "target-arm/cpu: Convert reset CBAR to a property"
used assert_no_error, and here, assert_no_error removed.
> -- PMM
>
>
>    

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 00/13] QMP queue
  2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
                   ` (13 preceding siblings ...)
  2013-12-20  0:32 ` [Qemu-devel] [PULL 00/13] QMP queue Peter Maydell
@ 2013-12-20  0:49 ` Anthony Liguori
  2013-12-20  4:00   ` Peter Crosthwaite
  14 siblings, 1 reply; 25+ messages in thread
From: Anthony Liguori @ 2013-12-20  0:49 UTC (permalink / raw)
  To: Luiz Capitulino; +Cc: qemu-devel

On Wed, Dec 18, 2013 at 8:59 AM, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> The following changes since commit e157b8fdd412d48eacfbb8c67d3d58780154faa3:
>
>   Merge remote-tracking branch 'bonzini/virtio' into staging (2013-12-13 11:10:33 -0800)
>
> are available in the git repository at:

Sorry, you lost the merge conflict to Peter.  Can you please rebase
and resubmit?

Regards,

Anthony Liguori

>
>
>   git://repo.or.cz/qemu/qmp-unstable.git queue/qmp
>
> for you to fetch changes up to 2e89b6d1cd378602f2c8ea982145213aededf0f2:
>
>   qemu-monitor: HMP cpu-add wrapper (2013-12-18 11:12:16 -0500)
>
> ----------------------------------------------------------------
> Jason J. Herne (1):
>       qemu-monitor: HMP cpu-add wrapper
>
> Paolo Bonzini (6):
>       vl: add missing transition debug->finish_migrate
>       rng: initialize file descriptor to -1
>       qom: fix leak for objects created with -object
>       qom: catch errors in object_property_add_child
>       monitor: add object-add (QMP) and object_add (HMP) command
>       monitor: add object-del (QMP) and object_del (HMP) command
>
> Peter Crosthwaite (6):
>       error: Add error_abort
>       hw/core/qdev: Delete dead code
>       hw: Remove assert_no_error usages
>       target-i386: Remove assert_no_error usage
>       qemu-option: Remove qemu_opts_create_nofail
>       qerror: Remove assert_no_error()
>
>  backends/rng-random.c            |  4 +--
>  block/blkdebug.c                 |  2 +-
>  block/blkverify.c                |  2 +-
>  block/curl.c                     |  2 +-
>  block/gluster.c                  |  2 +-
>  block/iscsi.c                    |  2 +-
>  block/nbd.c                      |  3 +-
>  block/qcow2.c                    |  2 +-
>  block/raw-posix.c                |  2 +-
>  block/raw-win32.c                |  5 +--
>  block/rbd.c                      |  2 +-
>  block/sheepdog.c                 |  2 +-
>  block/vvfat.c                    |  2 +-
>  blockdev.c                       |  6 ++--
>  hmp-commands.hx                  | 41 +++++++++++++++++++++
>  hmp.c                            | 77 ++++++++++++++++++++++++++++++++++++++++
>  hmp.h                            |  3 ++
>  hw/core/qdev-properties-system.c |  8 ++---
>  hw/core/qdev-properties.c        | 40 ++++++---------------
>  hw/core/qdev.c                   | 28 ++++-----------
>  hw/dma/xilinx_axidma.c           | 13 +++----
>  hw/net/xilinx_axienet.c          | 13 +++----
>  hw/watchdog/watchdog.c           |  3 +-
>  include/hw/xilinx.h              | 14 +++-----
>  include/monitor/monitor.h        |  3 ++
>  include/qapi/error.h             |  6 ++++
>  include/qapi/qmp/qerror.h        |  1 -
>  include/qapi/visitor.h           |  3 +-
>  include/qemu/option.h            |  1 -
>  include/qemu/typedefs.h          |  2 ++
>  qapi-schema.json                 | 34 ++++++++++++++++++
>  qdev-monitor.c                   |  2 +-
>  qemu-img.c                       |  2 +-
>  qmp-commands.hx                  | 51 ++++++++++++++++++++++++++
>  qmp.c                            | 75 ++++++++++++++++++++++++++++++++++++++
>  qobject/qerror.c                 |  8 -----
>  qom/object.c                     |  9 +++--
>  target-i386/cpu.c                |  4 +--
>  util/error.c                     | 22 +++++++++++-
>  util/qemu-config.c               |  2 +-
>  util/qemu-option.c               |  9 -----
>  util/qemu-sockets.c              | 18 +++++-----
>  vl.c                             | 19 ++++++----
>  43 files changed, 400 insertions(+), 149 deletions(-)
>
> --
> 1.8.1.4

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 11/13] monitor: add object-add (QMP) and object_add (HMP) command
  2013-12-18 17:00 ` [Qemu-devel] [PULL 11/13] monitor: add object-add (QMP) and object_add (HMP) command Luiz Capitulino
@ 2013-12-20  2:15   ` Peter Crosthwaite
  2013-12-20 13:33     ` Luiz Capitulino
  0 siblings, 1 reply; 25+ messages in thread
From: Peter Crosthwaite @ 2013-12-20  2:15 UTC (permalink / raw)
  To: Luiz Capitulino, Paolo Bonzini, Igor Mammedov
  Cc: qemu-devel@nongnu.org Developers, Anthony Liguori

On Thu, Dec 19, 2013 at 3:00 AM, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> From: Paolo Bonzini <pbonzini@redhat.com>
>
> Add two commands that are the monitor counterparts of -object.  The commands
> have the same Visitor-based implementation, but use different kinds of
> visitors so that the HMP command has a DWIM string-based syntax, while
> the QMP variant accepts a stricter JSON-based properties dictionary.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> Reviewed-By: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
>  hmp-commands.hx           | 14 +++++++++++
>  hmp.c                     | 58 ++++++++++++++++++++++++++++++++++++++++++++
>  hmp.h                     |  1 +
>  include/monitor/monitor.h |  3 +++
>  include/qapi/visitor.h    |  3 +--
>  include/qemu/typedefs.h   |  2 ++
>  qapi-schema.json          | 20 +++++++++++++++
>  qmp-commands.hx           | 27 +++++++++++++++++++++
>  qmp.c                     | 62 +++++++++++++++++++++++++++++++++++++++++++++++
>  9 files changed, 188 insertions(+), 2 deletions(-)
>
> diff --git a/hmp-commands.hx b/hmp-commands.hx
> index ebe8e78..2951d1e 100644
> --- a/hmp-commands.hx
> +++ b/hmp-commands.hx
> @@ -1243,6 +1243,20 @@ STEXI
>  Remove host network device.
>  ETEXI
>
> +    {
> +        .name       = "object_add",
> +        .args_type  = "object:O",
> +        .params     = "[qom-type=]type,id=str[,prop=value][,...]",
> +        .help       = "create QOM object",
> +        .mhandler.cmd = hmp_object_add,
> +    },
> +
> +STEXI
> +@item object_add
> +@findex object_add
> +Create QOM object.
> +ETEXI
> +
>  #ifdef CONFIG_SLIRP
>      {
>          .name       = "hostfwd_add",
> diff --git a/hmp.c b/hmp.c
> index 32ee285..a1669ab 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -21,6 +21,7 @@
>  #include "qmp-commands.h"
>  #include "qemu/sockets.h"
>  #include "monitor/monitor.h"
> +#include "qapi/opts-visitor.h"
>  #include "ui/console.h"
>  #include "block/qapi.h"
>  #include "qemu-io.h"
> @@ -1354,6 +1355,63 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdict)
>      hmp_handle_error(mon, &err);
>  }
>
> +void hmp_object_add(Monitor *mon, const QDict *qdict)
> +{
> +    Error *err = NULL;
> +    QemuOpts *opts;
> +    char *type = NULL;
> +    char *id = NULL;
> +    void *dummy = NULL;
> +    OptsVisitor *ov;
> +    QDict *pdict;
> +
> +    opts = qemu_opts_from_qdict(qemu_find_opts("object"), qdict, &err);
> +    if (error_is_set(&err)) {
> +        goto out;
> +    }
> +
> +    ov = opts_visitor_new(opts);
> +    pdict = qdict_clone_shallow(qdict);
> +
> +    visit_start_struct(opts_get_visitor(ov), &dummy, NULL, NULL, 0, &err);
> +    if (error_is_set(&err)) {
> +        goto out_clean;
> +    }
> +
> +    qdict_del(pdict, "qom-type");
> +    visit_type_str(opts_get_visitor(ov), &type, "qom-type", &err);
> +    if (error_is_set(&err)) {
> +        goto out_clean;
> +    }
> +
> +    qdict_del(pdict, "id");
> +    visit_type_str(opts_get_visitor(ov), &id, "id", &err);
> +    if (error_is_set(&err)) {
> +        goto out_clean;
> +    }
> +
> +    object_add(type, id, pdict, opts_get_visitor(ov), &err);
> +    if (error_is_set(&err)) {
> +        goto out_clean;
> +    }
> +    visit_end_struct(opts_get_visitor(ov), &err);
> +    if (error_is_set(&err)) {
> +        qmp_object_del(id, NULL);

This is not bisect-able as you add this function in the next commit:

  CC    audio/sdlaudio.o
  CC    audio/ossaudio.o
hmp.c: In function âhmp_object_addâ:
hmp.c:1399:9: error: implicit declaration of function âqmp_object_delâ
[-Werror=implicit-function-declaration]
hmp.c:1399:9: error: nested extern declaration of âqmp_object_delâ
[-Werror=nested-externs]
  CC    audio/wavcapture.o
cc1: all warnings being treated as errors

Regards,
Peter

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child
  2013-12-18 17:00 ` [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child Luiz Capitulino
  2013-12-18 19:09   ` Andreas Färber
@ 2013-12-20  2:27   ` Peter Crosthwaite
  1 sibling, 0 replies; 25+ messages in thread
From: Peter Crosthwaite @ 2013-12-20  2:27 UTC (permalink / raw)
  To: Luiz Capitulino; +Cc: qemu-devel@nongnu.org Developers, Anthony Liguori

On Thu, Dec 19, 2013 at 3:00 AM, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> From: Paolo Bonzini <pbonzini@redhat.com>
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> Reviewed-By: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> ---
>  qom/object.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/qom/object.c b/qom/object.c
> index fc19cf6..68fe07a 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -988,17 +988,22 @@ static void object_finalize_child_property(Object *obj, const char *name,
>  void object_property_add_child(Object *obj, const char *name,
>                                 Object *child, Error **errp)
>  {
> +    Error *local_err = NULL;
>      gchar *type;
>
>      type = g_strdup_printf("child<%s>", object_get_typename(OBJECT(child)));
>
>      object_property_add(obj, name, type, object_get_child_property,
> -                        NULL, object_finalize_child_property, child, errp);
> -
> +                        NULL, object_finalize_child_property, child, &local_err);

This long line causes a checkpatch failure.

Regards,
Peter

> +    if (error_is_set(&local_err)) {
> +        error_propagate(errp, local_err);
> +        goto out;
> +    }
>      object_ref(child);
>      g_assert(child->parent == NULL);
>      child->parent = obj;
>
> +out:
>      g_free(type);
>  }
>
> --
> 1.8.1.4
>
>

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 00/13] QMP queue
  2013-12-20  0:49 ` Anthony Liguori
@ 2013-12-20  4:00   ` Peter Crosthwaite
  2013-12-20 13:28     ` Luiz Capitulino
  0 siblings, 1 reply; 25+ messages in thread
From: Peter Crosthwaite @ 2013-12-20  4:00 UTC (permalink / raw)
  To: Anthony Liguori, Paolo Bonzini, Igor Mammedov; +Cc: qemu-devel, Luiz Capitulino

On Fri, Dec 20, 2013 at 10:49 AM, Anthony Liguori <anthony@codemonkey.ws> wrote:
> On Wed, Dec 18, 2013 at 8:59 AM, Luiz Capitulino <lcapitulino@redhat.com> wrote:
>> The following changes since commit e157b8fdd412d48eacfbb8c67d3d58780154faa3:
>>
>>   Merge remote-tracking branch 'bonzini/virtio' into staging (2013-12-13 11:10:33 -0800)
>>
>> are available in the git repository at:
>
> Sorry, you lost the merge conflict to Peter.  Can you please rebase
> and resubmit?
>

Sorry - this one is my fault.

> Regards,
>
> Anthony Liguori
>
>>
>>
>>   git://repo.or.cz/qemu/qmp-unstable.git queue/qmp
>>
>> for you to fetch changes up to 2e89b6d1cd378602f2c8ea982145213aededf0f2:
>>
>>   qemu-monitor: HMP cpu-add wrapper (2013-12-18 11:12:16 -0500)
>>
>> ----------------------------------------------------------------
>> Jason J. Herne (1):
>>       qemu-monitor: HMP cpu-add wrapper
>>
>> Paolo Bonzini (6):
>>       vl: add missing transition debug->finish_migrate
>>       rng: initialize file descriptor to -1
>>       qom: fix leak for objects created with -object
>>       qom: catch errors in object_property_add_child

This one had a checkpatch issue I discovered when I did a rebase.

>>       monitor: add object-add (QMP) and object_add (HMP) command

This introduced a compile bug ...

>>       monitor: add object-del (QMP) and object_del (HMP) command

... fixed later here. This patch also has a checkpatch (80+ LOC).

>>
>> Peter Crosthwaite (6):
>>       error: Add error_abort
>>       hw/core/qdev: Delete dead code
>>       hw: Remove assert_no_error usages
>>       target-i386: Remove assert_no_error usage
>>       qemu-option: Remove qemu_opts_create_nofail
>>       qerror: Remove assert_no_error()

And simply dropping this one patch resolves the conflict which i think
is the path of least resistance to getting a merge. Otherwise we need
an additional patch (or at least additional un-reviewed hunks).

So I have rebased luiz' queue with the droppage and
compile-tested/make-check'ed/checkpatch'ed each commit. I fixed the
checkpatch issues and squashed those two patches with the
bisectability issue . I SOBed it incase you are happy to just take it
informally from me, or Luiz could just grab from me for the resubmit:

git://github.com/Xilinx/qemu.git /pub/qmp-rebase-2013-20-12.1

Can post as series if needed.

I'll then follow up a short series that removes the new
assert_no_error usages introduced in target-arm along with this patch.

Regards,
Peter

>>
>>  backends/rng-random.c            |  4 +--
>>  block/blkdebug.c                 |  2 +-
>>  block/blkverify.c                |  2 +-
>>  block/curl.c                     |  2 +-
>>  block/gluster.c                  |  2 +-
>>  block/iscsi.c                    |  2 +-
>>  block/nbd.c                      |  3 +-
>>  block/qcow2.c                    |  2 +-
>>  block/raw-posix.c                |  2 +-
>>  block/raw-win32.c                |  5 +--
>>  block/rbd.c                      |  2 +-
>>  block/sheepdog.c                 |  2 +-
>>  block/vvfat.c                    |  2 +-
>>  blockdev.c                       |  6 ++--
>>  hmp-commands.hx                  | 41 +++++++++++++++++++++
>>  hmp.c                            | 77 ++++++++++++++++++++++++++++++++++++++++
>>  hmp.h                            |  3 ++
>>  hw/core/qdev-properties-system.c |  8 ++---
>>  hw/core/qdev-properties.c        | 40 ++++++---------------
>>  hw/core/qdev.c                   | 28 ++++-----------
>>  hw/dma/xilinx_axidma.c           | 13 +++----
>>  hw/net/xilinx_axienet.c          | 13 +++----
>>  hw/watchdog/watchdog.c           |  3 +-
>>  include/hw/xilinx.h              | 14 +++-----
>>  include/monitor/monitor.h        |  3 ++
>>  include/qapi/error.h             |  6 ++++
>>  include/qapi/qmp/qerror.h        |  1 -
>>  include/qapi/visitor.h           |  3 +-
>>  include/qemu/option.h            |  1 -
>>  include/qemu/typedefs.h          |  2 ++
>>  qapi-schema.json                 | 34 ++++++++++++++++++
>>  qdev-monitor.c                   |  2 +-
>>  qemu-img.c                       |  2 +-
>>  qmp-commands.hx                  | 51 ++++++++++++++++++++++++++
>>  qmp.c                            | 75 ++++++++++++++++++++++++++++++++++++++
>>  qobject/qerror.c                 |  8 -----
>>  qom/object.c                     |  9 +++--
>>  target-i386/cpu.c                |  4 +--
>>  util/error.c                     | 22 +++++++++++-
>>  util/qemu-config.c               |  2 +-
>>  util/qemu-option.c               |  9 -----
>>  util/qemu-sockets.c              | 18 +++++-----
>>  vl.c                             | 19 ++++++----
>>  43 files changed, 400 insertions(+), 149 deletions(-)
>>
>> --
>> 1.8.1.4
>

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 00/13] QMP queue
  2013-12-20  4:00   ` Peter Crosthwaite
@ 2013-12-20 13:28     ` Luiz Capitulino
  0 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-20 13:28 UTC (permalink / raw)
  To: Peter Crosthwaite
  Cc: Paolo Bonzini, qemu-devel, Anthony Liguori, Igor Mammedov

On Fri, 20 Dec 2013 14:00:21 +1000
Peter Crosthwaite <peter.crosthwaite@xilinx.com> wrote:

> On Fri, Dec 20, 2013 at 10:49 AM, Anthony Liguori <anthony@codemonkey.ws> wrote:
> > On Wed, Dec 18, 2013 at 8:59 AM, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> >> The following changes since commit e157b8fdd412d48eacfbb8c67d3d58780154faa3:
> >>
> >>   Merge remote-tracking branch 'bonzini/virtio' into staging (2013-12-13 11:10:33 -0800)
> >>
> >> are available in the git repository at:
> >
> > Sorry, you lost the merge conflict to Peter.  Can you please rebase
> > and resubmit?

Sure, no problem.

> Sorry - this one is my fault.

Peter, can you resend your series then?

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [Qemu-devel] [PULL 11/13] monitor: add object-add (QMP) and object_add (HMP) command
  2013-12-20  2:15   ` Peter Crosthwaite
@ 2013-12-20 13:33     ` Luiz Capitulino
  0 siblings, 0 replies; 25+ messages in thread
From: Luiz Capitulino @ 2013-12-20 13:33 UTC (permalink / raw)
  To: Peter Crosthwaite
  Cc: Paolo Bonzini, qemu-devel@nongnu.org Developers, Anthony Liguori,
	Igor Mammedov

On Fri, 20 Dec 2013 12:15:53 +1000
Peter Crosthwaite <peter.crosthwaite@xilinx.com> wrote:

> On Thu, Dec 19, 2013 at 3:00 AM, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> > From: Paolo Bonzini <pbonzini@redhat.com>
> >
> > Add two commands that are the monitor counterparts of -object.  The commands
> > have the same Visitor-based implementation, but use different kinds of
> > visitors so that the HMP command has a DWIM string-based syntax, while
> > the QMP variant accepts a stricter JSON-based properties dictionary.
> >
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > Reviewed-By: Igor Mammedov <imammedo@redhat.com>
> > Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
> > ---
> >  hmp-commands.hx           | 14 +++++++++++
> >  hmp.c                     | 58 ++++++++++++++++++++++++++++++++++++++++++++
> >  hmp.h                     |  1 +
> >  include/monitor/monitor.h |  3 +++
> >  include/qapi/visitor.h    |  3 +--
> >  include/qemu/typedefs.h   |  2 ++
> >  qapi-schema.json          | 20 +++++++++++++++
> >  qmp-commands.hx           | 27 +++++++++++++++++++++
> >  qmp.c                     | 62 +++++++++++++++++++++++++++++++++++++++++++++++
> >  9 files changed, 188 insertions(+), 2 deletions(-)
> >
> > diff --git a/hmp-commands.hx b/hmp-commands.hx
> > index ebe8e78..2951d1e 100644
> > --- a/hmp-commands.hx
> > +++ b/hmp-commands.hx
> > @@ -1243,6 +1243,20 @@ STEXI
> >  Remove host network device.
> >  ETEXI
> >
> > +    {
> > +        .name       = "object_add",
> > +        .args_type  = "object:O",
> > +        .params     = "[qom-type=]type,id=str[,prop=value][,...]",
> > +        .help       = "create QOM object",
> > +        .mhandler.cmd = hmp_object_add,
> > +    },
> > +
> > +STEXI
> > +@item object_add
> > +@findex object_add
> > +Create QOM object.
> > +ETEXI
> > +
> >  #ifdef CONFIG_SLIRP
> >      {
> >          .name       = "hostfwd_add",
> > diff --git a/hmp.c b/hmp.c
> > index 32ee285..a1669ab 100644
> > --- a/hmp.c
> > +++ b/hmp.c
> > @@ -21,6 +21,7 @@
> >  #include "qmp-commands.h"
> >  #include "qemu/sockets.h"
> >  #include "monitor/monitor.h"
> > +#include "qapi/opts-visitor.h"
> >  #include "ui/console.h"
> >  #include "block/qapi.h"
> >  #include "qemu-io.h"
> > @@ -1354,6 +1355,63 @@ void hmp_netdev_del(Monitor *mon, const QDict *qdict)
> >      hmp_handle_error(mon, &err);
> >  }
> >
> > +void hmp_object_add(Monitor *mon, const QDict *qdict)
> > +{
> > +    Error *err = NULL;
> > +    QemuOpts *opts;
> > +    char *type = NULL;
> > +    char *id = NULL;
> > +    void *dummy = NULL;
> > +    OptsVisitor *ov;
> > +    QDict *pdict;
> > +
> > +    opts = qemu_opts_from_qdict(qemu_find_opts("object"), qdict, &err);
> > +    if (error_is_set(&err)) {
> > +        goto out;
> > +    }
> > +
> > +    ov = opts_visitor_new(opts);
> > +    pdict = qdict_clone_shallow(qdict);
> > +
> > +    visit_start_struct(opts_get_visitor(ov), &dummy, NULL, NULL, 0, &err);
> > +    if (error_is_set(&err)) {
> > +        goto out_clean;
> > +    }
> > +
> > +    qdict_del(pdict, "qom-type");
> > +    visit_type_str(opts_get_visitor(ov), &type, "qom-type", &err);
> > +    if (error_is_set(&err)) {
> > +        goto out_clean;
> > +    }
> > +
> > +    qdict_del(pdict, "id");
> > +    visit_type_str(opts_get_visitor(ov), &id, "id", &err);
> > +    if (error_is_set(&err)) {
> > +        goto out_clean;
> > +    }
> > +
> > +    object_add(type, id, pdict, opts_get_visitor(ov), &err);
> > +    if (error_is_set(&err)) {
> > +        goto out_clean;
> > +    }
> > +    visit_end_struct(opts_get_visitor(ov), &err);
> > +    if (error_is_set(&err)) {
> > +        qmp_object_del(id, NULL);
> 
> This is not bisect-able as you add this function in the next commit:

Thanks for catching it. This was a bad pull request.

Paolo, can resend?

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2013-12-20 13:35 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-18 16:59 [Qemu-devel] [PULL 00/13] QMP queue Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 01/13] vl: add missing transition debug->finish_migrate Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 02/13] error: Add error_abort Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 03/13] hw/core/qdev: Delete dead code Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 04/13] hw: Remove assert_no_error usages Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 05/13] target-i386: Remove assert_no_error usage Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 06/13] qemu-option: Remove qemu_opts_create_nofail Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 07/13] qerror: Remove assert_no_error() Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 08/13] rng: initialize file descriptor to -1 Luiz Capitulino
2013-12-18 16:59 ` [Qemu-devel] [PULL 09/13] qom: fix leak for objects created with -object Luiz Capitulino
2013-12-18 17:00 ` [Qemu-devel] [PULL 10/13] qom: catch errors in object_property_add_child Luiz Capitulino
2013-12-18 19:09   ` Andreas Färber
2013-12-18 19:58     ` Markus Armbruster
2013-12-18 22:17     ` Luiz Capitulino
2013-12-20  2:27   ` Peter Crosthwaite
2013-12-18 17:00 ` [Qemu-devel] [PULL 11/13] monitor: add object-add (QMP) and object_add (HMP) command Luiz Capitulino
2013-12-20  2:15   ` Peter Crosthwaite
2013-12-20 13:33     ` Luiz Capitulino
2013-12-18 17:00 ` [Qemu-devel] [PULL 12/13] monitor: add object-del (QMP) and object_del " Luiz Capitulino
2013-12-18 17:00 ` [Qemu-devel] [PULL 13/13] qemu-monitor: HMP cpu-add wrapper Luiz Capitulino
2013-12-20  0:32 ` [Qemu-devel] [PULL 00/13] QMP queue Peter Maydell
2013-12-20  0:44   ` Li Guang
2013-12-20  0:49 ` Anthony Liguori
2013-12-20  4:00   ` Peter Crosthwaite
2013-12-20 13:28     ` Luiz Capitulino

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).