From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48314) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNSqX-0006jT-G7 for qemu-devel@nongnu.org; Fri, 29 Aug 2014 16:32:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XNSqQ-0002Vb-0E for qemu-devel@nongnu.org; Fri, 29 Aug 2014 16:32:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36957) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNSqP-0002VK-Ps for qemu-devel@nongnu.org; Fri, 29 Aug 2014 16:32:25 -0400 From: Eduardo Habkost Date: Fri, 29 Aug 2014 17:31:39 -0300 Message-Id: <1409344310-5441-7-git-send-email-ehabkost@redhat.com> In-Reply-To: <1409344310-5441-1-git-send-email-ehabkost@redhat.com> References: <1409344310-5441-1-git-send-email-ehabkost@redhat.com> Subject: [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: qemu-devel@nongnu.org Cc: Michael Mueller , Marcel Apfelbaum , "Michael S. Tsirkin" , Alexander Graf , Christian Borntraeger , "Jason J. Herne" , Paolo Bonzini , =?UTF-8?q?Andreas=20F=C3=A4rber?= 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; -- 1.9.3