On Tue, Sep 15, 2020 at 10:46:31AM -0700, Richard Henderson wrote: > 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.hender...@linaro.org> > --- > Cc: Paolo Bonzini <pbonz...@redhat.com> > Cc: "Daniel P. Berrangé" <berra...@redhat.com> > Cc: Eduardo Habkost <ehabk...@redhat.com> > --- > include/qom/object.h | 4 ++++ > qom/object.c | 16 +++++++++++++--- > 2 files changed, 17 insertions(+), 3 deletions(-) > > diff --git a/include/qom/object.h b/include/qom/object.h > index 056f67ab3b..d52d0781a3 100644 > --- a/include/qom/object.h > +++ b/include/qom/object.h > @@ -770,6 +770,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 +810,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 387efb25eb..2e53cb44a6 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; > @@ -691,13 +693,21 @@ static void object_finalize(void *data) > static Object *object_new_with_type(Type type) > { > Object *obj; > + size_t size, align; > > 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; > + if (align) {
If we check for (align > G_MEM_ALIGN) instead, we will be able to set instance_align automatically at OBJECT_DEFINE_TYPE*. > + obj = qemu_memalign(align, size); > + } else { > + obj = g_malloc(size); > + } > + > + object_initialize_with_type(obj, size, type); > + obj->free = (align ? qemu_vfree : g_free); > > return obj; > } > -- > 2.25.1 > -- Eduardo