Blame SOURCES/kvm-dump-Refactor-dump_iterate-and-introduce-dump_filter.patch

bf143f
From a18ba2fbaf132724e81be92da42b36d8f365e66c Mon Sep 17 00:00:00 2001
bf143f
From: Janosch Frank <frankja@linux.ibm.com>
bf143f
Date: Thu, 11 Aug 2022 12:10:56 +0000
bf143f
Subject: [PATCH 24/42] dump: Refactor dump_iterate and introduce
bf143f
 dump_filter_memblock_*()
bf143f
MIME-Version: 1.0
bf143f
Content-Type: text/plain; charset=UTF-8
bf143f
Content-Transfer-Encoding: 8bit
bf143f
bf143f
RH-Author: Cédric Le Goater <clg@redhat.com>
bf143f
RH-MergeRequest: 226: s390: Enhanced Interpretation for PCI Functions and Secure Execution guest dump
bf143f
RH-Bugzilla: 1664378 2043909
bf143f
RH-Acked-by: Thomas Huth <thuth@redhat.com>
bf143f
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
bf143f
RH-Acked-by: Jon Maloy <jmaloy@redhat.com>
bf143f
RH-Commit: [24/41] 74ef470f24d9d98093c4d63730a99474587033fd
bf143f
bf143f
The iteration over the memblocks in dump_iterate() is hard to
bf143f
understand so it's about time to clean it up. Instead of manually
bf143f
grabbing the next memblock we can use QTAILQ_FOREACH to iterate over
bf143f
all memblocks.
bf143f
bf143f
Additionally we move the calculation of the offset and length out by
bf143f
introducing and using the dump_filter_memblock_*() functions. These
bf143f
functions will later be used to cleanup other parts of dump.c.
bf143f
bf143f
Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
bf143f
Reviewed-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com>
bf143f
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
bf143f
Message-Id: <20220811121111.9878-4-frankja@linux.ibm.com>
bf143f
(cherry picked from commit 1e8113032f5b1efc5da66382470ce4809c76f8f2)
bf143f
Signed-off-by: Cédric Le Goater <clg@redhat.com>
bf143f
---
bf143f
 dump/dump.c | 74 ++++++++++++++++++++++++++++++-----------------------
bf143f
 1 file changed, 42 insertions(+), 32 deletions(-)
bf143f
bf143f
diff --git a/dump/dump.c b/dump/dump.c
bf143f
index fa787f379f..d981e843dd 100644
bf143f
--- a/dump/dump.c
bf143f
+++ b/dump/dump.c
bf143f
@@ -592,31 +592,43 @@ static void dump_begin(DumpState *s, Error **errp)
bf143f
     write_elf_notes(s, errp);
bf143f
 }
bf143f
 
bf143f
-static int get_next_block(DumpState *s, GuestPhysBlock *block)
bf143f
+static int64_t dump_filtered_memblock_size(GuestPhysBlock *block,
bf143f
+                                           int64_t filter_area_start,
bf143f
+                                           int64_t filter_area_length)
bf143f
 {
bf143f
-    while (1) {
bf143f
-        block = QTAILQ_NEXT(block, next);
bf143f
-        if (!block) {
bf143f
-            /* no more block */
bf143f
-            return 1;
bf143f
-        }
bf143f
+    int64_t size, left, right;
bf143f
 
bf143f
-        s->start = 0;
bf143f
-        s->next_block = block;
bf143f
-        if (s->has_filter) {
bf143f
-            if (block->target_start >= s->begin + s->length ||
bf143f
-                block->target_end <= s->begin) {
bf143f
-                /* This block is out of the range */
bf143f
-                continue;
bf143f
-            }
bf143f
+    /* No filter, return full size */
bf143f
+    if (!filter_area_length) {
bf143f
+        return block->target_end - block->target_start;
bf143f
+    }
bf143f
 
bf143f
-            if (s->begin > block->target_start) {
bf143f
-                s->start = s->begin - block->target_start;
bf143f
-            }
bf143f
+    /* calculate the overlapped region. */
bf143f
+    left = MAX(filter_area_start, block->target_start);
bf143f
+    right = MIN(filter_area_start + filter_area_length, block->target_end);
bf143f
+    size = right - left;
bf143f
+    size = size > 0 ? size : 0;
bf143f
+
bf143f
+    return size;
bf143f
+}
bf143f
+
bf143f
+static int64_t dump_filtered_memblock_start(GuestPhysBlock *block,
bf143f
+                                            int64_t filter_area_start,
bf143f
+                                            int64_t filter_area_length)
bf143f
+{
bf143f
+    if (filter_area_length) {
bf143f
+        /* return -1 if the block is not within filter area */
bf143f
+        if (block->target_start >= filter_area_start + filter_area_length ||
bf143f
+            block->target_end <= filter_area_start) {
bf143f
+            return -1;
bf143f
         }
bf143f
 
bf143f
-        return 0;
bf143f
+        if (filter_area_start > block->target_start) {
bf143f
+            return filter_area_start - block->target_start;
bf143f
+        }
bf143f
     }
bf143f
+
bf143f
+    return 0;
bf143f
 }
bf143f
 
bf143f
 /* write all memory to vmcore */
bf143f
@@ -624,24 +636,22 @@ static void dump_iterate(DumpState *s, Error **errp)
bf143f
 {
bf143f
     ERRP_GUARD();
bf143f
     GuestPhysBlock *block;
bf143f
-    int64_t size;
bf143f
-
bf143f
-    do {
bf143f
-        block = s->next_block;
bf143f
+    int64_t memblock_size, memblock_start;
bf143f
 
bf143f
-        size = block->target_end - block->target_start;
bf143f
-        if (s->has_filter) {
bf143f
-            size -= s->start;
bf143f
-            if (s->begin + s->length < block->target_end) {
bf143f
-                size -= block->target_end - (s->begin + s->length);
bf143f
-            }
bf143f
+    QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) {
bf143f
+        memblock_start = dump_filtered_memblock_start(block, s->begin, s->length);
bf143f
+        if (memblock_start == -1) {
bf143f
+            continue;
bf143f
         }
bf143f
-        write_memory(s, block, s->start, size, errp);
bf143f
+
bf143f
+        memblock_size = dump_filtered_memblock_size(block, s->begin, s->length);
bf143f
+
bf143f
+        /* Write the memory to file */
bf143f
+        write_memory(s, block, memblock_start, memblock_size, errp);
bf143f
         if (*errp) {
bf143f
             return;
bf143f
         }
bf143f
-
bf143f
-    } while (!get_next_block(s, block));
bf143f
+    }
bf143f
 }
bf143f
 
bf143f
 static void create_vmcore(DumpState *s, Error **errp)
bf143f
-- 
bf143f
2.37.3
bf143f