Re: [PATCH v13 10/12] qdev: check callback takes the property child as third argument

2015-04-29 Thread Eric Auger
On 04/29/2015 01:12 PM, Paolo Bonzini wrote:
 I think reverting is better since you need a respin and Peter offered to
 touch the code later.
OK Thanks

Eric
 
 Paolo

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [PATCH v13 10/12] qdev: check callback takes the property child as third argument

2015-04-29 Thread Paolo Bonzini
On 29/04/2015 10:37, Eric Auger wrote:
  This should be an unref.
 oups yes.
 
 Thanks! Do I keep this series or do I revert to sysbus irq connect irq
 temporary patch as per Peter's last email?

I think reverting is better since you need a respin and Peter offered to
touch the code later.

Paolo
___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


[PATCH v13 10/12] qdev: check callback takes the property child as third argument

2015-04-28 Thread Eric Auger
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.au...@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

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm