diff options
author | Gonglei <arei.gonglei@huawei.com> | 2016-02-20 10:35:20 +0800 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2016-02-25 16:11:29 +0100 |
commit | 3655cb9c7375a595a8051ec677c515b24d5c1fe6 (patch) | |
tree | 22578286292715ef50875e061141537aadb83f23 /include/exec | |
parent | 58eaa2174e99d9a05172d03fd2799ab8fd9e6f60 (diff) | |
download | qemu-3655cb9c7375a595a8051ec677c515b24d5c1fe6.tar.gz qemu-3655cb9c7375a595a8051ec677c515b24d5c1fe6.tar.bz2 qemu-3655cb9c7375a595a8051ec677c515b24d5c1fe6.zip |
memory: optimize qemu_get_ram_ptr and qemu_ram_ptr_length
these two functions consume too much cpu overhead to
find the RAMBlock by ram address.
After this patch, we can pass the RAMBlock pointer
to them so that they don't need to find the RAMBlock
anymore most of the time. We can get better performance
in address translation processing.
Signed-off-by: Gonglei <arei.gonglei@huawei.com>
Message-Id: <1455935721-8804-3-git-send-email-arei.gonglei@huawei.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'include/exec')
-rw-r--r-- | include/exec/memory.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/include/exec/memory.h b/include/exec/memory.h index 683be46cd0..34f21f1aed 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -1391,7 +1391,7 @@ MemTxResult address_space_read_continue(AddressSpace *as, hwaddr addr, MemoryRegion *mr); MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr, MemTxAttrs attrs, uint8_t *buf, int len); -void *qemu_get_ram_ptr(ram_addr_t addr); +void *qemu_get_ram_ptr(RAMBlock *ram_block, ram_addr_t addr); static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write) { @@ -1432,7 +1432,7 @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr, MemTxAttrs attrs, mr = address_space_translate(as, addr, &addr1, &l, false); if (len == l && memory_access_is_direct(mr, false)) { addr1 += memory_region_get_ram_addr(mr); - ptr = qemu_get_ram_ptr(addr1); + ptr = qemu_get_ram_ptr(mr->ram_block, addr1); memcpy(buf, ptr, len); } else { result = address_space_read_continue(as, addr, attrs, buf, len, |