All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/2] memory: cleanup users of memory_region_get_ram_addr
@ 2016-03-24 11:03 Paolo Bonzini
  2016-03-24 11:03 ` [Qemu-devel] [PATCH 1/2] memory: remove unnecessary masking of MemoryRegion ram_addr Paolo Bonzini
  2016-03-24 11:03 ` [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users Paolo Bonzini
  0 siblings, 2 replies; 14+ messages in thread
From: Paolo Bonzini @ 2016-03-24 11:03 UTC (permalink / raw)
  To: qemu-devel; +Cc: arei.gonglei, famz, mst

The result of memory_region_get_ram_addr is often added in the
caller of qemu_get_ram_ptr and then subtracted in qemu_get_ram_ptr;
avoid the indirection.  Prompted by mst's remark on confusion
between hwaddr and ram_addr_t.

Paolo

Paolo Bonzini (2):
  memory: remove unnecessary masking of MemoryRegion ram_addr
  memory: hide ram_addr_t from qemu_get_ram_ptr users

 exec.c                       | 49 +++++++++++++++-----------------------------
 include/exec/memory.h        |  1 -
 memory.c                     |  7 +++----
 migration/savevm.c           |  4 ++--
 scripts/dump-guest-memory.py | 19 +++--------------
 translate-all.c              |  3 +--
 6 files changed, 25 insertions(+), 58 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH 1/2] memory: remove unnecessary masking of MemoryRegion ram_addr
  2016-03-24 11:03 [Qemu-devel] [PATCH 0/2] memory: cleanup users of memory_region_get_ram_addr Paolo Bonzini
@ 2016-03-24 11:03 ` Paolo Bonzini
  2016-03-25  6:20   ` Fam Zheng
  2016-04-03 13:48   ` Michael S. Tsirkin
  2016-03-24 11:03 ` [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users Paolo Bonzini
  1 sibling, 2 replies; 14+ messages in thread
From: Paolo Bonzini @ 2016-03-24 11:03 UTC (permalink / raw)
  To: qemu-devel; +Cc: arei.gonglei, famz, mst

mr->ram_block->offset is already aligned to both host and target size
(see qemu_ram_alloc_internal).  Remove further masking as it is
unnecessary.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 exec.c             | 21 +++++++--------------
 memory.c           |  5 ++---
 migration/savevm.c |  4 ++--
 translate-all.c    |  3 +--
 4 files changed, 12 insertions(+), 21 deletions(-)

diff --git a/exec.c b/exec.c
index f398d21..001b669 100644
--- a/exec.c
+++ b/exec.c
@@ -1042,8 +1042,7 @@ hwaddr memory_region_section_get_iotlb(CPUState *cpu,
 
     if (memory_region_is_ram(section->mr)) {
         /* Normal RAM.  */
-        iotlb = (memory_region_get_ram_addr(section->mr) & TARGET_PAGE_MASK)
-            + xlat;
+        iotlb = memory_region_get_ram_addr(section->mr) + xlat;
         if (!section->readonly) {
             iotlb |= PHYS_SECTION_NOTDIRTY;
         } else {
@@ -3093,9 +3092,7 @@ static inline uint32_t address_space_ldl_internal(AddressSpace *as, hwaddr addr,
     } else {
         /* RAM case */
         ptr = qemu_get_ram_ptr(mr->ram_block,
-                               (memory_region_get_ram_addr(mr)
-                                & TARGET_PAGE_MASK)
-                               + addr1);
+                               memory_region_get_ram_addr(mr) + addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
             val = ldl_le_p(ptr);
@@ -3189,9 +3186,7 @@ static inline uint64_t address_space_ldq_internal(AddressSpace *as, hwaddr addr,
     } else {
         /* RAM case */
         ptr = qemu_get_ram_ptr(mr->ram_block,
-                               (memory_region_get_ram_addr(mr)
-                                & TARGET_PAGE_MASK)
-                               + addr1);
+                               memory_region_get_ram_addr(mr) + addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
             val = ldq_le_p(ptr);
@@ -3305,9 +3300,7 @@ static inline uint32_t address_space_lduw_internal(AddressSpace *as,
     } else {
         /* RAM case */
         ptr = qemu_get_ram_ptr(mr->ram_block,
-                               (memory_region_get_ram_addr(mr)
-                                & TARGET_PAGE_MASK)
-                               + addr1);
+                               memory_region_get_ram_addr(mr) + addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
             val = lduw_le_p(ptr);
@@ -3389,7 +3382,7 @@ void address_space_stl_notdirty(AddressSpace *as, hwaddr addr, uint32_t val,
 
         r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
     } else {
-        addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
+        addr1 += memory_region_get_ram_addr(mr);
         ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         stl_p(ptr, val);
 
@@ -3444,7 +3437,7 @@ static inline void address_space_stl_internal(AddressSpace *as,
         r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
     } else {
         /* RAM case */
-        addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
+        addr1 += memory_region_get_ram_addr(mr);
         ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
@@ -3554,7 +3547,7 @@ static inline void address_space_stw_internal(AddressSpace *as,
         r = memory_region_dispatch_write(mr, addr1, val, 2, attrs);
     } else {
         /* RAM case */
-        addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
+        addr1 += memory_region_get_ram_addr(mr);
         ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
diff --git a/memory.c b/memory.c
index 95f7209..49c9b14 100644
--- a/memory.c
+++ b/memory.c
@@ -1640,7 +1640,7 @@ int memory_region_get_fd(MemoryRegion *mr)
 
     assert(mr->ram_block);
 
-    return qemu_get_ram_fd(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
+    return qemu_get_ram_fd(memory_region_get_ram_addr(mr));
 }
 
 void *memory_region_get_ram_ptr(MemoryRegion *mr)
@@ -1654,8 +1654,7 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr)
         mr = mr->alias;
     }
     assert(mr->ram_block);
-    ptr = qemu_get_ram_ptr(mr->ram_block,
-                           memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
+    ptr = qemu_get_ram_ptr(mr->ram_block, memory_region_get_ram_addr(mr));
     rcu_read_unlock();
 
     return ptr + offset;
diff --git a/migration/savevm.c b/migration/savevm.c
index 0a33c22..cbba062 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2229,13 +2229,13 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
 
 void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
 {
-    qemu_ram_set_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK,
+    qemu_ram_set_idstr(memory_region_get_ram_addr(mr),
                        memory_region_name(mr), dev);
 }
 
 void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
 {
-    qemu_ram_unset_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
+    qemu_ram_unset_idstr(memory_region_get_ram_addr(mr));
 }
 
 void vmstate_register_ram_global(MemoryRegion *mr)
diff --git a/translate-all.c b/translate-all.c
index e9f409b..6820d8e 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -1550,8 +1550,7 @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
         rcu_read_unlock();
         return;
     }
-    ram_addr = (memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK)
-        + addr;
+    ram_addr = memory_region_get_ram_addr(mr) + addr;
     tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
     rcu_read_unlock();
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-03-24 11:03 [Qemu-devel] [PATCH 0/2] memory: cleanup users of memory_region_get_ram_addr Paolo Bonzini
  2016-03-24 11:03 ` [Qemu-devel] [PATCH 1/2] memory: remove unnecessary masking of MemoryRegion ram_addr Paolo Bonzini
@ 2016-03-24 11:03 ` Paolo Bonzini
  2016-03-25  6:20   ` Fam Zheng
  2016-04-03 13:49   ` Michael S. Tsirkin
  1 sibling, 2 replies; 14+ messages in thread
From: Paolo Bonzini @ 2016-03-24 11:03 UTC (permalink / raw)
  To: qemu-devel; +Cc: arei.gonglei, famz, mst

Let users of qemu_get_ram_ptr and qemu_ram_ptr_length pass in an
address that is relative to the MemoryRegion.  This basically means
what address_space_translate returns.

invalidate_and_set_dirty has to add back mr->ram_addr, but reads do
not need it at all.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 exec.c                       | 40 +++++++++++++++-------------------------
 include/exec/memory.h        |  1 -
 memory.c                     |  4 ++--
 scripts/dump-guest-memory.py | 19 +++----------------
 4 files changed, 20 insertions(+), 44 deletions(-)

diff --git a/exec.c b/exec.c
index 001b669..ca9e3b6 100644
--- a/exec.c
+++ b/exec.c
@@ -1876,6 +1876,7 @@ void *qemu_get_ram_ptr(RAMBlock *ram_block, ram_addr_t addr)
 
     if (block == NULL) {
         block = qemu_get_ram_block(addr);
+        addr -= block->offset;
     }
 
     if (xen_enabled() && block->host == NULL) {
@@ -1889,7 +1890,7 @@ void *qemu_get_ram_ptr(RAMBlock *ram_block, ram_addr_t addr)
 
         block->host = xen_map_cache(block->offset, block->max_length, 1);
     }
-    return ramblock_ptr(block, addr - block->offset);
+    return ramblock_ptr(block, addr);
 }
 
 /* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
@@ -1901,16 +1902,15 @@ static void *qemu_ram_ptr_length(RAMBlock *ram_block, ram_addr_t addr,
                                  hwaddr *size)
 {
     RAMBlock *block = ram_block;
-    ram_addr_t offset_inside_block;
     if (*size == 0) {
         return NULL;
     }
 
     if (block == NULL) {
         block = qemu_get_ram_block(addr);
+        addr -= block->offset;
     }
-    offset_inside_block = addr - block->offset;
-    *size = MIN(*size, block->max_length - offset_inside_block);
+    *size = MIN(*size, block->max_length - addr);
 
     if (xen_enabled() && block->host == NULL) {
         /* We need to check if the requested address is in the RAM
@@ -1924,7 +1924,7 @@ static void *qemu_ram_ptr_length(RAMBlock *ram_block, ram_addr_t addr,
         block->host = xen_map_cache(block->offset, block->max_length, 1);
     }
 
-    return ramblock_ptr(block, offset_inside_block);
+    return ramblock_ptr(block, addr);
 }
 
 /*
@@ -2504,6 +2504,8 @@ static void invalidate_and_set_dirty(MemoryRegion *mr, hwaddr addr,
                                      hwaddr length)
 {
     uint8_t dirty_log_mask = memory_region_get_dirty_log_mask(mr);
+    addr += memory_region_get_ram_addr(mr);
+
     /* No early return if dirty_log_mask is or becomes 0, because
      * cpu_physical_memory_set_dirty_range will still call
      * xen_modified_memory.
@@ -2616,7 +2618,6 @@ static MemTxResult address_space_write_continue(AddressSpace *as, hwaddr addr,
                 abort();
             }
         } else {
-            addr1 += memory_region_get_ram_addr(mr);
             /* RAM case */
             ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
             memcpy(ptr, buf, l);
@@ -2709,8 +2710,7 @@ MemTxResult address_space_read_continue(AddressSpace *as, hwaddr addr,
             }
         } else {
             /* RAM case */
-            ptr = qemu_get_ram_ptr(mr->ram_block,
-                                   memory_region_get_ram_addr(mr) + addr1);
+            ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
             memcpy(buf, ptr, l);
         }
 
@@ -2793,7 +2793,6 @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
               memory_region_is_romd(mr))) {
             l = memory_access_size(mr, l, addr1);
         } else {
-            addr1 += memory_region_get_ram_addr(mr);
             /* ROM/RAM case */
             ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
             switch (type) {
@@ -2953,7 +2952,6 @@ void *address_space_map(AddressSpace *as,
     hwaddr done = 0;
     hwaddr l, xlat, base;
     MemoryRegion *mr, *this_mr;
-    ram_addr_t raddr;
     void *ptr;
 
     if (len == 0) {
@@ -2962,7 +2960,7 @@ void *address_space_map(AddressSpace *as,
 
     l = len;
     rcu_read_lock();
-    mr = address_space_translate(as, addr, &xlat, &l, is_write);
+    mr = address_space_translate(as, addr, &base, &l, is_write);
 
     if (!memory_access_is_direct(mr, is_write)) {
         if (atomic_xchg(&bounce.in_use, true)) {
@@ -2987,9 +2985,6 @@ void *address_space_map(AddressSpace *as,
         return bounce.buffer;
     }
 
-    base = xlat;
-    raddr = memory_region_get_ram_addr(mr);
-
     for (;;) {
         len -= l;
         addr += l;
@@ -3007,7 +3002,7 @@ void *address_space_map(AddressSpace *as,
 
     memory_region_ref(mr);
     *plen = done;
-    ptr = qemu_ram_ptr_length(mr->ram_block, raddr + base, plen);
+    ptr = qemu_ram_ptr_length(mr->ram_block, base, plen);
     rcu_read_unlock();
 
     return ptr;
@@ -3091,8 +3086,7 @@ static inline uint32_t address_space_ldl_internal(AddressSpace *as, hwaddr addr,
 #endif
     } else {
         /* RAM case */
-        ptr = qemu_get_ram_ptr(mr->ram_block,
-                               memory_region_get_ram_addr(mr) + addr1);
+        ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
             val = ldl_le_p(ptr);
@@ -3185,8 +3179,7 @@ static inline uint64_t address_space_ldq_internal(AddressSpace *as, hwaddr addr,
 #endif
     } else {
         /* RAM case */
-        ptr = qemu_get_ram_ptr(mr->ram_block,
-                               memory_region_get_ram_addr(mr) + addr1);
+        ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
             val = ldq_le_p(ptr);
@@ -3299,8 +3292,7 @@ static inline uint32_t address_space_lduw_internal(AddressSpace *as,
 #endif
     } else {
         /* RAM case */
-        ptr = qemu_get_ram_ptr(mr->ram_block,
-                               memory_region_get_ram_addr(mr) + addr1);
+        ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
             val = lduw_le_p(ptr);
@@ -3382,13 +3374,13 @@ void address_space_stl_notdirty(AddressSpace *as, hwaddr addr, uint32_t val,
 
         r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
     } else {
-        addr1 += memory_region_get_ram_addr(mr);
         ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         stl_p(ptr, val);
 
         dirty_log_mask = memory_region_get_dirty_log_mask(mr);
         dirty_log_mask &= ~(1 << DIRTY_MEMORY_CODE);
-        cpu_physical_memory_set_dirty_range(addr1, 4, dirty_log_mask);
+        cpu_physical_memory_set_dirty_range(memory_region_get_ram_addr(mr) + addr,
+                                            4, dirty_log_mask);
         r = MEMTX_OK;
     }
     if (result) {
@@ -3437,7 +3429,6 @@ static inline void address_space_stl_internal(AddressSpace *as,
         r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
     } else {
         /* RAM case */
-        addr1 += memory_region_get_ram_addr(mr);
         ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
@@ -3547,7 +3538,6 @@ static inline void address_space_stw_internal(AddressSpace *as,
         r = memory_region_dispatch_write(mr, addr1, val, 2, attrs);
     } else {
         /* RAM case */
-        addr1 += memory_region_get_ram_addr(mr);
         ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
         switch (endian) {
         case DEVICE_LITTLE_ENDIAN:
diff --git a/include/exec/memory.h b/include/exec/memory.h
index 2de7898..326c2a2 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -1419,7 +1419,6 @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,
             l = len;
             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(mr->ram_block, addr1);
                 memcpy(buf, ptr, len);
             } else {
diff --git a/memory.c b/memory.c
index 49c9b14..bc47d0b 100644
--- a/memory.c
+++ b/memory.c
@@ -1654,10 +1654,10 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr)
         mr = mr->alias;
     }
     assert(mr->ram_block);
-    ptr = qemu_get_ram_ptr(mr->ram_block, memory_region_get_ram_addr(mr));
+    ptr = qemu_get_ram_ptr(mr->ram_block, offset);
     rcu_read_unlock();
 
-    return ptr + offset;
+    return ptr;
 }
 
 ram_addr_t memory_region_get_ram_addr(MemoryRegion *mr)
diff --git a/scripts/dump-guest-memory.py b/scripts/dump-guest-memory.py
index c0a2e99..ae21f97 100644
--- a/scripts/dump-guest-memory.py
+++ b/scripts/dump-guest-memory.py
@@ -328,23 +328,10 @@ def qlist_foreach(head, field_str):
         yield var
 
 
-def qemu_get_ram_block(ram_addr):
-    """Returns the RAMBlock struct to which the given address belongs."""
-
-    ram_blocks = gdb.parse_and_eval("ram_list.blocks")
-
-    for block in qlist_foreach(ram_blocks, "next"):
-        if (ram_addr - block["offset"]) < block["used_length"]:
-            return block
-
-    raise gdb.GdbError("Bad ram offset %x" % ram_addr)
-
-
-def qemu_get_ram_ptr(ram_addr):
+def qemu_get_ram_ptr(block, offset):
     """Returns qemu vaddr for given guest physical address."""
 
-    block = qemu_get_ram_block(ram_addr)
-    return block["host"] + (ram_addr - block["offset"])
+    return block["host"] + offset
 
 
 def memory_region_get_ram_ptr(memory_region):
@@ -352,7 +339,7 @@ def memory_region_get_ram_ptr(memory_region):
         return (memory_region_get_ram_ptr(memory_region["alias"].dereference())
                 + memory_region["alias_offset"])
 
-    return qemu_get_ram_ptr(memory_region["ram_block"]["offset"])
+    return qemu_get_ram_ptr(memory_region["ram_block"], 0)
 
 
 def get_guest_phys_blocks():
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-03-24 11:03 ` [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users Paolo Bonzini
@ 2016-03-25  6:20   ` Fam Zheng
  2016-03-25 11:58     ` Paolo Bonzini
  2016-04-03 13:49   ` Michael S. Tsirkin
  1 sibling, 1 reply; 14+ messages in thread
From: Fam Zheng @ 2016-03-25  6:20 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: arei.gonglei, qemu-devel, mst

On Thu, 03/24 12:03, Paolo Bonzini wrote:
> Let users of qemu_get_ram_ptr and qemu_ram_ptr_length pass in an
> address that is relative to the MemoryRegion.  This basically means
> what address_space_translate returns.
> 
> invalidate_and_set_dirty has to add back mr->ram_addr, but reads do
> not need it at all.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  exec.c                       | 40 +++++++++++++++-------------------------
>  include/exec/memory.h        |  1 -
>  memory.c                     |  4 ++--
>  scripts/dump-guest-memory.py | 19 +++----------------
>  4 files changed, 20 insertions(+), 44 deletions(-)
> 
> diff --git a/exec.c b/exec.c
> index 001b669..ca9e3b6 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1876,6 +1876,7 @@ void *qemu_get_ram_ptr(RAMBlock *ram_block, ram_addr_t addr)

Shall we rename the parameter to "offset" then?  I don't know, but that seems
easier to read for me.

>  
>      if (block == NULL) {
>          block = qemu_get_ram_block(addr);
> +        addr -= block->offset;
>      }
>  
>      if (xen_enabled() && block->host == NULL) {
> @@ -1889,7 +1890,7 @@ void *qemu_get_ram_ptr(RAMBlock *ram_block, ram_addr_t addr)
>  
>          block->host = xen_map_cache(block->offset, block->max_length, 1);
>      }
> -    return ramblock_ptr(block, addr - block->offset);
> +    return ramblock_ptr(block, addr);
>  }
>  
>  /* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
> @@ -1901,16 +1902,15 @@ static void *qemu_ram_ptr_length(RAMBlock *ram_block, ram_addr_t addr,
>                                   hwaddr *size)
>  {
>      RAMBlock *block = ram_block;
> -    ram_addr_t offset_inside_block;
>      if (*size == 0) {
>          return NULL;
>      }
>  
>      if (block == NULL) {
>          block = qemu_get_ram_block(addr);
> +        addr -= block->offset;
>      }
> -    offset_inside_block = addr - block->offset;
> -    *size = MIN(*size, block->max_length - offset_inside_block);
> +    *size = MIN(*size, block->max_length - addr);
>  
>      if (xen_enabled() && block->host == NULL) {
>          /* We need to check if the requested address is in the RAM
> @@ -1924,7 +1924,7 @@ static void *qemu_ram_ptr_length(RAMBlock *ram_block, ram_addr_t addr,
>          block->host = xen_map_cache(block->offset, block->max_length, 1);
>      }
>  
> -    return ramblock_ptr(block, offset_inside_block);
> +    return ramblock_ptr(block, addr);
>  }
>  
>  /*
> @@ -2504,6 +2504,8 @@ static void invalidate_and_set_dirty(MemoryRegion *mr, hwaddr addr,
>                                       hwaddr length)
>  {
>      uint8_t dirty_log_mask = memory_region_get_dirty_log_mask(mr);
> +    addr += memory_region_get_ram_addr(mr);
> +

If called by address_space_unmap, is this addition still correct?

void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len,
                         int is_write, hwaddr access_len)
{
    if (buffer != bounce.buffer) {
        MemoryRegion *mr;
        ram_addr_t addr1;

        mr = qemu_ram_addr_from_host(buffer, &addr1);
        assert(mr != NULL);
        if (is_write) {
            invalidate_and_set_dirty(mr, addr1, access_len);
                                          ^
                                          `-- IIUC this is not an offset into
                                              mr, is it?

>      /* No early return if dirty_log_mask is or becomes 0, because
>       * cpu_physical_memory_set_dirty_range will still call
>       * xen_modified_memory.
> @@ -2616,7 +2618,6 @@ static MemTxResult address_space_write_continue(AddressSpace *as, hwaddr addr,
>                  abort();
>              }
>          } else {
> -            addr1 += memory_region_get_ram_addr(mr);
>              /* RAM case */
>              ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>              memcpy(ptr, buf, l);
> @@ -2709,8 +2710,7 @@ MemTxResult address_space_read_continue(AddressSpace *as, hwaddr addr,
>              }
>          } else {
>              /* RAM case */
> -            ptr = qemu_get_ram_ptr(mr->ram_block,
> -                                   memory_region_get_ram_addr(mr) + addr1);
> +            ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>              memcpy(buf, ptr, l);
>          }
>  
> @@ -3382,13 +3374,13 @@ void address_space_stl_notdirty(AddressSpace *as, hwaddr addr, uint32_t val,
>  
>          r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
>      } else {
> -        addr1 += memory_region_get_ram_addr(mr);
>          ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          stl_p(ptr, val);
>  
>          dirty_log_mask = memory_region_get_dirty_log_mask(mr);
>          dirty_log_mask &= ~(1 << DIRTY_MEMORY_CODE);
> -        cpu_physical_memory_set_dirty_range(addr1, 4, dirty_log_mask);
> +        cpu_physical_memory_set_dirty_range(memory_region_get_ram_addr(mr) + addr,

Is this line too long?

> +                                            4, dirty_log_mask);
>          r = MEMTX_OK;
>      }
>      if (result) {

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] memory: remove unnecessary masking of MemoryRegion ram_addr
  2016-03-24 11:03 ` [Qemu-devel] [PATCH 1/2] memory: remove unnecessary masking of MemoryRegion ram_addr Paolo Bonzini
@ 2016-03-25  6:20   ` Fam Zheng
  2016-04-03 13:48   ` Michael S. Tsirkin
  1 sibling, 0 replies; 14+ messages in thread
From: Fam Zheng @ 2016-03-25  6:20 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: arei.gonglei, qemu-devel, mst

On Thu, 03/24 12:03, Paolo Bonzini wrote:
> mr->ram_block->offset is already aligned to both host and target size
> (see qemu_ram_alloc_internal).  Remove further masking as it is
> unnecessary.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Fam Zheng <famz@redhat.com>

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-03-25  6:20   ` Fam Zheng
@ 2016-03-25 11:58     ` Paolo Bonzini
  2016-03-25 12:13       ` Fam Zheng
  0 siblings, 1 reply; 14+ messages in thread
From: Paolo Bonzini @ 2016-03-25 11:58 UTC (permalink / raw)
  To: Fam Zheng; +Cc: arei gonglei, qemu-devel, mst



----- Original Message -----
> From: "Fam Zheng" <famz@redhat.com>
> To: "Paolo Bonzini" <pbonzini@redhat.com>
> Cc: qemu-devel@nongnu.org, "arei gonglei" <arei.gonglei@huawei.com>, mst@redhat.com
> Sent: Friday, March 25, 2016 7:20:38 AM
> Subject: Re: [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
> 
> On Thu, 03/24 12:03, Paolo Bonzini wrote:
> > Let users of qemu_get_ram_ptr and qemu_ram_ptr_length pass in an
> > address that is relative to the MemoryRegion.  This basically means
> > what address_space_translate returns.
> > 
> > invalidate_and_set_dirty has to add back mr->ram_addr, but reads do
> > not need it at all.
> > 
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > ---
> >  exec.c                       | 40 +++++++++++++++-------------------------
> >  include/exec/memory.h        |  1 -
> >  memory.c                     |  4 ++--
> >  scripts/dump-guest-memory.py | 19 +++----------------
> >  4 files changed, 20 insertions(+), 44 deletions(-)
> > 
> > diff --git a/exec.c b/exec.c
> > index 001b669..ca9e3b6 100644
> > --- a/exec.c
> > +++ b/exec.c
> > @@ -1876,6 +1876,7 @@ void *qemu_get_ram_ptr(RAMBlock *ram_block,
> > ram_addr_t addr)
> 
> Shall we rename the parameter to "offset" then?  I don't know, but that seems
> easier to read for me.

Good question.  I'm not sure about that because of the block == NULL case,
where the address is absolute.

> > @@ -1924,7 +1924,7 @@ static void *qemu_ram_ptr_length(RAMBlock *ram_block,
> > ram_addr_t addr,
> >          block->host = xen_map_cache(block->offset, block->max_length, 1);
> >      }
> >  
> > -    return ramblock_ptr(block, offset_inside_block);
> > +    return ramblock_ptr(block, addr);
> >  }
> >  
> >  /*
> > @@ -2504,6 +2504,8 @@ static void invalidate_and_set_dirty(MemoryRegion
> > *mr, hwaddr addr,
> >                                       hwaddr length)
> >  {
> >      uint8_t dirty_log_mask = memory_region_get_dirty_log_mask(mr);
> > +    addr += memory_region_get_ram_addr(mr);
> > +
> 
> If called by address_space_unmap, is this addition still correct?

No, thanks for the careful review!  That's another opportunity
for cleanup actually, splitting the (few) users of qemu_ram_addr_from_host
that really need a ram_addr_t and those (the majority) that need a
MemoryRegion and offset.  They can use two different functions.  I'll
defer this to 2.7 and post the patches to do so later.

> > @@ -3382,13 +3374,13 @@ void address_space_stl_notdirty(AddressSpace *as,
> > hwaddr addr, uint32_t val,
> >  
> >          r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
> >      } else {
> > -        addr1 += memory_region_get_ram_addr(mr);
> >          ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
> >          stl_p(ptr, val);
> >  
> >          dirty_log_mask = memory_region_get_dirty_log_mask(mr);
> >          dirty_log_mask &= ~(1 << DIRTY_MEMORY_CODE);
> > -        cpu_physical_memory_set_dirty_range(addr1, 4, dirty_log_mask);
> > +        cpu_physical_memory_set_dirty_range(memory_region_get_ram_addr(mr)
> > + addr,
> 
> Is this line too long?

It's 82 characters

Paolo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-03-25 11:58     ` Paolo Bonzini
@ 2016-03-25 12:13       ` Fam Zheng
  2016-03-25 12:19         ` Paolo Bonzini
  0 siblings, 1 reply; 14+ messages in thread
From: Fam Zheng @ 2016-03-25 12:13 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: arei gonglei, qemu-devel, mst

On Fri, 03/25 07:58, Paolo Bonzini wrote:
> 
> 
> ----- Original Message -----
> > From: "Fam Zheng" <famz@redhat.com>
> > To: "Paolo Bonzini" <pbonzini@redhat.com>
> > Cc: qemu-devel@nongnu.org, "arei gonglei" <arei.gonglei@huawei.com>, mst@redhat.com
> > Sent: Friday, March 25, 2016 7:20:38 AM
> > Subject: Re: [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
> > 
> > On Thu, 03/24 12:03, Paolo Bonzini wrote:
> > > Let users of qemu_get_ram_ptr and qemu_ram_ptr_length pass in an
> > > address that is relative to the MemoryRegion.  This basically means
> > > what address_space_translate returns.
> > > 
> > > invalidate_and_set_dirty has to add back mr->ram_addr, but reads do
> > > not need it at all.
> > > 
> > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > > ---
> > >  exec.c                       | 40 +++++++++++++++-------------------------
> > >  include/exec/memory.h        |  1 -
> > >  memory.c                     |  4 ++--
> > >  scripts/dump-guest-memory.py | 19 +++----------------
> > >  4 files changed, 20 insertions(+), 44 deletions(-)
> > > 
> > > diff --git a/exec.c b/exec.c
> > > index 001b669..ca9e3b6 100644
> > > --- a/exec.c
> > > +++ b/exec.c
> > > @@ -1876,6 +1876,7 @@ void *qemu_get_ram_ptr(RAMBlock *ram_block,
> > > ram_addr_t addr)
> > 
> > Shall we rename the parameter to "offset" then?  I don't know, but that seems
> > easier to read for me.
> 
> Good question.  I'm not sure about that because of the block == NULL case,
> where the address is absolute.
> 
> > > @@ -1924,7 +1924,7 @@ static void *qemu_ram_ptr_length(RAMBlock *ram_block,
> > > ram_addr_t addr,
> > >          block->host = xen_map_cache(block->offset, block->max_length, 1);
> > >      }
> > >  
> > > -    return ramblock_ptr(block, offset_inside_block);
> > > +    return ramblock_ptr(block, addr);
> > >  }
> > >  
> > >  /*
> > > @@ -2504,6 +2504,8 @@ static void invalidate_and_set_dirty(MemoryRegion
> > > *mr, hwaddr addr,
> > >                                       hwaddr length)
> > >  {
> > >      uint8_t dirty_log_mask = memory_region_get_dirty_log_mask(mr);
> > > +    addr += memory_region_get_ram_addr(mr);
> > > +
> > 
> > If called by address_space_unmap, is this addition still correct?
> 
> No, thanks for the careful review!  That's another opportunity
> for cleanup actually, splitting the (few) users of qemu_ram_addr_from_host
> that really need a ram_addr_t and those (the majority) that need a
> MemoryRegion and offset.  They can use two different functions.  I'll
> defer this to 2.7 and post the patches to do so later.

Good idea. The above "block == NULL" qemu_get_ram_ptr callers could use a
separate function, too - frankly I don't like that function interface too much.
What do you think?

Fam

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-03-25 12:13       ` Fam Zheng
@ 2016-03-25 12:19         ` Paolo Bonzini
  0 siblings, 0 replies; 14+ messages in thread
From: Paolo Bonzini @ 2016-03-25 12:19 UTC (permalink / raw)
  To: Fam Zheng; +Cc: arei gonglei, qemu-devel, mst

> > > If called by address_space_unmap, is this addition still correct?
> > 
> > No, thanks for the careful review!  That's another opportunity
> > for cleanup actually, splitting the (few) users of qemu_ram_addr_from_host
> > that really need a ram_addr_t and those (the majority) that need a
> > MemoryRegion and offset.  They can use two different functions.  I'll
> > defer this to 2.7 and post the patches to do so later.
> 
> Good idea. The above "block == NULL" qemu_get_ram_ptr callers could use a
> separate function, too - frankly I don't like that function interface too
> much.
> What do you think?

I don't know, at least block == NULL has a clear meaning.  It's not entirely
satisfying, but the users are readable and the ones that pass NULL stand out.

In the case of qemu_ram_addr_from_host, on the other hand, there's a clear
opportunity to avoid bugs.

Paolo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] memory: remove unnecessary masking of MemoryRegion ram_addr
  2016-03-24 11:03 ` [Qemu-devel] [PATCH 1/2] memory: remove unnecessary masking of MemoryRegion ram_addr Paolo Bonzini
  2016-03-25  6:20   ` Fam Zheng
@ 2016-04-03 13:48   ` Michael S. Tsirkin
  1 sibling, 0 replies; 14+ messages in thread
From: Michael S. Tsirkin @ 2016-04-03 13:48 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: arei.gonglei, famz, qemu-devel

On Thu, Mar 24, 2016 at 12:03:34PM +0100, Paolo Bonzini wrote:
> mr->ram_block->offset is already aligned to both host and target size
> (see qemu_ram_alloc_internal).  Remove further masking as it is
> unnecessary.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

> ---
>  exec.c             | 21 +++++++--------------
>  memory.c           |  5 ++---
>  migration/savevm.c |  4 ++--
>  translate-all.c    |  3 +--
>  4 files changed, 12 insertions(+), 21 deletions(-)
> 
> diff --git a/exec.c b/exec.c
> index f398d21..001b669 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1042,8 +1042,7 @@ hwaddr memory_region_section_get_iotlb(CPUState *cpu,
>  
>      if (memory_region_is_ram(section->mr)) {
>          /* Normal RAM.  */
> -        iotlb = (memory_region_get_ram_addr(section->mr) & TARGET_PAGE_MASK)
> -            + xlat;
> +        iotlb = memory_region_get_ram_addr(section->mr) + xlat;
>          if (!section->readonly) {
>              iotlb |= PHYS_SECTION_NOTDIRTY;
>          } else {
> @@ -3093,9 +3092,7 @@ static inline uint32_t address_space_ldl_internal(AddressSpace *as, hwaddr addr,
>      } else {
>          /* RAM case */
>          ptr = qemu_get_ram_ptr(mr->ram_block,
> -                               (memory_region_get_ram_addr(mr)
> -                                & TARGET_PAGE_MASK)
> -                               + addr1);
> +                               memory_region_get_ram_addr(mr) + addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
>              val = ldl_le_p(ptr);
> @@ -3189,9 +3186,7 @@ static inline uint64_t address_space_ldq_internal(AddressSpace *as, hwaddr addr,
>      } else {
>          /* RAM case */
>          ptr = qemu_get_ram_ptr(mr->ram_block,
> -                               (memory_region_get_ram_addr(mr)
> -                                & TARGET_PAGE_MASK)
> -                               + addr1);
> +                               memory_region_get_ram_addr(mr) + addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
>              val = ldq_le_p(ptr);
> @@ -3305,9 +3300,7 @@ static inline uint32_t address_space_lduw_internal(AddressSpace *as,
>      } else {
>          /* RAM case */
>          ptr = qemu_get_ram_ptr(mr->ram_block,
> -                               (memory_region_get_ram_addr(mr)
> -                                & TARGET_PAGE_MASK)
> -                               + addr1);
> +                               memory_region_get_ram_addr(mr) + addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
>              val = lduw_le_p(ptr);
> @@ -3389,7 +3382,7 @@ void address_space_stl_notdirty(AddressSpace *as, hwaddr addr, uint32_t val,
>  
>          r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
>      } else {
> -        addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
> +        addr1 += memory_region_get_ram_addr(mr);
>          ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          stl_p(ptr, val);
>  
> @@ -3444,7 +3437,7 @@ static inline void address_space_stl_internal(AddressSpace *as,
>          r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
>      } else {
>          /* RAM case */
> -        addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
> +        addr1 += memory_region_get_ram_addr(mr);
>          ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
> @@ -3554,7 +3547,7 @@ static inline void address_space_stw_internal(AddressSpace *as,
>          r = memory_region_dispatch_write(mr, addr1, val, 2, attrs);
>      } else {
>          /* RAM case */
> -        addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
> +        addr1 += memory_region_get_ram_addr(mr);
>          ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
> diff --git a/memory.c b/memory.c
> index 95f7209..49c9b14 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1640,7 +1640,7 @@ int memory_region_get_fd(MemoryRegion *mr)
>  
>      assert(mr->ram_block);
>  
> -    return qemu_get_ram_fd(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
> +    return qemu_get_ram_fd(memory_region_get_ram_addr(mr));
>  }
>  
>  void *memory_region_get_ram_ptr(MemoryRegion *mr)
> @@ -1654,8 +1654,7 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr)
>          mr = mr->alias;
>      }
>      assert(mr->ram_block);
> -    ptr = qemu_get_ram_ptr(mr->ram_block,
> -                           memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
> +    ptr = qemu_get_ram_ptr(mr->ram_block, memory_region_get_ram_addr(mr));
>      rcu_read_unlock();
>  
>      return ptr + offset;
> diff --git a/migration/savevm.c b/migration/savevm.c
> index 0a33c22..cbba062 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -2229,13 +2229,13 @@ void hmp_info_snapshots(Monitor *mon, const QDict *qdict)
>  
>  void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
>  {
> -    qemu_ram_set_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK,
> +    qemu_ram_set_idstr(memory_region_get_ram_addr(mr),
>                         memory_region_name(mr), dev);
>  }
>  
>  void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
>  {
> -    qemu_ram_unset_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
> +    qemu_ram_unset_idstr(memory_region_get_ram_addr(mr));
>  }
>  
>  void vmstate_register_ram_global(MemoryRegion *mr)
> diff --git a/translate-all.c b/translate-all.c
> index e9f409b..6820d8e 100644
> --- a/translate-all.c
> +++ b/translate-all.c
> @@ -1550,8 +1550,7 @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
>          rcu_read_unlock();
>          return;
>      }
> -    ram_addr = (memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK)
> -        + addr;
> +    ram_addr = memory_region_get_ram_addr(mr) + addr;
>      tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
>      rcu_read_unlock();
>  }
> -- 
> 1.8.3.1
> 

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-03-24 11:03 ` [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users Paolo Bonzini
  2016-03-25  6:20   ` Fam Zheng
@ 2016-04-03 13:49   ` Michael S. Tsirkin
  2016-04-03 17:14     ` Paolo Bonzini
  2016-04-04  8:03     ` Paolo Bonzini
  1 sibling, 2 replies; 14+ messages in thread
From: Michael S. Tsirkin @ 2016-04-03 13:49 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: arei.gonglei, famz, qemu-devel

On Thu, Mar 24, 2016 at 12:03:35PM +0100, Paolo Bonzini wrote:
> Let users of qemu_get_ram_ptr and qemu_ram_ptr_length pass in an
> address that is relative to the MemoryRegion.  This basically means
> what address_space_translate returns.
> 
> invalidate_and_set_dirty has to add back mr->ram_addr, but reads do
> not need it at all.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>


I agree but I think we need a better name for this function.
qemu_ram_offset_to_ptr?
Will also serve to make sure backporting patches across this
API change does not cause issues.


> ---
>  exec.c                       | 40 +++++++++++++++-------------------------
>  include/exec/memory.h        |  1 -
>  memory.c                     |  4 ++--
>  scripts/dump-guest-memory.py | 19 +++----------------
>  4 files changed, 20 insertions(+), 44 deletions(-)
> 
> diff --git a/exec.c b/exec.c
> index 001b669..ca9e3b6 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1876,6 +1876,7 @@ void *qemu_get_ram_ptr(RAMBlock *ram_block, ram_addr_t addr)
>  
>      if (block == NULL) {
>          block = qemu_get_ram_block(addr);
> +        addr -= block->offset;
>      }
>  
>      if (xen_enabled() && block->host == NULL) {
> @@ -1889,7 +1890,7 @@ void *qemu_get_ram_ptr(RAMBlock *ram_block, ram_addr_t addr)
>  
>          block->host = xen_map_cache(block->offset, block->max_length, 1);
>      }
> -    return ramblock_ptr(block, addr - block->offset);
> +    return ramblock_ptr(block, addr);
>  }
>  
>  /* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
> @@ -1901,16 +1902,15 @@ static void *qemu_ram_ptr_length(RAMBlock *ram_block, ram_addr_t addr,
>                                   hwaddr *size)
>  {
>      RAMBlock *block = ram_block;
> -    ram_addr_t offset_inside_block;
>      if (*size == 0) {
>          return NULL;
>      }
>  
>      if (block == NULL) {
>          block = qemu_get_ram_block(addr);
> +        addr -= block->offset;
>      }
> -    offset_inside_block = addr - block->offset;
> -    *size = MIN(*size, block->max_length - offset_inside_block);
> +    *size = MIN(*size, block->max_length - addr);
>  
>      if (xen_enabled() && block->host == NULL) {
>          /* We need to check if the requested address is in the RAM
> @@ -1924,7 +1924,7 @@ static void *qemu_ram_ptr_length(RAMBlock *ram_block, ram_addr_t addr,
>          block->host = xen_map_cache(block->offset, block->max_length, 1);
>      }
>  
> -    return ramblock_ptr(block, offset_inside_block);
> +    return ramblock_ptr(block, addr);
>  }
>  
>  /*
> @@ -2504,6 +2504,8 @@ static void invalidate_and_set_dirty(MemoryRegion *mr, hwaddr addr,
>                                       hwaddr length)
>  {
>      uint8_t dirty_log_mask = memory_region_get_dirty_log_mask(mr);
> +    addr += memory_region_get_ram_addr(mr);
> +
>      /* No early return if dirty_log_mask is or becomes 0, because
>       * cpu_physical_memory_set_dirty_range will still call
>       * xen_modified_memory.
> @@ -2616,7 +2618,6 @@ static MemTxResult address_space_write_continue(AddressSpace *as, hwaddr addr,
>                  abort();
>              }
>          } else {
> -            addr1 += memory_region_get_ram_addr(mr);
>              /* RAM case */
>              ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>              memcpy(ptr, buf, l);
> @@ -2709,8 +2710,7 @@ MemTxResult address_space_read_continue(AddressSpace *as, hwaddr addr,
>              }
>          } else {
>              /* RAM case */
> -            ptr = qemu_get_ram_ptr(mr->ram_block,
> -                                   memory_region_get_ram_addr(mr) + addr1);
> +            ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>              memcpy(buf, ptr, l);
>          }
>  
> @@ -2793,7 +2793,6 @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
>                memory_region_is_romd(mr))) {
>              l = memory_access_size(mr, l, addr1);
>          } else {
> -            addr1 += memory_region_get_ram_addr(mr);
>              /* ROM/RAM case */
>              ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>              switch (type) {
> @@ -2953,7 +2952,6 @@ void *address_space_map(AddressSpace *as,
>      hwaddr done = 0;
>      hwaddr l, xlat, base;
>      MemoryRegion *mr, *this_mr;
> -    ram_addr_t raddr;
>      void *ptr;
>  
>      if (len == 0) {
> @@ -2962,7 +2960,7 @@ void *address_space_map(AddressSpace *as,
>  
>      l = len;
>      rcu_read_lock();
> -    mr = address_space_translate(as, addr, &xlat, &l, is_write);
> +    mr = address_space_translate(as, addr, &base, &l, is_write);
>  
>      if (!memory_access_is_direct(mr, is_write)) {
>          if (atomic_xchg(&bounce.in_use, true)) {
> @@ -2987,9 +2985,6 @@ void *address_space_map(AddressSpace *as,
>          return bounce.buffer;
>      }
>  
> -    base = xlat;
> -    raddr = memory_region_get_ram_addr(mr);
> -
>      for (;;) {
>          len -= l;
>          addr += l;
> @@ -3007,7 +3002,7 @@ void *address_space_map(AddressSpace *as,
>  
>      memory_region_ref(mr);
>      *plen = done;
> -    ptr = qemu_ram_ptr_length(mr->ram_block, raddr + base, plen);
> +    ptr = qemu_ram_ptr_length(mr->ram_block, base, plen);
>      rcu_read_unlock();
>  
>      return ptr;
> @@ -3091,8 +3086,7 @@ static inline uint32_t address_space_ldl_internal(AddressSpace *as, hwaddr addr,
>  #endif
>      } else {
>          /* RAM case */
> -        ptr = qemu_get_ram_ptr(mr->ram_block,
> -                               memory_region_get_ram_addr(mr) + addr1);
> +        ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
>              val = ldl_le_p(ptr);
> @@ -3185,8 +3179,7 @@ static inline uint64_t address_space_ldq_internal(AddressSpace *as, hwaddr addr,
>  #endif
>      } else {
>          /* RAM case */
> -        ptr = qemu_get_ram_ptr(mr->ram_block,
> -                               memory_region_get_ram_addr(mr) + addr1);
> +        ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
>              val = ldq_le_p(ptr);
> @@ -3299,8 +3292,7 @@ static inline uint32_t address_space_lduw_internal(AddressSpace *as,
>  #endif
>      } else {
>          /* RAM case */
> -        ptr = qemu_get_ram_ptr(mr->ram_block,
> -                               memory_region_get_ram_addr(mr) + addr1);
> +        ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
>              val = lduw_le_p(ptr);
> @@ -3382,13 +3374,13 @@ void address_space_stl_notdirty(AddressSpace *as, hwaddr addr, uint32_t val,
>  
>          r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
>      } else {
> -        addr1 += memory_region_get_ram_addr(mr);
>          ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          stl_p(ptr, val);
>  
>          dirty_log_mask = memory_region_get_dirty_log_mask(mr);
>          dirty_log_mask &= ~(1 << DIRTY_MEMORY_CODE);
> -        cpu_physical_memory_set_dirty_range(addr1, 4, dirty_log_mask);
> +        cpu_physical_memory_set_dirty_range(memory_region_get_ram_addr(mr) + addr,
> +                                            4, dirty_log_mask);
>          r = MEMTX_OK;
>      }
>      if (result) {
> @@ -3437,7 +3429,6 @@ static inline void address_space_stl_internal(AddressSpace *as,
>          r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
>      } else {
>          /* RAM case */
> -        addr1 += memory_region_get_ram_addr(mr);
>          ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
> @@ -3547,7 +3538,6 @@ static inline void address_space_stw_internal(AddressSpace *as,
>          r = memory_region_dispatch_write(mr, addr1, val, 2, attrs);
>      } else {
>          /* RAM case */
> -        addr1 += memory_region_get_ram_addr(mr);
>          ptr = qemu_get_ram_ptr(mr->ram_block, addr1);
>          switch (endian) {
>          case DEVICE_LITTLE_ENDIAN:
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index 2de7898..326c2a2 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -1419,7 +1419,6 @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,
>              l = len;
>              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(mr->ram_block, addr1);
>                  memcpy(buf, ptr, len);
>              } else {
> diff --git a/memory.c b/memory.c
> index 49c9b14..bc47d0b 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -1654,10 +1654,10 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr)
>          mr = mr->alias;
>      }
>      assert(mr->ram_block);
> -    ptr = qemu_get_ram_ptr(mr->ram_block, memory_region_get_ram_addr(mr));
> +    ptr = qemu_get_ram_ptr(mr->ram_block, offset);
>      rcu_read_unlock();
>  
> -    return ptr + offset;
> +    return ptr;
>  }
>  
>  ram_addr_t memory_region_get_ram_addr(MemoryRegion *mr)
> diff --git a/scripts/dump-guest-memory.py b/scripts/dump-guest-memory.py
> index c0a2e99..ae21f97 100644
> --- a/scripts/dump-guest-memory.py
> +++ b/scripts/dump-guest-memory.py
> @@ -328,23 +328,10 @@ def qlist_foreach(head, field_str):
>          yield var
>  
>  
> -def qemu_get_ram_block(ram_addr):
> -    """Returns the RAMBlock struct to which the given address belongs."""
> -
> -    ram_blocks = gdb.parse_and_eval("ram_list.blocks")
> -
> -    for block in qlist_foreach(ram_blocks, "next"):
> -        if (ram_addr - block["offset"]) < block["used_length"]:
> -            return block
> -
> -    raise gdb.GdbError("Bad ram offset %x" % ram_addr)
> -
> -
> -def qemu_get_ram_ptr(ram_addr):
> +def qemu_get_ram_ptr(block, offset):
>      """Returns qemu vaddr for given guest physical address."""
>  
> -    block = qemu_get_ram_block(ram_addr)
> -    return block["host"] + (ram_addr - block["offset"])
> +    return block["host"] + offset
>  
>  
>  def memory_region_get_ram_ptr(memory_region):
> @@ -352,7 +339,7 @@ def memory_region_get_ram_ptr(memory_region):
>          return (memory_region_get_ram_ptr(memory_region["alias"].dereference())
>                  + memory_region["alias_offset"])
>  
> -    return qemu_get_ram_ptr(memory_region["ram_block"]["offset"])
> +    return qemu_get_ram_ptr(memory_region["ram_block"], 0)
>  
>  
>  def get_guest_phys_blocks():
> -- 
> 1.8.3.1

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-04-03 13:49   ` Michael S. Tsirkin
@ 2016-04-03 17:14     ` Paolo Bonzini
  2016-04-04  8:03     ` Paolo Bonzini
  1 sibling, 0 replies; 14+ messages in thread
From: Paolo Bonzini @ 2016-04-03 17:14 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: arei.gonglei, famz, qemu-devel



On 03/04/2016 15:49, Michael S. Tsirkin wrote:
> 
> I agree but I think we need a better name for this function.
> qemu_ram_offset_to_ptr?
> Will also serve to make sure backporting patches across this
> API change does not cause issues.

Yes, this makes sense.  If it were all in 2.6, there would be no
released version with an absolute ram_addr_t argument *and* a RAMBlock*
argument, but we will do the incompatible change in 2.7 and then it
makes sense to rename it.

Paolo

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-04-03 13:49   ` Michael S. Tsirkin
  2016-04-03 17:14     ` Paolo Bonzini
@ 2016-04-04  8:03     ` Paolo Bonzini
  2016-04-04  8:38       ` Michael S. Tsirkin
  1 sibling, 1 reply; 14+ messages in thread
From: Paolo Bonzini @ 2016-04-04  8:03 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: arei.gonglei, famz, qemu-devel



On 03/04/2016 15:49, Michael S. Tsirkin wrote:
> I agree but I think we need a better name for this function.
> qemu_ram_offset_to_ptr?

What about qemu_map_ram_ptr?

Paolo

> Will also serve to make sure backporting patches across this
> API change does not cause issues.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-04-04  8:03     ` Paolo Bonzini
@ 2016-04-04  8:38       ` Michael S. Tsirkin
  2016-04-04  9:02         ` Paolo Bonzini
  0 siblings, 1 reply; 14+ messages in thread
From: Michael S. Tsirkin @ 2016-04-04  8:38 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: arei.gonglei, famz, qemu-devel

On Mon, Apr 04, 2016 at 10:03:12AM +0200, Paolo Bonzini wrote:
> 
> 
> On 03/04/2016 15:49, Michael S. Tsirkin wrote:
> > I agree but I think we need a better name for this function.
> > qemu_ram_offset_to_ptr?
> 
> What about qemu_map_ram_ptr?
> 
> Paolo

OK but this seems to imply there's also an unmap operation?

> > Will also serve to make sure backporting patches across this
> > API change does not cause issues.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users
  2016-04-04  8:38       ` Michael S. Tsirkin
@ 2016-04-04  9:02         ` Paolo Bonzini
  0 siblings, 0 replies; 14+ messages in thread
From: Paolo Bonzini @ 2016-04-04  9:02 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: arei.gonglei, famz, qemu-devel



On 04/04/2016 10:38, Michael S. Tsirkin wrote:
> > > I agree but I think we need a better name for this function.
> > > qemu_ram_offset_to_ptr?
> > 
> > What about qemu_map_ram_ptr?
> > 
> > Paolo
> 
> OK but this seems to imply there's also an unmap operation?

Actually there is one, even though it's almost always a nop---it's
xen_invalidate_map_cache_entry.

Paolo

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2016-04-04  9:02 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-24 11:03 [Qemu-devel] [PATCH 0/2] memory: cleanup users of memory_region_get_ram_addr Paolo Bonzini
2016-03-24 11:03 ` [Qemu-devel] [PATCH 1/2] memory: remove unnecessary masking of MemoryRegion ram_addr Paolo Bonzini
2016-03-25  6:20   ` Fam Zheng
2016-04-03 13:48   ` Michael S. Tsirkin
2016-03-24 11:03 ` [Qemu-devel] [PATCH 2/2] memory: hide mr->ram_addr from qemu_get_ram_ptr users Paolo Bonzini
2016-03-25  6:20   ` Fam Zheng
2016-03-25 11:58     ` Paolo Bonzini
2016-03-25 12:13       ` Fam Zheng
2016-03-25 12:19         ` Paolo Bonzini
2016-04-03 13:49   ` Michael S. Tsirkin
2016-04-03 17:14     ` Paolo Bonzini
2016-04-04  8:03     ` Paolo Bonzini
2016-04-04  8:38       ` Michael S. Tsirkin
2016-04-04  9:02         ` Paolo Bonzini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.