qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 14/23] memory: transaction API


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH 14/23] memory: transaction API
Date: Mon, 25 Jul 2011 14:16:26 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110516 Lightning/1.0b2 Thunderbird/3.1.10

On 07/25/2011 09:02 AM, Avi Kivity wrote:
Allow changes to the memory hierarchy to be accumulated and
made visible all at once.  This reduces computational effort,
especially when an accelerator (e.g. kvm) is involved.

Useful when a single register update causes multiple changes
to an address space.

Signed-off-by: Avi Kivity<address@hidden>

What's the motivation for this? Was this just because it seemed neat to do or did you run into a performance issue you were trying to solve?


---
  memory.c |   20 ++++++++++++++++++++
  memory.h |    8 ++++++++
  2 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/memory.c b/memory.c
index 009ad33..370e189 100644
--- a/memory.c
+++ b/memory.c
@@ -18,6 +18,8 @@
  #include "kvm.h"
  #include<assert.h>

+unsigned memory_region_transaction_depth = 0;

Shouldn't this be static?

Regards,

Anthony Liguori

+
  typedef struct AddrRange AddrRange;

  struct AddrRange {
@@ -623,6 +625,10 @@ static void address_space_update_topology(AddressSpace *as)

  static void memory_region_update_topology(void)
  {
+    if (memory_region_transaction_depth) {
+        return;
+    }
+
      if (address_space_memory.root) {
          address_space_update_topology(&address_space_memory);
      }
@@ -631,6 +637,20 @@ static void memory_region_update_topology(void)
      }
  }

+void memory_region_transaction_begin(void)
+{
+    ++memory_region_transaction_depth;
+}
+
+void memory_region_transaction_commit(void)
+{
+    if (!memory_region_transaction_depth) {
+        abort();
+    }
+    --memory_region_transaction_depth;
+    memory_region_update_topology();
+}
+
  void memory_region_init(MemoryRegion *mr,
                          const char *name,
                          uint64_t size)
diff --git a/memory.h b/memory.h
index e4c0ad1..cb3a9b6 100644
--- a/memory.h
+++ b/memory.h
@@ -246,6 +246,14 @@ void memory_region_add_subregion_overlap(MemoryRegion *mr,
  void memory_region_del_subregion(MemoryRegion *mr,
                                   MemoryRegion *subregion);

+/* Start a transaction; changes will be accumulated and made visible only
+ * when the transaction ends.
+ */
+void memory_region_transaction_begin(void);
+/* Commit a transaction and make changes visible to the guest.
+ */
+void memory_region_transaction_commit(void);
+
  #endif

  #endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]