qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Auger <eric.auger@linaro.org>
To: eric.auger@st.com, eric.auger@linaro.org, qemu-devel@nongnu.org,
	alex.williamson@redhat.com, agraf@suse.de, pbonzini@redhat.com,
	peter.crosthwaite@xilinx.com
Cc: peter.maydell@linaro.org, kim.phillips@freescale.com,
	b.reynal@virtualopensystems.com, vikrams@codeaurora.org,
	patches@linaro.org, Bharat.Bhushan@freescale.com,
	alex.bennee@linaro.org, kvmarm@lists.cs.columbia.edu,
	christoffer.dall@linaro.org
Subject: [Qemu-devel] [PATCH v13 10/12] qdev: check callback takes the property child as third argument
Date: Tue, 28 Apr 2015 17:51:11 +0100	[thread overview]
Message-ID: <1430239873-31950-11-git-send-email-eric.auger@linaro.org> (raw)
In-Reply-To: <1430239873-31950-1-git-send-email-eric.auger@linaro.org>

Check callback now takes as third argument an Object * const*. In
object_set_link_property, we pass the property child as argument.
We also assign the *child before the check call so that enhanced
check can be performed in the callback. In case the check fails,
the old value is restored and ref count is left unchanged.

This typically makes possible to do checks both on the *child
content (for instance a qemu_irq) and also perform some actions/
checks on its container, which was not possible before.

This is for example useful for starting irqfd setup in vfio platform
use case.

Signed-off-by: Eric Auger <eric.auger@linaro.org>

---

v1 -> v2:
- Object ** becomes Object * const*
- rename patch title
---
 hw/core/qdev-properties.c    |  3 ++-
 include/hw/qdev-properties.h |  3 ++-
 include/qom/object.h         |  4 ++--
 qom/object.c                 | 16 +++++++++-------
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 570d5f0..7e00cd2 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -22,7 +22,8 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
 }
 
 void qdev_prop_allow_set_link_before_realize(Object *obj, const char *name,
-                                             Object *val, Error **errp)
+                                             Object * const *target,
+                                             Error **errp)
 {
     DeviceState *dev = DEVICE(obj);
 
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index d67dad5..67ac457 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -213,6 +213,7 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
  * object_property_add_link().
  */
 void qdev_prop_allow_set_link_before_realize(Object *obj, const char *name,
-                                             Object *val, Error **errp);
+                                             Object * const *target,
+                                             Error **errp);
 
 #endif
diff --git a/include/qom/object.h b/include/qom/object.h
index 95d1a1d..ab60c16 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -34,7 +34,7 @@ typedef struct InterfaceClass InterfaceClass;
 typedef struct InterfaceInfo InterfaceInfo;
 
 typedef void (*LinkPropertySetter)(Object *, const char *,
-                                   Object *, Error **);
+                                  Object * const *, Error **);
 
 #define TYPE_OBJECT "object"
 
@@ -1136,7 +1136,7 @@ typedef enum {
  * an error.
  */
 void object_property_allow_set_link(Object *, const char *,
-                                    Object *, Error **);
+                                    Object * const *, Error **);
 
 /**
  * object_property_add_link:
diff --git a/qom/object.c b/qom/object.c
index b8dff43..ed286e7 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1112,14 +1112,14 @@ out:
 }
 
 void object_property_allow_set_link(Object *obj, const char *name,
-                                    Object *val, Error **errp)
+                                    Object * const *target, Error **errp)
 {
     /* Allow the link to be set, always */
 }
 
 typedef struct {
     Object **child;
-    void (*check)(Object *, const char *, Object *, Error **);
+    LinkPropertySetter check;
     ObjectPropertyLinkFlags flags;
 } LinkProperty;
 
@@ -1201,14 +1201,17 @@ static void object_set_link_property(Object *obj, Visitor *v, void *opaque,
         return;
     }
 
-    prop->check(obj, name, new_target, &local_err);
+    object_ref(new_target);
+    *child = new_target;
+
+    prop->check(obj, name, child, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
+        *child = old_target;
+        object_ref(new_target);
         return;
     }
 
-    object_ref(new_target);
-    *child = new_target;
     object_unref(old_target);
 }
 
@@ -1232,8 +1235,7 @@ static void object_release_link_property(Object *obj, const char *name,
 
 void object_property_add_link(Object *obj, const char *name,
                               const char *type, Object **child,
-                              void (*check)(Object *, const char *,
-                                            Object *, Error **),
+                              LinkPropertySetter check,
                               ObjectPropertyLinkFlags flags,
                               Error **errp)
 {
-- 
1.8.3.2

  parent reply	other threads:[~2015-04-28 16:51 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-28 16:51 [Qemu-devel] [PATCH v13 00/12] KVM platform device passthrough Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 01/12] linux-headers: update headers according to 4.1-rc0 Eric Auger
2015-04-29 10:36   ` Christian Borntraeger
2015-04-29 11:11     ` Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 02/12] hw/vfio/platform: vfio-platform skeleton Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 03/12] hw/vfio/platform: add irq assignment Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 04/12] hw/vfio/platform: calxeda xgmac device Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 05/12] hw/arm/sysbus-fdt: enable vfio-calxeda-xgmac dynamic instantiation Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 06/12] kvm: rename kvm_irqchip_[add, remove]_irqfd_notifier with gsi suffix Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 07/12] kvm-all.c: add qemu_irq/gsi hash table and utility routines Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 08/12] intc: arm_gic_kvm: set the qemu_irq/gsi mapping Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 09/12] qdev: pass the check callback to qdev_init_gpio_out_named Eric Auger
2015-04-28 16:51 ` Eric Auger [this message]
2015-04-29  8:22   ` [Qemu-devel] [PATCH v13 10/12] qdev: check callback takes the property child as third argument Paolo Bonzini
2015-04-29  8:37     ` Eric Auger
2015-04-29 11:12       ` Paolo Bonzini
2015-04-29 11:10         ` Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 11/12] sysbus: add irq_set_hook Eric Auger
2015-04-28 16:51 ` [Qemu-devel] [PATCH v13 12/12] hw/vfio/platform: add irqfd support Eric Auger

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=1430239873-31950-11-git-send-email-eric.auger@linaro.org \
    --to=eric.auger@linaro.org \
    --cc=Bharat.Bhushan@freescale.com \
    --cc=agraf@suse.de \
    --cc=alex.bennee@linaro.org \
    --cc=alex.williamson@redhat.com \
    --cc=b.reynal@virtualopensystems.com \
    --cc=christoffer.dall@linaro.org \
    --cc=eric.auger@st.com \
    --cc=kim.phillips@freescale.com \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=patches@linaro.org \
    --cc=pbonzini@redhat.com \
    --cc=peter.crosthwaite@xilinx.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vikrams@codeaurora.org \
    /path/to/YOUR_REPLY

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

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