On Wed, Jul 25, 2012 at 3:43 PM, Stefan Hajnoczi <stefanha@xxxxxxxxx> wrote: > On Wed, Jul 25, 2012 at 4:31 AM, Liu Ping Fan <qemulist@xxxxxxxxx> wrote: >> @@ -3396,13 +3420,25 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, >> uint32_t val; >> target_phys_addr_t page; >> MemoryRegionSection *section; >> + Object *bk; >> >> while (len > 0) { >> page = addr & TARGET_PAGE_MASK; >> l = (page + TARGET_PAGE_SIZE) - addr; >> if (l > len) >> l = len; >> + >> + qemu_rwlock_rdlock_devtree(); >> section = phys_page_find(page >> TARGET_PAGE_BITS); >> + if (!(memory_region_is_ram(section->mr) || >> + memory_region_is_romd(section->mr)) && !is_write) { >> + bk = get_backend(section->mr, addr); >> + object_ref(bk); >> + } else if (!memory_region_is_ram(section->mr) && is_write) { >> + bk = get_backend(section->mr, addr); >> + object_ref(bk); >> + } >> + qemu_rwlock_unlock_devtree(); >> >> if (is_write) { >> if (!memory_region_is_ram(section->mr)) { >> @@ -3426,6 +3462,7 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, >> io_mem_write(section->mr, addr1, val, 1); >> l = 1; >> } >> + object_unref(bk); > > Currently object_ref()/object_unref() are not atomic. Will you send We obey the rule: rdlock->search->ref_get, wrlock->remove ->ref_put So can it causes problem if object_ref()/object_unref() are not atomic? Thanx, pingfan > another patch to perform atomic increment/decrement or how will > per-device synchronization work? > > Stefan -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html