Il 07/05/2013 20:00, Jan Kiszka ha scritto: > On 2013-05-07 16:17, Paolo Bonzini wrote: >> With this change, a FlatView can be used even after a concurrent >> update has replaced it. Because we do not have RCU, we use a >> mutex to protect the small critical sections that read/write the >> as->current_map pointer. Accesses to the FlatView can be done >> outside the mutex. >> >> If a MemoryRegion will be used after the FlatView is unref-ed (or after >> a MemoryListener callback is returned), a reference has to be added to >> that MemoryRegion. For example, memory_region_find adds a reference to >> the MemoryRegion that it returns. > > For my understanding: Every lookup, e.g. triggered by address_space_rw, > will briefly reference the FlatView of that address space and drop that > reference again after referencing the target memory region. > > Provided that is true: If we run that lookup on an address space that > happens to be modified in parallel, the lookup may actually cause the > final deref and, thus, release of the FlatView - even if the target > memory region was totally unrelated to the ongoing change. That could > make a hot-path pay the price of an action a slow path caused. Not > really a beautiful concept. Even if the FlatView finalization is a > simple free() (that is the minimum), we would pull the memory allocator > into code paths that might try hard to keep a safe distance for the sake > of predictability.
All this is correct. But I hope to get RCU in 1.6, otherwise we can use a bottom half. In any case, this is obviously no worse than current code that requires the BQL (hence the lookup would serialize against the free). Paolo