qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 11/15] qom: use mmap for bigger Objects


From: Peter Lieven
Subject: Re: [Qemu-devel] [PATCH 11/15] qom: use mmap for bigger Objects
Date: Tue, 28 Jun 2016 12:19:18 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0

Am 28.06.2016 um 12:10 schrieb Peter Maydell:
On 28 June 2016 at 10:01, Peter Lieven <address@hidden> wrote:
Signed-off-by: Peter Lieven <address@hidden>
---
  include/qom/object.h |  1 +
  qom/object.c         | 20 +++++++++++++++++---
  2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 2f8ac47..c612f3a 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -400,6 +400,7 @@ struct Object
      GHashTable *properties;
      uint32_t ref;
      Object *parent;
+    size_t instance_size;
  };

  /**
diff --git a/qom/object.c b/qom/object.c
index 9743ea4..203162b 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -15,6 +15,7 @@
  #include "qom/object.h"
  #include "qom/object_interfaces.h"
  #include "qemu/cutils.h"
+#include "qemu/mmap-alloc.h"
  #include "qapi/visitor.h"
  #include "qapi-visit.h"
  #include "qapi/string-input-visitor.h"
@@ -453,6 +454,12 @@ static void object_deinit(Object *obj, TypeImpl *type)
      }
  }

+static void object_munmap(void *opaque)
+{
+    Object *obj = opaque;
+    qemu_anon_ram_munmap(obj, obj->instance_size);
+}
+
  static void object_finalize(void *data)
  {
      Object *obj = data;
@@ -467,16 +474,23 @@ static void object_finalize(void *data)
      }
  }

+#define OBJECT_MMAP_THRESH 4096
+
  Object *object_new_with_type(Type type)
  {
      Object *obj;

      g_assert(type != NULL);
      type_initialize(type);
-
-    obj = g_malloc(type->instance_size);
+    if (type->instance_size < OBJECT_MMAP_THRESH) {
+        obj = g_malloc(type->instance_size);
+        obj->free = g_free;
+    } else {
+        obj = qemu_anon_ram_mmap(type->instance_size);
+        obj->free = object_munmap;
+    }
+    obj->instance_size = type->instance_size;
      object_initialize_with_type(obj, type->instance_size, type);
-    obj->free = g_free;
This one I disagree with. We should trust the platform malloc
implementation (or g_malloc() in this case), or get it fixed
if it is broken somehow.

The ptmalloc implementation can only return memory back to the
kernel if there is unallocated memory at the end of the heap. Every
hole in between cannot be returned.

But I agree I would appreciate if malloc would handle this.

Some Objects we allocate are very large. E.g. some are 70kB as far as
I remember.

Peter



reply via email to

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