qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] qom: trigger unrealized when device_finalize


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH] qom: trigger unrealized when device_finalize
Date: Fri, 05 Jul 2013 09:04:09 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130514 Thunderbird/17.0.6

Il 05/07/2013 05:26, Liu Ping Fan ha scritto:
> Currently, unrealized is triggered in device_unparent(). But
> unrealized normally involves the reclaim of resource occupied by
> DeviceState. To obey the idiom that reclaiming resource when
> refcnt reach zero, move it on the path of object_finalize().
> 
> As for device_unparent(), it would be the place to detach the
> device from the other system.

This is wrong, unrealize is where the resources should be made invisible
to the guest.  This removes a bunch of references to the memory regions
(from the flatview, from the parent region, etc.). Ultimately causes
finalization to be called (after we add RCU, finalization will happen at
the next grace period, because some of the references are removed from
call_rcu callbacks).

What you want is
http://permalink.gmane.org/gmane.comp.emulators.qemu/214871.

Paolo

> Signed-off-by: Liu Ping Fan <address@hidden>
> ---
>  hw/core/qdev.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
> index 9190a7e..4258d8a 100644
> --- a/hw/core/qdev.c
> +++ b/hw/core/qdev.c
> @@ -768,6 +768,10 @@ static void device_initfn(Object *obj)
>  static void device_finalize(Object *obj)
>  {
>      DeviceState *dev = DEVICE(obj);
> +
> +    if (dev->realized) {
> +        object_property_set_bool(obj, false, "realized", NULL);
> +    }
>      if (dev->opts) {
>          qemu_opts_del(dev->opts);
>      }
> @@ -794,9 +798,6 @@ static void device_unparent(Object *obj)
>          bus = QLIST_FIRST(&dev->child_bus);
>          qbus_free(bus);
>      }
> -    if (dev->realized) {
> -        object_property_set_bool(obj, false, "realized", NULL);
> -    }
>      if (dev->parent_bus) {
>          bus_remove_child(dev->parent_bus, dev);
>          object_unref(OBJECT(dev->parent_bus));
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]