qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eduardo Habkost <ehabkost@redhat.com>
To: Peter Maydell <peter.maydell@linaro.org>, qemu-devel@nongnu.org
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Daniel P. Berrangé" <berrange@redhat.com>
Subject: [PULL 08/17] qom: Allow objects to be allocated with increased alignment
Date: Fri, 18 Sep 2020 16:47:05 -0400	[thread overview]
Message-ID: <20200918204714.27276-9-ehabkost@redhat.com> (raw)
In-Reply-To: <20200918204714.27276-1-ehabkost@redhat.com>

From: Richard Henderson <richard.henderson@linaro.org>

It turns out that some hosts have a default malloc alignment less
than that required for vectors.

We assume that, with compiler annotation on CPUArchState, that we
can properly align the vector portion of the guest state.  Fix the
alignment of the allocation by using qemu_memalloc when required.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20200916004638.2444147-3-richard.henderson@linaro.org>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 include/qom/object.h |  5 +++++
 qom/object.c         | 36 +++++++++++++++++++++++++++++++++---
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 32524d72cc..405a2c67b0 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -691,6 +691,7 @@ struct Object
         .parent = TYPE_##PARENT_MODULE_OBJ_NAME, \
         .name = TYPE_##MODULE_OBJ_NAME, \
         .instance_size = sizeof(ModuleObjName), \
+        .instance_align = __alignof__(ModuleObjName), \
         .instance_init = module_obj_name##_init, \
         .instance_finalize = module_obj_name##_finalize, \
         .class_size = sizeof(ModuleObjName##Class), \
@@ -770,6 +771,9 @@ struct Object
  * @instance_size: The size of the object (derivative of #Object).  If
  *   @instance_size is 0, then the size of the object will be the size of the
  *   parent object.
+ * @instance_align: The required alignment of the object.  If @instance_align
+ *   is 0, then normal malloc alignment is sufficient; if non-zero, then we
+ *   must use qemu_memalign for allocation.
  * @instance_init: This function is called to initialize an object.  The parent
  *   class will have already been initialized so the type is only responsible
  *   for initializing its own members.
@@ -807,6 +811,7 @@ struct TypeInfo
     const char *parent;
 
     size_t instance_size;
+    size_t instance_align;
     void (*instance_init)(Object *obj);
     void (*instance_post_init)(Object *obj);
     void (*instance_finalize)(Object *obj);
diff --git a/qom/object.c b/qom/object.c
index cecad35b99..a91a6a515a 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -50,6 +50,7 @@ struct TypeImpl
     size_t class_size;
 
     size_t instance_size;
+    size_t instance_align;
 
     void (*class_init)(ObjectClass *klass, void *data);
     void (*class_base_init)(ObjectClass *klass, void *data);
@@ -114,6 +115,7 @@ static TypeImpl *type_new(const TypeInfo *info)
 
     ti->class_size = info->class_size;
     ti->instance_size = info->instance_size;
+    ti->instance_align = info->instance_align;
 
     ti->class_init = info->class_init;
     ti->class_base_init = info->class_base_init;
@@ -688,16 +690,44 @@ static void object_finalize(void *data)
     }
 }
 
+/* Find the minimum alignment guaranteed by the system malloc. */
+#if __STDC_VERSION__ >= 201112L
+typddef max_align_t qemu_max_align_t;
+#else
+typedef union {
+    long l;
+    void *p;
+    double d;
+    long double ld;
+} qemu_max_align_t;
+#endif
+
 static Object *object_new_with_type(Type type)
 {
     Object *obj;
+    size_t size, align;
+    void (*obj_free)(void *);
 
     g_assert(type != NULL);
     type_initialize(type);
 
-    obj = g_malloc(type->instance_size);
-    object_initialize_with_type(obj, type->instance_size, type);
-    obj->free = g_free;
+    size = type->instance_size;
+    align = type->instance_align;
+
+    /*
+     * Do not use qemu_memalign unless required.  Depending on the
+     * implementation, extra alignment implies extra overhead.
+     */
+    if (likely(align <= __alignof__(qemu_max_align_t))) {
+        obj = g_malloc(size);
+        obj_free = g_free;
+    } else {
+        obj = qemu_memalign(align, size);
+        obj_free = qemu_vfree;
+    }
+
+    object_initialize_with_type(obj, size, type);
+    obj->free = obj_free;
 
     return obj;
 }
-- 
2.26.2



  parent reply	other threads:[~2020-09-18 21:53 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-18 20:46 [PULL 00/17] QOM queue, 2020-09-18 Eduardo Habkost
2020-09-18 20:46 ` [PULL 01/17] sifive_e: Rename memmap enum constants Eduardo Habkost
2020-09-18 20:46 ` [PULL 02/17] sifive_u: " Eduardo Habkost
2020-09-18 20:47 ` [PULL 03/17] sifive: Move QOM typedefs and add missing includes Eduardo Habkost
2020-09-18 20:47 ` [PULL 04/17] sifive: Use DECLARE_*CHECKER* macros Eduardo Habkost
2020-09-18 20:47 ` [PULL 05/17] qom: Correct object_class_dynamic_cast_assert() documentation Eduardo Habkost
2020-09-18 20:47 ` [PULL 06/17] qom: Clean up object_property_get_enum()'s error value Eduardo Habkost
2020-09-18 20:47 ` [PULL 07/17] qom: Correct error values in two contracts Eduardo Habkost
2020-09-18 20:47 ` Eduardo Habkost [this message]
2020-09-18 20:47 ` [PULL 09/17] target/arm: Set instance_align on CPUARM TypeInfo Eduardo Habkost
2020-09-18 20:47 ` [PULL 10/17] target/ppc: Set instance_align on PowerPCCPU TypeInfo Eduardo Habkost
2020-09-18 20:47 ` [PULL 11/17] target/riscv: Set instance_align on RISCVCPU TypeInfo Eduardo Habkost
2020-09-18 20:47 ` [PULL 12/17] target/s390x: Set instance_align on S390CPU TypeInfo Eduardo Habkost
2020-09-18 20:47 ` [PULL 13/17] scripts/codeconverter: Update to latest version Eduardo Habkost
2020-09-18 20:47 ` [PULL 14/17] qom: Remove ParentClassType argument from OBJECT_DECLARE_SIMPLE_TYPE Eduardo Habkost
2020-09-18 20:47 ` [PULL 15/17] qom: Remove module_obj_name parameter from OBJECT_DECLARE* macros Eduardo Habkost
2020-09-18 20:47 ` [PULL 16/17] Use OBJECT_DECLARE_TYPE when possible Eduardo Habkost
2020-09-18 20:47 ` [PULL 17/17] Use OBJECT_DECLARE_SIMPLE_TYPE " Eduardo Habkost
2020-09-18 22:35 ` [PULL 00/17] QOM queue, 2020-09-18 no-reply
2020-09-18 23:23 ` no-reply
2020-09-18 23:43 ` no-reply
2020-09-19  0:23 ` no-reply
2020-09-19  0:43 ` no-reply
2020-09-19  1:32 ` no-reply
2020-09-19  1:43 ` no-reply
2020-09-19  1:57 ` no-reply
2020-09-19  2:36 ` no-reply
2020-09-22 14:42 ` Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200918204714.27276-9-ehabkost@redhat.com \
    --to=ehabkost@redhat.com \
    --cc=berrange@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).