On 10/09/2012 02:01 PM, Paolo Bonzini wrote:
> 
>> [could we also avoid refcounting by doing the equivalent of
>> stop_machine() during hotunplug?]
> 
> That's quite an interesting alternative.

It's somewhat unattractive in that we know how much stop_machine is
hated in Linux.  But maybe it makes sense as a transitional path.

Note it's not sufficient to stop vcpu threads, we also have to stop
non-vcpu threads that may be issuing address_space_rw() or family.

But no, it's actually impossible.  Hotplug may be triggered from a vcpu
thread, which clearly it can't be stopped.  The only two solutions are
Ping's garbage collector thread or refcounting.

The original deadlock was:

 read_lock_rcu() / mmap_lock()
 lookup device
 dispatch
   device mmio handler
     memory_region_del_subregion()
       synchronize_rcu() / mmap_lock()
 rcu_read_unlock() / mmap_unlock

stop_machine() is just another name for synchronize_rcu() wrt locking.

-- 
error compiling committee.c: too many arguments to function

Reply via email to