From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53786) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WkZDj-0001iO-6B for qemu-devel@nongnu.org; Wed, 14 May 2014 09:27:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WkZDb-000113-LC for qemu-devel@nongnu.org; Wed, 14 May 2014 09:27:43 -0400 Received: from cantor2.suse.de ([195.135.220.15]:48922 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WkZDb-00010n-AQ for qemu-devel@nongnu.org; Wed, 14 May 2014 09:27:35 -0400 Message-ID: <53736F44.5040400@suse.de> Date: Wed, 14 May 2014 15:27:32 +0200 From: =?ISO-8859-15?Q?Andreas_F=E4rber?= MIME-Version: 1.0 References: <1395244138-8834-1-git-send-email-stefanha@redhat.com> <1395244138-8834-2-git-send-email-stefanha@redhat.com> In-Reply-To: <1395244138-8834-2-git-send-email-stefanha@redhat.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [RFC 1/5] qdev: add child alias properties List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Stefan Hajnoczi , qemu-devel@nongnu.org Cc: Peter Maydell , Paolo Bonzini , fred.konrad@greensocs.com Am 19.03.2014 16:48, schrieb Stefan Hajnoczi: > Child alias properties allow a parent object to expose child object > properties. This makes it possible for a parent object to forward all > or a subset of a child's properties. >=20 > Currently we achieve similar behavior by duplicating property > definitions and copying the fields around. It turns out virtio has > several double-frees since we didn't get the memory management right. >=20 > Using child alias properties it will be much easier for a parent object > to set a child's properties without fragile memory management issues > since the actual field only exists once in the child object. >=20 > Signed-off-by: Stefan Hajnoczi > --- > hw/core/qdev-properties.c | 28 ++++++++++++++++++++++++++++ > include/hw/qdev-properties.h | 28 ++++++++++++++++++++++++++++ > 2 files changed, 56 insertions(+) >=20 > diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c > index 77d0c66..e62a4fd 100644 > --- a/hw/core/qdev-properties.c > +++ b/hw/core/qdev-properties.c > @@ -1002,3 +1002,31 @@ PropertyInfo qdev_prop_size =3D { > .get =3D get_size, > .set =3D set_size, > }; > + > +/* --- alias that forwards to a child object's property --- */ > + > +static void get_child_alias(Object *obj, Visitor *v, void *opaque, > + const char *name, Error **errp) > +{ > + DeviceState *dev =3D DEVICE(obj); > + Property *prop =3D opaque; > + Object *child =3D OBJECT(qdev_get_prop_ptr(dev, prop)); > + > + object_property_get(child, v, name, errp); > +} > + > +static void set_child_alias(Object *obj, Visitor *v, void *opaque, > + const char *name, Error **errp) > +{ > + DeviceState *dev =3D DEVICE(obj); > + Property *prop =3D opaque; > + Object *child =3D OBJECT(qdev_get_prop_ptr(dev, prop)); > + > + object_property_set(child, v, name, errp); > +} > + > +PropertyInfo qdev_prop_child_alias =3D { > + .name =3D "ChildAlias", Won't this turn into the QMP-exposed type of the property? That would be wrong then, requiring per-type alias property types. They could be macro-automated of course, if we need them. Paolo had cleaned up type names to match QAPI schema for 2.0, CC'ing. Regards, Andreas > + .get =3D get_child_alias, > + .set =3D set_child_alias, > +}; > diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.= h > index 3c000ee..5ab1cac 100644 > --- a/include/hw/qdev-properties.h > +++ b/include/hw/qdev-properties.h > @@ -13,6 +13,7 @@ extern PropertyInfo qdev_prop_uint32; > extern PropertyInfo qdev_prop_int32; > extern PropertyInfo qdev_prop_uint64; > extern PropertyInfo qdev_prop_size; > +extern PropertyInfo qdev_prop_child_alias; > extern PropertyInfo qdev_prop_string; > extern PropertyInfo qdev_prop_chr; > extern PropertyInfo qdev_prop_ptr; > @@ -61,6 +62,33 @@ extern PropertyInfo qdev_prop_arraylen; > .defval =3D (bool)_defval, \ > } > =20 > +/** > + * DEFINE_PROP_CHILD_ALIAS: > + * @_name: property name > + * @_state: name of the device state structure type > + * @_field: name of field in @_state, must be Object subclass > + * > + * Define device properties that alias a child object's property. For= example, > + * use the following to forward the 'baz' property where Foo embeds a = Bar > + * object: > + * > + * typedef struct { > + * Object parent_obj; > + * > + * Bar bar_obj; > + * } Foo; > + * > + * DEFINE_PROP_CHILD_ALIAS("baz", Foo, bar_obj) > + * > + * Any access to Foo's 'baz' property actually accesses bar_obj's 'baz= ' > + * property. > + */ > +#define DEFINE_PROP_CHILD_ALIAS(_name, _state, _field) { \ > + .name =3D (_name), \ > + .info =3D &(qdev_prop_child_alias), \ > + .offset =3D offsetof(_state, _field), \ > + } > + > #define PROP_ARRAY_LEN_PREFIX "len-" > =20 > /** --=20 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=FCrnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imend=F6rffer; HRB 16746 AG N=FCrnbe= rg