958e1b
From 2bf018e4c436e31188ea61fb767dbcec16495cfd Mon Sep 17 00:00:00 2001
2382db
From: Michael S. Tsirkin <mst@redhat.com>
958e1b
Date: Wed, 14 May 2014 08:52:43 +0200
958e1b
Subject: [PATCH 20/31] vmstate: reduce code duplication
2382db
958e1b
RH-Author: Michael S. Tsirkin <mst@redhat.com>
958e1b
Message-id: <1400057538-6975-2-git-send-email-mst@redhat.com>
958e1b
Patchwork-id: 58868
958e1b
O-Subject: [PATCH qemu-kvm RHEL7.1 1/5] vmstate: reduce code duplication
958e1b
Bugzilla: 1095716
2382db
RH-Acked-by: Dr. David Alan Gilbert (git) <dgilbert@redhat.com>
958e1b
RH-Acked-by: Marcel Apfelbaum <marcel.a@redhat.com>
958e1b
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
958e1b
RH-Acked-by: Juan Quintela <quintela@redhat.com>
2382db
2382db
move size offset and number of elements math out
2382db
to functions, to reduce code duplication.
2382db
2382db
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2382db
Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
2382db
Signed-off-by: Juan Quintela <quintela@redhat.com>
2382db
(cherry picked from commit 35fc1f71899fd42323bd8f33da18f0211e0d2727)
2382db
---
2382db
 savevm.c | 100 +++++++++++++++++++++++++++++++++------------------------------
2382db
 1 file changed, 52 insertions(+), 48 deletions(-)
2382db
2382db
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
2382db
---
2382db
 savevm.c |  100 ++++++++++++++++++++++++++++++++-----------------------------
2382db
 1 files changed, 52 insertions(+), 48 deletions(-)
2382db
2382db
diff --git a/savevm.c b/savevm.c
958e1b
index 6efbb75..707caac 100644
2382db
--- a/savevm.c
2382db
+++ b/savevm.c
2382db
@@ -1675,6 +1675,50 @@ static void vmstate_subsection_save(QEMUFile *f, const VMStateDescription *vmsd,
2382db
 static int vmstate_subsection_load(QEMUFile *f, const VMStateDescription *vmsd,
2382db
                                    void *opaque);
2382db
 
2382db
+static int vmstate_n_elems(void *opaque, VMStateField *field)
2382db
+{
2382db
+    int n_elems = 1;
2382db
+
2382db
+    if (field->flags & VMS_ARRAY) {
2382db
+        n_elems = field->num;
2382db
+    } else if (field->flags & VMS_VARRAY_INT32) {
2382db
+        n_elems = *(int32_t *)(opaque+field->num_offset);
2382db
+    } else if (field->flags & VMS_VARRAY_UINT32) {
2382db
+        n_elems = *(uint32_t *)(opaque+field->num_offset);
2382db
+    } else if (field->flags & VMS_VARRAY_UINT16) {
2382db
+        n_elems = *(uint16_t *)(opaque+field->num_offset);
2382db
+    } else if (field->flags & VMS_VARRAY_UINT8) {
2382db
+        n_elems = *(uint8_t *)(opaque+field->num_offset);
2382db
+    }
2382db
+
2382db
+    return n_elems;
2382db
+}
2382db
+
2382db
+static int vmstate_size(void *opaque, VMStateField *field)
2382db
+{
2382db
+    int size = field->size;
2382db
+
2382db
+    if (field->flags & VMS_VBUFFER) {
2382db
+        size = *(int32_t *)(opaque+field->size_offset);
2382db
+        if (field->flags & VMS_MULTIPLY) {
2382db
+            size *= field->size;
2382db
+        }
2382db
+    }
2382db
+
2382db
+    return size;
2382db
+}
2382db
+
2382db
+static void *vmstate_base_addr(void *opaque, VMStateField *field)
2382db
+{
2382db
+    void *base_addr = opaque + field->offset;
2382db
+
2382db
+    if (field->flags & VMS_POINTER) {
2382db
+        base_addr = *(void **)base_addr + field->start;
2382db
+    }
2382db
+
2382db
+    return base_addr;
2382db
+}
2382db
+
2382db
 int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
2382db
                        void *opaque, int version_id)
2382db
 {
2382db
@@ -1700,30 +1744,10 @@ int vmstate_load_state(QEMUFile *f, const VMStateDescription *vmsd,
2382db
              field->field_exists(opaque, version_id)) ||
2382db
             (!field->field_exists &&
2382db
              field->version_id <= version_id)) {
2382db
-            void *base_addr = opaque + field->offset;
2382db
-            int i, n_elems = 1;
2382db
-            int size = field->size;
2382db
-
2382db
-            if (field->flags & VMS_VBUFFER) {
2382db
-                size = *(int32_t *)(opaque+field->size_offset);
2382db
-                if (field->flags & VMS_MULTIPLY) {
2382db
-                    size *= field->size;
2382db
-                }
2382db
-            }
2382db
-            if (field->flags & VMS_ARRAY) {
2382db
-                n_elems = field->num;
2382db
-            } else if (field->flags & VMS_VARRAY_INT32) {
2382db
-                n_elems = *(int32_t *)(opaque+field->num_offset);
2382db
-            } else if (field->flags & VMS_VARRAY_UINT32) {
2382db
-                n_elems = *(uint32_t *)(opaque+field->num_offset);
2382db
-            } else if (field->flags & VMS_VARRAY_UINT16) {
2382db
-                n_elems = *(uint16_t *)(opaque+field->num_offset);
2382db
-            } else if (field->flags & VMS_VARRAY_UINT8) {
2382db
-                n_elems = *(uint8_t *)(opaque+field->num_offset);
2382db
-            }
2382db
-            if (field->flags & VMS_POINTER) {
2382db
-                base_addr = *(void **)base_addr + field->start;
2382db
-            }
2382db
+            void *base_addr = vmstate_base_addr(opaque, field);
2382db
+            int i, n_elems = vmstate_n_elems(opaque, field);
2382db
+            int size = vmstate_size(opaque, field);
2382db
+
2382db
             for (i = 0; i < n_elems; i++) {
2382db
                 void *addr = base_addr + size * i;
2382db
 
958e1b
@@ -1764,30 +1788,10 @@ void vmstate_save_state(QEMUFile *f, const VMStateDescription *vmsd,
2382db
     while(field->name) {
2382db
         if (!field->field_exists ||
2382db
             field->field_exists(opaque, vmsd->version_id)) {
2382db
-            void *base_addr = opaque + field->offset;
2382db
-            int i, n_elems = 1;
2382db
-            int size = field->size;
2382db
-
2382db
-            if (field->flags & VMS_VBUFFER) {
2382db
-                size = *(int32_t *)(opaque+field->size_offset);
2382db
-                if (field->flags & VMS_MULTIPLY) {
2382db
-                    size *= field->size;
2382db
-                }
2382db
-            }
2382db
-            if (field->flags & VMS_ARRAY) {
2382db
-                n_elems = field->num;
2382db
-            } else if (field->flags & VMS_VARRAY_INT32) {
2382db
-                n_elems = *(int32_t *)(opaque+field->num_offset);
2382db
-            } else if (field->flags & VMS_VARRAY_UINT32) {
2382db
-                n_elems = *(uint32_t *)(opaque+field->num_offset);
2382db
-            } else if (field->flags & VMS_VARRAY_UINT16) {
2382db
-                n_elems = *(uint16_t *)(opaque+field->num_offset);
2382db
-            } else if (field->flags & VMS_VARRAY_UINT8) {
2382db
-                n_elems = *(uint8_t *)(opaque+field->num_offset);
2382db
-            }
2382db
-            if (field->flags & VMS_POINTER) {
2382db
-                base_addr = *(void **)base_addr + field->start;
2382db
-            }
2382db
+            void *base_addr = vmstate_base_addr(opaque, field);
2382db
+            int i, n_elems = vmstate_n_elems(opaque, field);
2382db
+            int size = vmstate_size(opaque, field);
2382db
+
2382db
             for (i = 0; i < n_elems; i++) {
2382db
                 void *addr = base_addr + size * i;
2382db
 
2382db
-- 
2382db
1.7.1
2382db