qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] migration: cache memory region ram ptr


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH] migration: cache memory region ram ptr
Date: Sat, 10 May 2014 17:33:23 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0

Il 10/05/2014 12:51, Peter Lieven ha scritto:
we currently look up the ram ptr for each single page. Cache
the pointer while we operate on the same block.

Why don't you instead cache the result in the MemoryRegion, so that memory_region_get_ram_ptr becomes a simple, inline field access?

Paolo

Signed-off-by: Peter Lieven <address@hidden>
---
 arch_init.c |   23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/arch_init.c b/arch_init.c
index 582b716..ce338aa 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -594,13 +594,19 @@ static int ram_save_block(QEMUFile *f, bool last_stage)
                 ram_bulk_stage = false;
             }
         } else {
+            static uint8_t *ram_ptr;
             int ret;
             uint8_t *p;
             bool send_async = true;
-            int cont = (block == last_sent_block) ?
-                RAM_SAVE_FLAG_CONTINUE : 0;
+            int cont = 0;

-            p = memory_region_get_ram_ptr(mr) + offset;
+            if (block != last_sent_block) {
+                ram_ptr = memory_region_get_ram_ptr(mr);
+            } else {
+                cont = RAM_SAVE_FLAG_CONTINUE;
+            }
+
+            p = ram_ptr + offset;

             /* In doubt sent page as normal */
             bytes_sent = -1;
@@ -990,16 +996,17 @@ static inline void *host_from_stream_offset(QEMUFile *f,
                                             int flags)
 {
     static RAMBlock *block = NULL;
+    static uint8_t *ram_ptr;
     char id[256];
     uint8_t len;

     if (flags & RAM_SAVE_FLAG_CONTINUE) {
-        if (!block) {
+        if (!block || !ram_ptr) {
             fprintf(stderr, "Ack, bad migration stream!\n");
             return NULL;
         }

-        return memory_region_get_ram_ptr(block->mr) + offset;
+        return ram_ptr + offset;
     }

     len = qemu_get_byte(f);
@@ -1007,8 +1014,10 @@ static inline void *host_from_stream_offset(QEMUFile *f,
     id[len] = 0;

     QTAILQ_FOREACH(block, &ram_list.blocks, next) {
-        if (!strncmp(id, block->idstr, sizeof(id)))
-            return memory_region_get_ram_ptr(block->mr) + offset;
+        if (!strncmp(id, block->idstr, sizeof(id))) {
+            ram_ptr = memory_region_get_ram_ptr(block->mr);
+            return ram_ptr + offset;
+        }
     }

     fprintf(stderr, "Can't find block %s!\n", id);





reply via email to

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