From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=33808 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q7WOO-0008Ql-0t for qemu-devel@nongnu.org; Wed, 06 Apr 2011 13:19:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q7WOM-0006iy-Fl for qemu-devel@nongnu.org; Wed, 06 Apr 2011 13:19:43 -0400 Received: from server514f.exghost.com ([72.32.253.73]:1548 helo=server514.appriver.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q7WOM-0006hw-8Q for qemu-devel@nongnu.org; Wed, 06 Apr 2011 13:19:42 -0400 Received: from [72.32.253.162] (HELO fe07.exg4.exghost.com) by server514.appriver.com (CommuniGate Pro SMTP 5.3.2) with ESMTP id 154578141 for qemu-devel@nongnu.org; Wed, 06 Apr 2011 12:19:09 -0500 Message-ID: <4D9CA0AA.2030409@virtualcomputer.com> Date: Wed, 06 Apr 2011 13:19:38 -0400 From: John Baboval MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH V11 11/15] Introduce qemu_put_ram_ptr References: <1299004529-31290-1-git-send-email-anthony.perard@citrix.com> <1299004529-31290-12-git-send-email-anthony.perard@citrix.com> In-Reply-To: <1299004529-31290-12-git-send-email-anthony.perard@citrix.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This seems to leak entries on the map cache locked entries list. Patch below: Signed-off-by: John Baboval --- exec.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/exec.c b/exec.c index 1f88d6a..f18cb7d 100644 --- a/exec.c +++ b/exec.c @@ -3759,9 +3759,8 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, } } else { /* RAM case */ - ptr = qemu_get_ram_ptr(pd& TARGET_PAGE_MASK) + - (addr& ~TARGET_PAGE_MASK); - memcpy(buf, ptr, l); + ptr = qemu_get_ram_ptr(pd& TARGET_PAGE_MASK); + memcpy(buf, ptr + (addr& ~TARGET_PAGE_MASK), l); qemu_put_ram_ptr(ptr); } } -- 1.7.0.4 On 03/01/2011 01:35 PM, anthony.perard@citrix.com wrote: > From: Anthony PERARD > > This function allows to unlock a ram_ptr give by qemu_get_ram_ptr. After > a call to qemu_put_ram_ptr, the pointer may be unmap from QEMU when > used with Xen. > > Signed-off-by: Anthony PERARD > Acked-by: Alexander Graf > --- > cpu-common.h | 1 + > exec.c | 10 ++++++++++ > xen-mapcache.c | 34 ++++++++++++++++++++++++++++++++++ > 3 files changed, 45 insertions(+), 0 deletions(-) > > diff --git a/cpu-common.h b/cpu-common.h > index 54d21d4..1f1c886 100644 > --- a/cpu-common.h > +++ b/cpu-common.h > @@ -55,6 +55,7 @@ void *qemu_get_ram_ptr(ram_addr_t addr); > /* Same but slower, to use for migration, where the order of > * RAMBlocks must not change. */ > void *qemu_safe_ram_ptr(ram_addr_t addr); > +void qemu_put_ram_ptr(void *addr); > /* This should not be used by devices. */ > int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr); > ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr); > diff --git a/exec.c b/exec.c > index 558595a..3f3caaa 100644 > --- a/exec.c > +++ b/exec.c > @@ -3007,6 +3007,13 @@ void *qemu_safe_ram_ptr(ram_addr_t addr) > return NULL; > } > > +void qemu_put_ram_ptr(void *addr) > +{ > + if (xen_mapcache_enabled()) { > + qemu_map_cache_unlock(addr); > + } > +} > + > int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr) > { > RAMBlock *block; > @@ -3722,6 +3729,7 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, > cpu_physical_memory_set_dirty_flags( > addr1, (0xff& ~CODE_DIRTY_FLAG)); > } > + qemu_put_ram_ptr(ptr); > } > } else { > if ((pd& ~TARGET_PAGE_MASK)> IO_MEM_ROM&& > @@ -3752,6 +3760,7 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, > ptr = qemu_get_ram_ptr(pd& TARGET_PAGE_MASK) + > (addr& ~TARGET_PAGE_MASK); > memcpy(buf, ptr, l); > + qemu_put_ram_ptr(ptr); > } > } > len -= l; > @@ -3792,6 +3801,7 @@ void cpu_physical_memory_write_rom(target_phys_addr_t addr, > /* ROM/RAM case */ > ptr = qemu_get_ram_ptr(addr1); > memcpy(ptr, buf, l); > + qemu_put_ram_ptr(ptr); > } > len -= l; > buf += l; > diff --git a/xen-mapcache.c b/xen-mapcache.c > index d7f44a7..6398456 100644 > --- a/xen-mapcache.c > +++ b/xen-mapcache.c > @@ -195,6 +195,40 @@ uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, u > return mapcache->last_address_vaddr + address_offset; > } > > +void qemu_map_cache_unlock(void *buffer) > +{ > + MapCacheEntry *entry = NULL, *pentry = NULL; > + MapCacheRev *reventry; > + target_phys_addr_t paddr_index; > + int found = 0; > + > + QTAILQ_FOREACH(reventry,&mapcache->locked_entries, next) { > + if (reventry->vaddr_req == buffer) { > + paddr_index = reventry->paddr_index; > + found = 1; > + break; > + } > + } > + if (!found) { > + return; > + } > + QTAILQ_REMOVE(&mapcache->locked_entries, reventry, next); > + qemu_free(reventry); > + > + entry =&mapcache->entry[paddr_index % mapcache->nr_buckets]; > + while (entry&& entry->paddr_index != paddr_index) { > + pentry = entry; > + entry = entry->next; > + } > + if (!entry) { > + return; > + } > + entry->lock--; > + if (entry->lock> 0) { > + entry->lock--; > + } > +} > + > ram_addr_t qemu_ram_addr_from_mapcache(void *ptr) > { > MapCacheRev *reventry;