From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35700) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b6Eg7-00033x-A4 for qemu-devel@nongnu.org; Fri, 27 May 2016 06:07:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b6Eg0-0007VD-Vh for qemu-devel@nongnu.org; Fri, 27 May 2016 06:07:39 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43500) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b6Eg0-0007V5-NB for qemu-devel@nongnu.org; Fri, 27 May 2016 06:07:32 -0400 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 67F17A78A for ; Fri, 27 May 2016 10:07:32 +0000 (UTC) Received: from donizetti.redhat.com (ovpn-112-66.ams2.redhat.com [10.36.112.66]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4RA6isl030403 for ; Fri, 27 May 2016 06:07:31 -0400 From: Paolo Bonzini Date: Fri, 27 May 2016 12:06:41 +0200 Message-Id: <1464343604-517-29-git-send-email-pbonzini@redhat.com> In-Reply-To: <1464343604-517-1-git-send-email-pbonzini@redhat.com> References: <1464343604-517-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 28/31] memory: remove qemu_get_ram_fd, qemu_set_ram_fd, qemu_ram_block_host_ptr List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Remove direct uses of ram_addr_t and optimize memory_region_{get,set}_fd now that a MemoryRegion knows its RAMBlock directly. Reviewed-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Paolo Bonzini --- exec.c | 34 ---------------------------------- hw/misc/ivshmem.c | 5 ++--- hw/virtio/vhost-user.c | 15 +++++++-------- include/exec/memory.h | 11 +++++++++++ include/exec/ram_addr.h | 3 --- memory.c | 21 +++++++++++++++++---- 6 files changed, 37 insertions(+), 52 deletions(-) diff --git a/exec.c b/exec.c index a3a93ae..3330e7d 100644 --- a/exec.c +++ b/exec.c @@ -1815,40 +1815,6 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t le= ngth) } #endif /* !_WIN32 */ =20 -int qemu_get_ram_fd(ram_addr_t addr) -{ - RAMBlock *block; - int fd; - - rcu_read_lock(); - block =3D qemu_get_ram_block(addr); - fd =3D block->fd; - rcu_read_unlock(); - return fd; -} - -void qemu_set_ram_fd(ram_addr_t addr, int fd) -{ - RAMBlock *block; - - rcu_read_lock(); - block =3D qemu_get_ram_block(addr); - block->fd =3D fd; - rcu_read_unlock(); -} - -void *qemu_get_ram_block_host_ptr(ram_addr_t addr) -{ - RAMBlock *block; - void *ptr; - - rcu_read_lock(); - block =3D qemu_get_ram_block(addr); - ptr =3D ramblock_ptr(block, 0); - rcu_read_unlock(); - return ptr; -} - /* Return a host pointer to ram allocated with qemu_ram_alloc. * This should not be used for general purpose DMA. Use address_space_m= ap * or address_space_rw instead. For local memory (e.g. video ram) that t= he diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c index e40f23b..90be9f7 100644 --- a/hw/misc/ivshmem.c +++ b/hw/misc/ivshmem.c @@ -33,7 +33,6 @@ #include "sysemu/hostmem.h" #include "sysemu/qtest.h" #include "qapi/visitor.h" -#include "exec/ram_addr.h" =20 #include "hw/misc/ivshmem.h" =20 @@ -533,7 +532,7 @@ static void process_msg_shmem(IVShmemState *s, int fd= , Error **errp) } memory_region_init_ram_ptr(&s->server_bar2, OBJECT(s), "ivshmem.bar2", size, ptr); - qemu_set_ram_fd(memory_region_get_ram_addr(&s->server_bar2), fd); + memory_region_set_fd(&s->server_bar2, fd); s->ivshmem_bar2 =3D &s->server_bar2; } =20 @@ -940,7 +939,7 @@ static void ivshmem_exit(PCIDevice *dev) strerror(errno)); } =20 - fd =3D qemu_get_ram_fd(memory_region_get_ram_addr(s->ivshmem= _bar2)); + fd =3D memory_region_get_fd(s->ivshmem_bar2); close(fd); } =20 diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c index 5914e85..41908c0 100644 --- a/hw/virtio/vhost-user.c +++ b/hw/virtio/vhost-user.c @@ -248,17 +248,18 @@ static int vhost_user_set_mem_table(struct vhost_de= v *dev, for (i =3D 0; i < dev->mem->nregions; ++i) { struct vhost_memory_region *reg =3D dev->mem->regions + i; ram_addr_t ram_addr; + MemoryRegion *mr; =20 assert((uintptr_t)reg->userspace_addr =3D=3D reg->userspace_addr= ); - qemu_ram_addr_from_host((void *)(uintptr_t)reg->userspace_addr, - &ram_addr); - fd =3D qemu_get_ram_fd(ram_addr); + mr =3D qemu_ram_addr_from_host((void *)(uintptr_t)reg->userspace= _addr, + &ram_addr); + fd =3D memory_region_get_fd(mr); if (fd > 0) { msg.payload.memory.regions[fd_num].userspace_addr =3D reg->u= serspace_addr; msg.payload.memory.regions[fd_num].memory_size =3D reg->mem= ory_size; msg.payload.memory.regions[fd_num].guest_phys_addr =3D reg->= guest_phys_addr; msg.payload.memory.regions[fd_num].mmap_offset =3D reg->user= space_addr - - (uintptr_t) qemu_get_ram_block_host_ptr(ram_addr); + (uintptr_t) memory_region_get_ram_ptr(mr); assert(fd_num < VHOST_MEMORY_MAX_NREGIONS); fds[fd_num++] =3D fd; } @@ -621,12 +622,10 @@ static bool vhost_user_can_merge(struct vhost_dev *= dev, MemoryRegion *mr; =20 mr =3D qemu_ram_addr_from_host((void *)(uintptr_t)start1, &ram_addr)= ; - assert(mr); - mfd =3D qemu_get_ram_fd(ram_addr); + mfd =3D memory_region_get_fd(mr); =20 mr =3D qemu_ram_addr_from_host((void *)(uintptr_t)start2, &ram_addr)= ; - assert(mr); - rfd =3D qemu_get_ram_fd(ram_addr); + rfd =3D memory_region_get_fd(mr); =20 return mfd =3D=3D rfd; } diff --git a/include/exec/memory.h b/include/exec/memory.h index f649697..1678494 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -667,6 +667,17 @@ static inline bool memory_region_is_rom(MemoryRegion= *mr) int memory_region_get_fd(MemoryRegion *mr); =20 /** + * memory_region_set_fd: Mark a RAM memory region as backed by a + * file descriptor. + * + * This function is typically used after memory_region_init_ram_ptr(). + * + * @mr: the memory region being queried. + * @fd: the file descriptor that backs @mr. + */ +void memory_region_set_fd(MemoryRegion *mr, int fd); + +/** * memory_region_get_ram_ptr: Get a pointer into a RAM memory region. * * Returns a host pointer to a RAM memory region (created with diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h index 5b6e1b8..2a9465d 100644 --- a/include/exec/ram_addr.h +++ b/include/exec/ram_addr.h @@ -105,9 +105,6 @@ RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, = ram_addr_t max_size, uint64_t length, void *host), MemoryRegion *mr, Error **errp); -int qemu_get_ram_fd(ram_addr_t addr); -void qemu_set_ram_fd(ram_addr_t addr, int fd); -void *qemu_get_ram_block_host_ptr(ram_addr_t addr); void qemu_ram_free(RAMBlock *block); =20 int qemu_ram_resize(RAMBlock *block, ram_addr_t newsize, Error **errp); diff --git a/memory.c b/memory.c index 0f52522..d6a4a68 100644 --- a/memory.c +++ b/memory.c @@ -1626,13 +1626,26 @@ void memory_region_reset_dirty(MemoryRegion *mr, = hwaddr addr, =20 int memory_region_get_fd(MemoryRegion *mr) { - if (mr->alias) { - return memory_region_get_fd(mr->alias); + int fd; + + rcu_read_lock(); + while (mr->alias) { + mr =3D mr->alias; } + fd =3D mr->ram_block->fd; + rcu_read_unlock(); =20 - assert(mr->ram_block); + return fd; +} =20 - return qemu_get_ram_fd(memory_region_get_ram_addr(mr)); +void memory_region_set_fd(MemoryRegion *mr, int fd) +{ + rcu_read_lock(); + while (mr->alias) { + mr =3D mr->alias; + } + mr->ram_block->fd =3D fd; + rcu_read_unlock(); } =20 void *memory_region_get_ram_ptr(MemoryRegion *mr) --=20 2.5.5