All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18
@ 2014-06-18 13:41 Paolo Bonzini
  2014-06-18 13:41 ` [Qemu-devel] [PULL 01/11] MAINTAINERS: Add myself as Memory API maintainer Paolo Bonzini
                   ` (11 more replies)
  0 siblings, 12 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:41 UTC (permalink / raw)
  To: qemu-devel

The following changes since commit af44da87e926ff64260b95f4350d338c4fc113ca:

  Merge remote-tracking branch 'remotes/agraf/tags/signed-ppc-for-upstream' into staging (2014-06-16 18:26:21 +0100)

are available in the git repository at:


  git://github.com/bonzini/qemu.git memory

for you to fetch changes up to 9b7958d31fa8d1fa3f97cadae0c06964aaae5539:

  memory: Don't call memory_region_update_coalesced_range if nothing changed (2014-06-17 17:11:21 +0200)

I don't think QOMification will make it into 2.1, so I'm sending this out early.
If all the prerequisite get in timely, I will send another pull request.

----------------------------------------------------------------
Fam Zheng (1):
      memory: Don't call memory_region_update_coalesced_range if nothing changed

Gonglei (1):
      memory: Don't update all memory region when ioeventfd changed

Hu Tao (2):
      exec: introduce qemu_ram_unset_idstr() to unset RAMBlock idstr
      unset RAMBlock idstr when unregister MemoryRegion

Paolo Bonzini (2):
      MAINTAINERS: Add myself as Memory API maintainer
      memory: MemoryRegion: rename parent to container

Peter Crosthwaite (4):
      memory: Simplify mr_add_subregion() if-else
      exec: dummy_section: Pass address space through.
      memory: MemoryRegion: factor out subregion add functionality
      memory: MemoryRegion: factor out memory region re-adder

Sergey Fedorov (1):
      qtest: fix qtest_clock_warp() for no deadline case

 MAINTAINERS               |  10 +++++
 cpus.c                    |   2 +-
 exec.c                    |  40 ++++++++++++-----
 include/exec/cpu-common.h |   1 +
 include/exec/memory.h     |  20 ++++-----
 memory.c                  | 110 ++++++++++++++++++++++++++++------------------
 savevm.c                  |   2 +-
 7 files changed, 119 insertions(+), 66 deletions(-)
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 01/11] MAINTAINERS: Add myself as Memory API maintainer
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
@ 2014-06-18 13:41 ` Paolo Bonzini
  2014-06-18 13:41 ` [Qemu-devel] [PULL 02/11] exec: introduce qemu_ram_unset_idstr() to unset RAMBlock idstr Paolo Bonzini
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:41 UTC (permalink / raw)
  To: qemu-devel

I'm not including Avi since he has already removed himself from the
KVM entry.  I'm not going to commit my patches without review.

Acked-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 MAINTAINERS | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 51a6f51..d1a3405 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -726,6 +726,16 @@ S: Odd Fixes
 F: gdbstub*
 F: gdb-xml/
 
+Memory API
+M: Paolo Bonzini <pbonzini@redhat.com>
+S: Supported
+F: include/exec/ioport.h
+F: ioport.c
+F: include/exec/memory.h
+F: memory.c
+F: include/exec/memory-internal.h
+F: exec.c
+
 SPICE
 M: Gerd Hoffmann <kraxel@redhat.com>
 S: Supported
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 02/11] exec: introduce qemu_ram_unset_idstr() to unset RAMBlock idstr
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
  2014-06-18 13:41 ` [Qemu-devel] [PULL 01/11] MAINTAINERS: Add myself as Memory API maintainer Paolo Bonzini
@ 2014-06-18 13:41 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 03/11] unset RAMBlock idstr when unregister MemoryRegion Paolo Bonzini
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: Hu Tao

From: Hu Tao <hutao@cn.fujitsu.com>

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 exec.c                    | 26 +++++++++++++++++++++-----
 include/exec/cpu-common.h |  1 +
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/exec.c b/exec.c
index 4e179a6..6ce989a 100644
--- a/exec.c
+++ b/exec.c
@@ -1201,17 +1201,24 @@ static void qemu_ram_setup_dump(void *addr, ram_addr_t size)
     }
 }
 
-void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev)
+static RAMBlock *find_ram_block(ram_addr_t addr)
 {
-    RAMBlock *new_block, *block;
+    RAMBlock *block;
 
-    new_block = NULL;
     QTAILQ_FOREACH(block, &ram_list.blocks, next) {
         if (block->offset == addr) {
-            new_block = block;
-            break;
+            return block;
         }
     }
+
+    return NULL;
+}
+
+void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev)
+{
+    RAMBlock *new_block = find_ram_block(addr);
+    RAMBlock *block;
+
     assert(new_block);
     assert(!new_block->idstr[0]);
 
@@ -1236,6 +1243,15 @@ void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev)
     qemu_mutex_unlock_ramlist();
 }
 
+void qemu_ram_unset_idstr(ram_addr_t addr)
+{
+    RAMBlock *block = find_ram_block(addr);
+
+    if (block) {
+        memset(block->idstr, 0, sizeof(block->idstr));
+    }
+}
+
 static int memory_try_enable_merging(void *addr, size_t len)
 {
     if (!qemu_opt_get_bool(qemu_get_machine_opts(), "mem-merge", true)) {
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
index a21b65a..89ec640 100644
--- a/include/exec/cpu-common.h
+++ b/include/exec/cpu-common.h
@@ -54,6 +54,7 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length);
 /* This should not be used by devices.  */
 MemoryRegion *qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr);
 void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev);
+void qemu_ram_unset_idstr(ram_addr_t addr);
 
 void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,
                             int len, int is_write);
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 03/11] unset RAMBlock idstr when unregister MemoryRegion
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
  2014-06-18 13:41 ` [Qemu-devel] [PULL 01/11] MAINTAINERS: Add myself as Memory API maintainer Paolo Bonzini
  2014-06-18 13:41 ` [Qemu-devel] [PULL 02/11] exec: introduce qemu_ram_unset_idstr() to unset RAMBlock idstr Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 04/11] memory: Don't update all memory region when ioeventfd changed Paolo Bonzini
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel; +Cc: Hu Tao

From: Hu Tao <hutao@cn.fujitsu.com>

Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 savevm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/savevm.c b/savevm.c
index da8aa24..7b2c410 100644
--- a/savevm.c
+++ b/savevm.c
@@ -1209,7 +1209,7 @@ void vmstate_register_ram(MemoryRegion *mr, DeviceState *dev)
 
 void vmstate_unregister_ram(MemoryRegion *mr, DeviceState *dev)
 {
-    /* Nothing do to while the implementation is in RAMBlock */
+    qemu_ram_unset_idstr(memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK);
 }
 
 void vmstate_register_ram_global(MemoryRegion *mr)
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 04/11] memory: Don't update all memory region when ioeventfd changed
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (2 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 03/11] unset RAMBlock idstr when unregister MemoryRegion Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 05/11] memory: Simplify mr_add_subregion() if-else Paolo Bonzini
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gonglei, Herongguang

From: Gonglei <arei.gonglei@huawei.com>

memory mappings don't rely on ioeventfds, there is no need
to destroy and rebuild them when manipulating ioeventfds,
otherwise it scarifies performance.

according to testing result, each ioeventfd deleing needs
about 5ms, within which memory mapping rebuilding needs
about 4ms. With many Nics and vmchannel in a VM doing migrating,
there can be many ioeventfds deleting which increasing
downtime remarkably.

Signed-off-by: Gonglei <arei.gonglei@huawei.com>
Signed-off-by: Herongguang <herongguang.he@huawei.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 memory.c | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/memory.c b/memory.c
index 678661e..829d56d 100644
--- a/memory.c
+++ b/memory.c
@@ -28,6 +28,7 @@
 
 static unsigned memory_region_transaction_depth;
 static bool memory_region_update_pending;
+static bool ioeventfd_update_pending;
 static bool global_dirty_log = false;
 
 /* flat_view_mutex is taken around reading as->current_map; the critical
@@ -786,22 +787,34 @@ void memory_region_transaction_begin(void)
     ++memory_region_transaction_depth;
 }
 
+static void memory_region_clear_pending(void)
+{
+    memory_region_update_pending = false;
+    ioeventfd_update_pending = false;
+}
+
 void memory_region_transaction_commit(void)
 {
     AddressSpace *as;
 
     assert(memory_region_transaction_depth);
     --memory_region_transaction_depth;
-    if (!memory_region_transaction_depth && memory_region_update_pending) {
-        memory_region_update_pending = false;
-        MEMORY_LISTENER_CALL_GLOBAL(begin, Forward);
+    if (!memory_region_transaction_depth) {
+        if (memory_region_update_pending) {
+            MEMORY_LISTENER_CALL_GLOBAL(begin, Forward);
 
-        QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
-            address_space_update_topology(as);
-        }
+            QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+                address_space_update_topology(as);
+            }
 
-        MEMORY_LISTENER_CALL_GLOBAL(commit, Forward);
-    }
+            MEMORY_LISTENER_CALL_GLOBAL(commit, Forward);
+        } else if (ioeventfd_update_pending) {
+            QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+                address_space_update_ioeventfds(as);
+            }
+        }
+        memory_region_clear_pending();
+   }
 }
 
 static void memory_region_destructor_none(MemoryRegion *mr)
@@ -1373,7 +1386,7 @@ void memory_region_add_eventfd(MemoryRegion *mr,
     memmove(&mr->ioeventfds[i+1], &mr->ioeventfds[i],
             sizeof(*mr->ioeventfds) * (mr->ioeventfd_nb-1 - i));
     mr->ioeventfds[i] = mrfd;
-    memory_region_update_pending |= mr->enabled;
+    ioeventfd_update_pending |= mr->enabled;
     memory_region_transaction_commit();
 }
 
@@ -1406,7 +1419,7 @@ void memory_region_del_eventfd(MemoryRegion *mr,
     --mr->ioeventfd_nb;
     mr->ioeventfds = g_realloc(mr->ioeventfds,
                                   sizeof(*mr->ioeventfds)*mr->ioeventfd_nb + 1);
-    memory_region_update_pending |= mr->enabled;
+    ioeventfd_update_pending |= mr->enabled;
     memory_region_transaction_commit();
 }
 
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 05/11] memory: Simplify mr_add_subregion() if-else
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (3 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 04/11] memory: Don't update all memory region when ioeventfd changed Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 06/11] exec: dummy_section: Pass address space through Paolo Bonzini
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Crosthwaite

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

This if else is not needed. The previous call to memory_region_add
(whether _overlap or not) will always set priority and may_overlap
to desired values. And its not possible to get here without having
called memory_region_add_subregion due to the null guard on parent.
So we can just directly call memory_region_add_subregion_common.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 memory.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/memory.c b/memory.c
index 829d56d..3811bd1 100644
--- a/memory.c
+++ b/memory.c
@@ -1514,8 +1514,6 @@ void memory_region_set_enabled(MemoryRegion *mr, bool enabled)
 void memory_region_set_address(MemoryRegion *mr, hwaddr addr)
 {
     MemoryRegion *parent = mr->parent;
-    int priority = mr->priority;
-    bool may_overlap = mr->may_overlap;
 
     if (addr == mr->addr || !parent) {
         mr->addr = addr;
@@ -1525,11 +1523,7 @@ void memory_region_set_address(MemoryRegion *mr, hwaddr addr)
     memory_region_transaction_begin();
     memory_region_ref(mr);
     memory_region_del_subregion(parent, mr);
-    if (may_overlap) {
-        memory_region_add_subregion_overlap(parent, addr, mr, priority);
-    } else {
-        memory_region_add_subregion(parent, addr, mr);
-    }
+    memory_region_add_subregion_common(parent, addr, mr);
     memory_region_unref(mr);
     memory_region_transaction_commit();
 }
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 06/11] exec: dummy_section: Pass address space through.
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (4 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 05/11] memory: Simplify mr_add_subregion() if-else Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 07/11] qtest: fix qtest_clock_warp() for no deadline case Paolo Bonzini
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Crosthwaite

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Rather than use the global singleton.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 exec.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/exec.c b/exec.c
index 6ce989a..c3fbbb3 100644
--- a/exec.c
+++ b/exec.c
@@ -1776,10 +1776,12 @@ static subpage_t *subpage_init(AddressSpace *as, hwaddr base)
     return mmio;
 }
 
-static uint16_t dummy_section(PhysPageMap *map, MemoryRegion *mr)
+static uint16_t dummy_section(PhysPageMap *map, AddressSpace *as,
+                              MemoryRegion *mr)
 {
+    assert(as);
     MemoryRegionSection section = {
-        .address_space = &address_space_memory,
+        .address_space = as,
         .mr = mr,
         .offset_within_address_space = 0,
         .offset_within_region = 0,
@@ -1811,13 +1813,13 @@ static void mem_begin(MemoryListener *listener)
     AddressSpaceDispatch *d = g_new0(AddressSpaceDispatch, 1);
     uint16_t n;
 
-    n = dummy_section(&d->map, &io_mem_unassigned);
+    n = dummy_section(&d->map, as, &io_mem_unassigned);
     assert(n == PHYS_SECTION_UNASSIGNED);
-    n = dummy_section(&d->map, &io_mem_notdirty);
+    n = dummy_section(&d->map, as, &io_mem_notdirty);
     assert(n == PHYS_SECTION_NOTDIRTY);
-    n = dummy_section(&d->map, &io_mem_rom);
+    n = dummy_section(&d->map, as, &io_mem_rom);
     assert(n == PHYS_SECTION_ROM);
-    n = dummy_section(&d->map, &io_mem_watch);
+    n = dummy_section(&d->map, as, &io_mem_watch);
     assert(n == PHYS_SECTION_WATCH);
 
     d->phys_map  = (PhysPageEntry) { .ptr = PHYS_MAP_NODE_NIL, .skip = 1 };
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 07/11] qtest: fix qtest_clock_warp() for no deadline case
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (5 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 06/11] exec: dummy_section: Pass address space through Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 08/11] memory: MemoryRegion: factor out subregion add functionality Paolo Bonzini
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel; +Cc: Sergey Fedorov

From: Sergey Fedorov <serge.fdrv@gmail.com>

Use dedicated qemu_soonest_timeout() instead of MIN().

Signed-off-by: Sergey Fedorov <serge.fdrv@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 cpus.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cpus.c b/cpus.c
index dd7ac13..af06dc0 100644
--- a/cpus.c
+++ b/cpus.c
@@ -347,7 +347,7 @@ void qtest_clock_warp(int64_t dest)
     assert(qtest_enabled());
     while (clock < dest) {
         int64_t deadline = qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL);
-        int64_t warp = MIN(dest - clock, deadline);
+        int64_t warp = qemu_soonest_timeout(dest - clock, deadline);
         seqlock_write_lock(&timers_state.vm_clock_seqlock);
         qemu_icount_bias += warp;
         seqlock_write_unlock(&timers_state.vm_clock_seqlock);
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 08/11] memory: MemoryRegion: factor out subregion add functionality
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (6 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 07/11] qtest: fix qtest_clock_warp() for no deadline case Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 09/11] memory: MemoryRegion: factor out memory region re-adder Paolo Bonzini
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Crosthwaite

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

Split off the core looping code that actually adds subregions into
it's own fn. This prepares support for Memory Region qomification
where setting the MR address or parent via QOM will back onto this more
minimal function.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
[Rename new function. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 memory.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/memory.c b/memory.c
index 3811bd1..15f63e8 100644
--- a/memory.c
+++ b/memory.c
@@ -1423,18 +1423,15 @@ void memory_region_del_eventfd(MemoryRegion *mr,
     memory_region_transaction_commit();
 }
 
-static void memory_region_add_subregion_common(MemoryRegion *mr,
-                                               hwaddr offset,
-                                               MemoryRegion *subregion)
+static void memory_region_update_parent_subregions(MemoryRegion *subregion)
 {
+    hwaddr offset = subregion->addr;
+    MemoryRegion *mr = subregion->parent;
     MemoryRegion *other;
 
     memory_region_transaction_begin();
 
-    assert(!subregion->parent);
     memory_region_ref(subregion);
-    subregion->parent = mr;
-    subregion->addr = offset;
     QTAILQ_FOREACH(other, &mr->subregions, subregions_link) {
         if (subregion->may_overlap || other->may_overlap) {
             continue;
@@ -1468,6 +1465,15 @@ done:
     memory_region_transaction_commit();
 }
 
+static void memory_region_add_subregion_common(MemoryRegion *mr,
+                                               hwaddr offset,
+                                               MemoryRegion *subregion)
+{
+    assert(!subregion->parent);
+    subregion->parent = mr;
+    subregion->addr = offset;
+    memory_region_update_parent_subregions(subregion);
+}
 
 void memory_region_add_subregion(MemoryRegion *mr,
                                  hwaddr offset,
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 09/11] memory: MemoryRegion: factor out memory region re-adder
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (7 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 08/11] memory: MemoryRegion: factor out subregion add functionality Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 10/11] memory: MemoryRegion: rename parent to container Paolo Bonzini
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Crosthwaite

From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>

memory_region_set_address is mostly just a function that deletes and
re-adds a memory region. Factor this generic functionality out into a
re-usable function. This prepares support for further QOMification
of MemoryRegion.

Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 memory.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/memory.c b/memory.c
index 15f63e8..06a4af7 100644
--- a/memory.c
+++ b/memory.c
@@ -1517,21 +1517,27 @@ void memory_region_set_enabled(MemoryRegion *mr, bool enabled)
     memory_region_transaction_commit();
 }
 
-void memory_region_set_address(MemoryRegion *mr, hwaddr addr)
+static void memory_region_readd_subregion(MemoryRegion *mr)
 {
     MemoryRegion *parent = mr->parent;
 
-    if (addr == mr->addr || !parent) {
-        mr->addr = addr;
-        return;
+    if (parent) {
+        memory_region_transaction_begin();
+        memory_region_ref(mr);
+        memory_region_del_subregion(parent, mr);
+        mr->parent = parent;
+        memory_region_update_parent_subregions(mr);
+        memory_region_unref(mr);
+        memory_region_transaction_commit();
     }
+}
 
-    memory_region_transaction_begin();
-    memory_region_ref(mr);
-    memory_region_del_subregion(parent, mr);
-    memory_region_add_subregion_common(parent, addr, mr);
-    memory_region_unref(mr);
-    memory_region_transaction_commit();
+void memory_region_set_address(MemoryRegion *mr, hwaddr addr)
+{
+    if (addr != mr->addr) {
+        mr->addr = addr;
+        memory_region_readd_subregion(mr);
+    }
 }
 
 void memory_region_set_alias_offset(MemoryRegion *mr, hwaddr offset)
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 10/11] memory: MemoryRegion: rename parent to container
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (8 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 09/11] memory: MemoryRegion: factor out memory region re-adder Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 13:42 ` [Qemu-devel] [PULL 11/11] memory: Don't call memory_region_update_coalesced_range if nothing changed Paolo Bonzini
  2014-06-18 15:28 ` [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Peter Maydell
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel

Avoid confusion with the QOM parent.

Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/exec/memory.h | 20 ++++++++++----------
 memory.c              | 40 ++++++++++++++++++++--------------------
 2 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/include/exec/memory.h b/include/exec/memory.h
index 1d55ad9..549ae73 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -135,7 +135,7 @@ struct MemoryRegion {
     const MemoryRegionIOMMUOps *iommu_ops;
     void *opaque;
     struct Object *owner;
-    MemoryRegion *parent;
+    MemoryRegion *container;
     Int128 size;
     hwaddr addr;
     void (*destructor)(MemoryRegion *mr);
@@ -815,11 +815,11 @@ void memory_region_set_enabled(MemoryRegion *mr, bool enabled);
 /*
  * memory_region_set_address: dynamically update the address of a region
  *
- * Dynamically updates the address of a region, relative to its parent.
+ * Dynamically updates the address of a region, relative to its container.
  * May be used on regions are currently part of a memory hierarchy.
  *
  * @mr: the region to be updated
- * @addr: new address, relative to parent region
+ * @addr: new address, relative to container region
  */
 void memory_region_set_address(MemoryRegion *mr, hwaddr addr);
 
@@ -836,16 +836,16 @@ void memory_region_set_alias_offset(MemoryRegion *mr,
                                     hwaddr offset);
 
 /**
- * memory_region_present: checks if an address relative to a @parent
- * translates into #MemoryRegion within @parent
+ * memory_region_present: checks if an address relative to a @container
+ * translates into #MemoryRegion within @container
  *
- * Answer whether a #MemoryRegion within @parent covers the address
+ * Answer whether a #MemoryRegion within @container covers the address
  * @addr.
  *
- * @parent: a #MemoryRegion within which @addr is a relative address
- * @addr: the area within @parent to be searched
+ * @container: a #MemoryRegion within which @addr is a relative address
+ * @addr: the area within @container to be searched
  */
-bool memory_region_present(MemoryRegion *parent, hwaddr addr);
+bool memory_region_present(MemoryRegion *container, hwaddr addr);
 
 /**
  * memory_region_find: translate an address/size relative to a
@@ -866,7 +866,7 @@ bool memory_region_present(MemoryRegion *parent, hwaddr addr);
  * Similarly, the .@offset_within_address_space is relative to the
  * address space that contains both regions, the passed and the
  * returned one.  However, in the special case where the @mr argument
- * has no parent (and thus is the root of the address space), the
+ * has no container (and thus is the root of the address space), the
  * following will hold:
  *    .@offset_within_address_space >= @addr
  *    .@offset_within_address_space + .@size <= @addr + @size
diff --git a/memory.c b/memory.c
index 06a4af7..85798b0 100644
--- a/memory.c
+++ b/memory.c
@@ -485,8 +485,8 @@ static AddressSpace *memory_region_to_address_space(MemoryRegion *mr)
 {
     AddressSpace *as;
 
-    while (mr->parent) {
-        mr = mr->parent;
+    while (mr->container) {
+        mr = mr->container;
     }
     QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
         if (mr == as->root) {
@@ -850,7 +850,7 @@ void memory_region_init(MemoryRegion *mr,
     mr->opaque = NULL;
     mr->owner = owner;
     mr->iommu_ops = NULL;
-    mr->parent = NULL;
+    mr->container = NULL;
     mr->size = int128_make64(size);
     if (size == UINT64_MAX) {
         mr->size = int128_2_64();
@@ -1423,10 +1423,10 @@ void memory_region_del_eventfd(MemoryRegion *mr,
     memory_region_transaction_commit();
 }
 
-static void memory_region_update_parent_subregions(MemoryRegion *subregion)
+static void memory_region_update_container_subregions(MemoryRegion *subregion)
 {
     hwaddr offset = subregion->addr;
-    MemoryRegion *mr = subregion->parent;
+    MemoryRegion *mr = subregion->container;
     MemoryRegion *other;
 
     memory_region_transaction_begin();
@@ -1469,10 +1469,10 @@ static void memory_region_add_subregion_common(MemoryRegion *mr,
                                                hwaddr offset,
                                                MemoryRegion *subregion)
 {
-    assert(!subregion->parent);
-    subregion->parent = mr;
+    assert(!subregion->container);
+    subregion->container = mr;
     subregion->addr = offset;
-    memory_region_update_parent_subregions(subregion);
+    memory_region_update_container_subregions(subregion);
 }
 
 void memory_region_add_subregion(MemoryRegion *mr,
@@ -1498,8 +1498,8 @@ void memory_region_del_subregion(MemoryRegion *mr,
                                  MemoryRegion *subregion)
 {
     memory_region_transaction_begin();
-    assert(subregion->parent == mr);
-    subregion->parent = NULL;
+    assert(subregion->container == mr);
+    subregion->container = NULL;
     QTAILQ_REMOVE(&mr->subregions, subregion, subregions_link);
     memory_region_unref(subregion);
     memory_region_update_pending |= mr->enabled && subregion->enabled;
@@ -1519,14 +1519,14 @@ void memory_region_set_enabled(MemoryRegion *mr, bool enabled)
 
 static void memory_region_readd_subregion(MemoryRegion *mr)
 {
-    MemoryRegion *parent = mr->parent;
+    MemoryRegion *container = mr->container;
 
-    if (parent) {
+    if (container) {
         memory_region_transaction_begin();
         memory_region_ref(mr);
-        memory_region_del_subregion(parent, mr);
-        mr->parent = parent;
-        memory_region_update_parent_subregions(mr);
+        memory_region_del_subregion(container, mr);
+        mr->container = container;
+        memory_region_update_container_subregions(mr);
         memory_region_unref(mr);
         memory_region_transaction_commit();
     }
@@ -1578,10 +1578,10 @@ static FlatRange *flatview_lookup(FlatView *view, AddrRange addr)
                    sizeof(FlatRange), cmp_flatrange_addr);
 }
 
-bool memory_region_present(MemoryRegion *parent, hwaddr addr)
+bool memory_region_present(MemoryRegion *container, hwaddr addr)
 {
-    MemoryRegion *mr = memory_region_find(parent, addr, 1).mr;
-    if (!mr || (mr == parent)) {
+    MemoryRegion *mr = memory_region_find(container, addr, 1).mr;
+    if (!mr || (mr == container)) {
         return false;
     }
     memory_region_unref(mr);
@@ -1599,8 +1599,8 @@ MemoryRegionSection memory_region_find(MemoryRegion *mr,
     FlatRange *fr;
 
     addr += mr->addr;
-    for (root = mr; root->parent; ) {
-        root = root->parent;
+    for (root = mr; root->container; ) {
+        root = root->container;
         addr += root->addr;
     }
 
-- 
1.8.3.1

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

* [Qemu-devel] [PULL 11/11] memory: Don't call memory_region_update_coalesced_range if nothing changed
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (9 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 10/11] memory: MemoryRegion: rename parent to container Paolo Bonzini
@ 2014-06-18 13:42 ` Paolo Bonzini
  2014-06-18 15:28 ` [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Peter Maydell
  11 siblings, 0 replies; 13+ messages in thread
From: Paolo Bonzini @ 2014-06-18 13:42 UTC (permalink / raw)
  To: qemu-devel; +Cc: Fam Zheng

From: Fam Zheng <famz@redhat.com>

With huge number of PCI devices in the system (for example, 200
virtio-blk-pci), this unconditional call can slow down emulation of
irrelevant PCI operations drastically, such as a BAR update on a device
that has no coalescing region. So avoid it.

Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 memory.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/memory.c b/memory.c
index 85798b0..4895e25 100644
--- a/memory.c
+++ b/memory.c
@@ -1332,6 +1332,7 @@ void memory_region_add_coalescing(MemoryRegion *mr,
 void memory_region_clear_coalescing(MemoryRegion *mr)
 {
     CoalescedMemoryRange *cmr;
+    bool updated = false;
 
     qemu_flush_coalesced_mmio_buffer();
     mr->flush_coalesced_mmio = false;
@@ -1340,8 +1341,12 @@ void memory_region_clear_coalescing(MemoryRegion *mr)
         cmr = QTAILQ_FIRST(&mr->coalesced);
         QTAILQ_REMOVE(&mr->coalesced, cmr, link);
         g_free(cmr);
+        updated = true;
+    }
+
+    if (updated) {
+        memory_region_update_coalesced_range(mr);
     }
-    memory_region_update_coalesced_range(mr);
 }
 
 void memory_region_set_flush_coalesced(MemoryRegion *mr)
-- 
1.8.3.1

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

* Re: [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18
  2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
                   ` (10 preceding siblings ...)
  2014-06-18 13:42 ` [Qemu-devel] [PULL 11/11] memory: Don't call memory_region_update_coalesced_range if nothing changed Paolo Bonzini
@ 2014-06-18 15:28 ` Peter Maydell
  11 siblings, 0 replies; 13+ messages in thread
From: Peter Maydell @ 2014-06-18 15:28 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: QEMU Developers

On 18 June 2014 14:41, Paolo Bonzini <pbonzini@redhat.com> wrote:
> The following changes since commit af44da87e926ff64260b95f4350d338c4fc113ca:
>
>   Merge remote-tracking branch 'remotes/agraf/tags/signed-ppc-for-upstream' into staging (2014-06-16 18:26:21 +0100)
>
> are available in the git repository at:
>
>
>   git://github.com/bonzini/qemu.git memory
>
> for you to fetch changes up to 9b7958d31fa8d1fa3f97cadae0c06964aaae5539:
>
>   memory: Don't call memory_region_update_coalesced_range if nothing changed (2014-06-17 17:11:21 +0200)
>
> I don't think QOMification will make it into 2.1, so I'm sending this out early.
> If all the prerequisite get in timely, I will send another pull request.

Applied, thanks.

-- PMM

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

end of thread, other threads:[~2014-06-18 15:28 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-18 13:41 [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Paolo Bonzini
2014-06-18 13:41 ` [Qemu-devel] [PULL 01/11] MAINTAINERS: Add myself as Memory API maintainer Paolo Bonzini
2014-06-18 13:41 ` [Qemu-devel] [PULL 02/11] exec: introduce qemu_ram_unset_idstr() to unset RAMBlock idstr Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 03/11] unset RAMBlock idstr when unregister MemoryRegion Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 04/11] memory: Don't update all memory region when ioeventfd changed Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 05/11] memory: Simplify mr_add_subregion() if-else Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 06/11] exec: dummy_section: Pass address space through Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 07/11] qtest: fix qtest_clock_warp() for no deadline case Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 08/11] memory: MemoryRegion: factor out subregion add functionality Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 09/11] memory: MemoryRegion: factor out memory region re-adder Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 10/11] memory: MemoryRegion: rename parent to container Paolo Bonzini
2014-06-18 13:42 ` [Qemu-devel] [PULL 11/11] memory: Don't call memory_region_update_coalesced_range if nothing changed Paolo Bonzini
2014-06-18 15:28 ` [Qemu-devel] [PULL 00/11] Memory API changes for 2014-06-18 Peter Maydell

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.