On 10/29/2012 01:48 AM, Liu Ping Fan wrote: > Without biglock, we try to protect the mr by increase refcnt. > If we can inc refcnt, go backward and resort to biglock. > > Another point is memory radix-tree can be flushed by another > thread, so we should get the copy of terminal mr to survive > from such issue. >
> +static bool memory_region_section_ref(MemoryRegionSection *mrs) > +{ > + MemoryRegion *mr; > + bool ret = false; > + > + mr = mrs->mr; > + if (mr->ops && mr->ops->ref) { > + ret = mr->ops->ref(mr); I still don't see why ->ref() needs to return something. > + } > + return ret; > +} > + > > while (len > 0) { > page = addr & TARGET_PAGE_MASK; > l = (page + TARGET_PAGE_SIZE) - addr; > if (l > len) > l = len; > - section = phys_page_find(d, page >> TARGET_PAGE_BITS); > + > + if (as->lock) { > + qemu_mutex_lock(as->lock); > + safe_ref = memory_region_section_lookup_ref(d, page, &obj_mrs); > + qemu_mutex_unlock(as->lock); > + if (!safe_ref) { > + qemu_mutex_lock_iothread(); > + qemu_mutex_lock(as->lock); > + /* when 2nd try, mem map can change, need to judge it again > */ > + safe_ref = memory_region_section_lookup_ref(d, page, > &obj_mrs); > + qemu_mutex_unlock(as->lock); > + if (safe_ref) { > + qemu_mutex_unlock_iothread(); > + } > + } > + } else { > + /* Caller hold the big lock */ > + memory_region_section_lookup_ref(d, page, &obj_mrs); It's not a property of the address space, it's a property of the caller. > + } > + section = &obj_mrs; > > if (is_write) { > if (!memory_region_is_ram(section->mr)) { -- error compiling committee.c: too many arguments to function