All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: "Michael S. Tsirkin" <mst@redhat.com>,
	Markus Armbruster <armbru@redhat.com>
Cc: "Kevin Wolf" <kwolf@redhat.com>,
	"Eduardo Habkost" <ehabkost@redhat.com>,
	libvir-list@redhat.com, "Stefan Hajnoczi" <stefanha@gmail.com>,
	qemu-devel@nongnu.org, "Luiz Capitulino" <lcapitulino@redhat.com>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	Andreas =?utf-8?Q?F=C3=A4rber?= <afaerber@suse.de>
Subject: Re: [Qemu-devel] [PATCH v8 2/3] qom: pass original path to unparent method
Date: Mon, 18 Mar 2013 09:24:16 -0500	[thread overview]
Message-ID: <87zjy0946n.fsf@codemonkey.ws> (raw)
In-Reply-To: <50e744fbae4b08dc4ec33d5d44acc83da7170391.1363264726.git.mst@redhat.com>

"Michael S. Tsirkin" <mst@redhat.com> writes:

> We need to know the original path since unparenting loses this state.
>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
>  hw/qdev.c            | 4 ++--
>  include/qom/object.h | 3 ++-
>  qom/object.c         | 4 +++-
>  3 files changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/hw/qdev.c b/hw/qdev.c
> index 741af96..64546cf 100644
> --- a/hw/qdev.c
> +++ b/hw/qdev.c
> @@ -436,7 +436,7 @@ static void qbus_realize(BusState *bus, DeviceState *parent, const char *name)
>      }
>  }
>  
> -static void bus_unparent(Object *obj)
> +static void bus_unparent(Object *obj, const char *path)
>  {
>      BusState *bus = BUS(obj);
>      BusChild *kid;
> @@ -756,7 +756,7 @@ static void device_class_base_init(ObjectClass *class, void *data)
>      klass->props = NULL;
>  }
>  
> -static void device_unparent(Object *obj)
> +static void device_unparent(Object *obj, const char *path)
>  {
>      DeviceState *dev = DEVICE(obj);
>      DeviceClass *dc = DEVICE_GET_CLASS(dev);
> diff --git a/include/qom/object.h b/include/qom/object.h
> index cf094e7..f0790d4 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -330,11 +330,12 @@ typedef struct ObjectProperty
>  /**
>   * ObjectUnparent:
>   * @obj: the object that is being removed from the composition tree
> + * @path: canonical path that object had if any
>   *
>   * Called when an object is being removed from the QOM composition tree.
>   * The function should remove any backlinks from children objects to @obj.
>   */
> -typedef void (ObjectUnparent)(Object *obj);
> +typedef void (ObjectUnparent)(Object *obj, const char *path);
>  
>  /**
>   * ObjectFree:
> diff --git a/qom/object.c b/qom/object.c
> index 3d638ff..21c9da4 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -362,14 +362,16 @@ static void object_property_del_child(Object *obj, Object *child, Error **errp)
>  
>  void object_unparent(Object *obj)
>  {
> +    gchar *path = object_get_canonical_path(obj);
>      object_ref(obj);
>      if (obj->parent) {
>          object_property_del_child(obj->parent, obj, NULL);
>      }
>      if (obj->class->unparent) {
> -        (obj->class->unparent)(obj);
> +        (obj->class->unparent)(obj, path);
>      }

I think you should actually just move this call above
if (obj->parent) { object_parent_del_child(...); }.

There's no harm AFAICT in doing this and it seems more logical to me to
have destruction flow start with the subclass and move up to the base
class.

This avoids needing a hack like this because the object is still in a
reasonable state when unparent is called.

Paolo, do you see anything wrong with this?  I looked at the commit you
added this in and it doesn't look like it would be a problem.

Regards,

Anthony Liguori

>      object_unref(obj);
> +    g_free(path);
>  }
>  
>  static void object_deinit(Object *obj, TypeImpl *type)
> -- 
> MST

  reply	other threads:[~2013-03-18 14:24 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-14 12:40 [Qemu-devel] [PATCH v8 0/3] DEVICE_DELETED event Michael S. Tsirkin
2013-03-14 12:40 ` [Qemu-devel] [PATCH v8 1/3] qdev: " Michael S. Tsirkin
2013-03-14 12:40 ` [Qemu-devel] [PATCH v8 2/3] qom: pass original path to unparent method Michael S. Tsirkin
2013-03-18 14:24   ` Anthony Liguori [this message]
2013-03-18 14:35     ` Michael S. Tsirkin
2013-03-18 15:08       ` Paolo Bonzini
2013-03-18 15:03     ` Paolo Bonzini
2013-03-18 16:04       ` Anthony Liguori
2013-03-14 12:40 ` [Qemu-devel] [PATCH v8 3/3] qmp: add path to device_deleted event Michael S. Tsirkin
2013-03-14 14:18 ` [Qemu-devel] [PATCH v8 0/3] DEVICE_DELETED event Markus Armbruster
2013-03-14 22:56 ` [Qemu-devel] [libvirt] " Eric Blake

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=87zjy0946n.fsf@codemonkey.ws \
    --to=aliguori@us.ibm.com \
    --cc=afaerber@suse.de \
    --cc=armbru@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=libvir-list@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.