[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete()
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views |
Date: |
Wed, 08 Aug 2012 11:52:24 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 |
Il 08/08/2012 08:25, Liu Ping Fan ha scritto:
> +void qdev_unplug_complete(DeviceState *dev, Error **errp)
> +{
> + /* isolate from mem view */
> + qdev_unmap(dev);
> + qemu_lock_devtree();
> + /* isolate from device tree */
> + qdev_unset_parent(dev);
> + qemu_unlock_devtree();
> + object_unref(OBJECT(dev));
Rather than deferring the free, you should defer the unref. Otherwise
the following can happen when you have "real" RCU access to the memory
map on the read-side:
VCPU thread I/O thread
=====================================================================
get MMIO request
rcu_read_lock()
walk memory map
qdev_unmap()
lock_devtree()
...
unlock_devtree
unref dev -> refcnt=0, free enqueued
ref()
rcu_read_unlock()
free()
<dangling pointer!>
If you defer the unref, you have instead
VCPU thread I/O thread
=====================================================================
get MMIO request
rcu_read_lock()
walk memory map
qdev_unmap()
lock_devtree()
...
unlock_devtree
unref is enqueued
ref() -> refcnt = 2
rcu_read_unlock()
unref() -> refcnt=1
unref() -> refcnt = 1
So this also makes patch 14 unnecessary.
Paolo
> +}
- Re: [Qemu-devel] [PATCH 06/15] memory: use refcnt to manage MemoryRegion, (continued)
[Qemu-devel] [PATCH 10/15] memory: change tcg related code to using PhysMap, Liu Ping Fan, 2012/08/08
[Qemu-devel] [PATCH 09/15] memory: prepare flatview and radix-tree for rcu style access, Liu Ping Fan, 2012/08/08
Re: [Qemu-devel] [PATCH 09/15] memory: prepare flatview and radix-tree for rcu style access, Blue Swirl, 2012/08/08
[Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views, Liu Ping Fan, 2012/08/08
- Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views,
Paolo Bonzini <=
- Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views, Avi Kivity, 2012/08/08
- Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views, liu ping fan, 2012/08/09
- Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views, Paolo Bonzini, 2012/08/09
- Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views, liu ping fan, 2012/08/10
- Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views, Marcelo Tosatti, 2012/08/13
- Re: [Qemu-devel] [PATCH 13/15] hotplug: introduce qdev_unplug_complete() to remove device from views, Marcelo Tosatti, 2012/08/13
[Qemu-devel] [PATCH 15/15] e1000: using new interface--unmap to unplug, Liu Ping Fan, 2012/08/08