From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54660) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XXX2N-0008I4-FC for qemu-devel@nongnu.org; Fri, 26 Sep 2014 11:02:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XXX2E-00017h-Ar for qemu-devel@nongnu.org; Fri, 26 Sep 2014 11:02:23 -0400 Received: from mail-we0-x22e.google.com ([2a00:1450:400c:c03::22e]:49581) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XXX2D-00015t-Nl for qemu-devel@nongnu.org; Fri, 26 Sep 2014 11:02:14 -0400 Received: by mail-we0-f174.google.com with SMTP id w62so9230218wes.5 for ; Fri, 26 Sep 2014 08:02:07 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <54257FEC.50408@redhat.com> Date: Fri, 26 Sep 2014 17:02:04 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1409344310-5441-1-git-send-email-ehabkost@redhat.com> <1409344310-5441-7-git-send-email-ehabkost@redhat.com> In-Reply-To: <1409344310-5441-7-git-send-email-ehabkost@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 06/17] accel: Use QOM classes for accel types List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Eduardo Habkost , qemu-devel@nongnu.org Cc: Michael Mueller , "Michael S. Tsirkin" , Marcel Apfelbaum , Alexander Graf , Christian Borntraeger , "Jason J. Herne" , =?windows-1252?Q?Andreas_?= =?windows-1252?Q?F=E4rber?= Il 29/08/2014 22:31, Eduardo Habkost ha scritto: > Instead of having a static AccelType array, register a class for each > accelerator type, and use class name lookup to find accelerator > information. > > Signed-off-by: Eduardo Habkost > --- > hw/core/accel.c | 117 ++++++++++++++++++++++++++++++++++++++++++----------- > include/hw/accel.h | 30 ++++++++++++++ > 2 files changed, 123 insertions(+), 24 deletions(-) > > diff --git a/hw/core/accel.c b/hw/core/accel.c > index 7f9b715..01cdbc3 100644 > --- a/hw/core/accel.c > +++ b/hw/core/accel.c > @@ -30,6 +30,7 @@ > #include "sysemu/kvm.h" > #include "sysemu/qtest.h" > #include "hw/xen/xen.h" > +#include "qom/object.h" > > int tcg_tb_size; > static bool tcg_allowed = true; > @@ -40,32 +41,20 @@ static int tcg_init(MachineClass *mc) > return 0; > } > > -typedef struct AccelType { > - const char *opt_name; > - const char *name; > - int (*available)(void); > - int (*init)(MachineClass *mc); > - bool *allowed; > -} AccelType; > - > -static AccelType accel_list[] = { > - { "tcg", "tcg", tcg_available, tcg_init, &tcg_allowed }, > - { "xen", "Xen", xen_available, xen_init, &xen_allowed }, > - { "kvm", "KVM", kvm_available, kvm_init, &kvm_allowed }, > - { "qtest", "QTest", qtest_available, qtest_init_accel, &qtest_allowed }, > +static const TypeInfo accel_type = { > + .name = TYPE_ACCEL, > + .parent = TYPE_OBJECT, > + .class_size = sizeof(AccelClass), > + .instance_size = sizeof(AccelState), > }; > > -/* Lookup AccelType from opt_name. Returns NULL if not found */ > -static AccelType *accel_find(const char *opt_name) > +/* Lookup AccelClass from opt_name. Returns NULL if not found */ > +static AccelClass *accel_find(const char *opt_name) > { > - int i; > - for (i = 0; i < ARRAY_SIZE(accel_list); i++) { > - AccelType *acc = &accel_list[i]; > - if (acc->opt_name && strcmp(acc->opt_name, opt_name) == 0) { > - return acc; > - } > - } > - return NULL; > + char *class_name = g_strdup_printf(ACCEL_CLASS_NAME("%s"), opt_name); > + AccelClass *ac = ACCEL_CLASS(object_class_by_name(class_name)); > + g_free(class_name); > + return ac; > } > > int configure_accelerator(MachineClass *mc) > @@ -75,7 +64,7 @@ int configure_accelerator(MachineClass *mc) > int ret; > bool accel_initialised = false; > bool init_failed = false; > - AccelType *acc = NULL; > + AccelClass *acc = NULL; > > p = qemu_opt_get(qemu_get_machine_opts(), "accel"); > if (p == NULL) { > @@ -124,3 +113,83 @@ int configure_accelerator(MachineClass *mc) > > return !accel_initialised; > } > + > + > +static void tcg_accel_class_init(ObjectClass *oc, void *data) > +{ > + AccelClass *ac = ACCEL_CLASS(oc); > + ac->name = "tcg"; > + ac->available = tcg_available; > + ac->init = tcg_init; > + ac->allowed = &tcg_allowed; > +} > + > +#define TYPE_TCG_ACCEL ACCEL_CLASS_NAME("tcg") > + > +static const TypeInfo tcg_accel_type = { > + .name = TYPE_TCG_ACCEL, > + .parent = TYPE_ACCEL, > + .class_init = tcg_accel_class_init, > +}; > + > +static void xen_accel_class_init(ObjectClass *oc, void *data) > +{ > + AccelClass *ac = ACCEL_CLASS(oc); > + ac->name = "Xen"; > + ac->available = xen_available; > + ac->init = xen_init; > + ac->allowed = &xen_allowed; > +} > + > +#define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen") > + > +static const TypeInfo xen_accel_type = { > + .name = TYPE_XEN_ACCEL, > + .parent = TYPE_ACCEL, > + .class_init = xen_accel_class_init, > +}; > + > +static void kvm_accel_class_init(ObjectClass *oc, void *data) > +{ > + AccelClass *ac = ACCEL_CLASS(oc); > + ac->name = "KVM"; > + ac->available = kvm_available; > + ac->init = kvm_init; > + ac->allowed = &kvm_allowed; > +} > + > +#define TYPE_KVM_ACCEL ACCEL_CLASS_NAME("kvm") > + > +static const TypeInfo kvm_accel_type = { > + .name = TYPE_KVM_ACCEL, > + .parent = TYPE_ACCEL, > + .class_init = kvm_accel_class_init, > +}; > + > +static void qtest_accel_class_init(ObjectClass *oc, void *data) > +{ > + AccelClass *ac = ACCEL_CLASS(oc); > + ac->name = "QTest"; > + ac->available = qtest_available; > + ac->init = qtest_init_accel; > + ac->allowed = &qtest_allowed; > +} > + > +#define TYPE_QTEST_ACCEL ACCEL_CLASS_NAME("qtest") > + > +static const TypeInfo qtest_accel_type = { > + .name = TYPE_QTEST_ACCEL, > + .parent = TYPE_ACCEL, > + .class_init = qtest_accel_class_init, > +}; > + > +static void register_accel_types(void) > +{ > + type_register_static(&accel_type); > + type_register_static(&tcg_accel_type); > + type_register_static(&xen_accel_type); > + type_register_static(&kvm_accel_type); > + type_register_static(&qtest_accel_type); > +} > + > +type_init(register_accel_types); > diff --git a/include/hw/accel.h b/include/hw/accel.h > index 5537d74..120ca0e 100644 > --- a/include/hw/accel.h > +++ b/include/hw/accel.h > @@ -24,6 +24,36 @@ > #define HW_ACCEL_H > > #include "qemu/typedefs.h" > +#include "qom/object.h" > + > +typedef struct AccelState { > + /*< private >*/ > + Object parent_obj; > +} AccelState; > + > +typedef struct AccelClass { > + /*< private >*/ > + ObjectClass parent_class; > + /*< public >*/ > + > + const char *opt_name; > + const char *name; > + int (*available)(void); > + int (*init)(MachineClass *mc); > + bool *allowed; > +} AccelClass; > + > +#define TYPE_ACCEL "accel" > + > +#define ACCEL_CLASS_SUFFIX "-" TYPE_ACCEL > +#define ACCEL_CLASS_NAME(a) (a ACCEL_CLASS_SUFFIX) > + > +#define ACCEL_CLASS(klass) \ > + OBJECT_CLASS_CHECK(AccelClass, (klass), TYPE_ACCEL) > +#define ACCEL(obj) \ > + OBJECT_CHECK(AccelState, (obj), TYPE_ACCEL) > +#define ACCEL_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(AccelClass, (obj), TYPE_ACCEL) > > extern int tcg_tb_size; > > Reviewed-by: Paolo Bonzini