Commit 12ceaef6 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

tcg: convert "-accel threads" to a QOM property



Replace the ad-hoc qemu_tcg_configure with generic code invoking QOM
property getters and setters.  More properties (and thus more valid
-accel suboptions) will be added in the next patches, which will move
accelerator-related "-machine" options to accelerators.

Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent fc5cf826
Loading
Loading
Loading
Loading
+38 −14
Original line number Diff line number Diff line
@@ -34,7 +34,17 @@
#include "include/qapi/error.h"
#include "include/qemu/error-report.h"
#include "include/hw/boards.h"
#include "qemu/option.h"

typedef struct TCGState {
    AccelState parent_obj;

    bool mttcg_enabled;
} TCGState;

#define TYPE_TCG_ACCEL ACCEL_CLASS_NAME("tcg")

#define TCG_STATE(obj) \
        OBJECT_CHECK(TCGState, (obj), TYPE_TCG_ACCEL)

unsigned long tcg_tb_size;

@@ -107,23 +117,33 @@ static bool default_mttcg_enabled(void)

static void tcg_accel_instance_init(Object *obj)
{
    mttcg_enabled = default_mttcg_enabled();
    TCGState *s = TCG_STATE(obj);

    s->mttcg_enabled = default_mttcg_enabled();
}

static int tcg_init(MachineState *ms)
{
    TCGState *s = TCG_STATE(current_machine->accelerator);

    tcg_exec_init(tcg_tb_size * 1024 * 1024);
    cpu_interrupt_handler = tcg_handle_interrupt;
    mttcg_enabled = s->mttcg_enabled;
    return 0;
}

void qemu_tcg_configure(QemuOpts *opts, Error **errp)
static char *tcg_get_thread(Object *obj, Error **errp)
{
    const char *t = qemu_opt_get(opts, "thread");
    if (!t) {
        return;
    TCGState *s = TCG_STATE(obj);

    return g_strdup(s->mttcg_enabled ? "multi" : "single");
}
    if (strcmp(t, "multi") == 0) {

static void tcg_set_thread(Object *obj, const char *value, Error **errp)
{
    TCGState *s = TCG_STATE(obj);

    if (strcmp(value, "multi") == 0) {
        if (TCG_OVERSIZED_GUEST) {
            error_setg(errp, "No MTTCG when guest word size > hosts");
        } else if (use_icount) {
@@ -138,12 +158,12 @@ void qemu_tcg_configure(QemuOpts *opts, Error **errp)
                            "than the host provides");
                error_printf("This may cause strange/hard to debug errors\n");
            }
            mttcg_enabled = true;
            s->mttcg_enabled = true;
        }
    } else if (strcmp(t, "single") == 0) {
        mttcg_enabled = false;
    } else if (strcmp(value, "single") == 0) {
        s->mttcg_enabled = false;
    } else {
        error_setg(errp, "Invalid 'thread' setting %s", t);
        error_setg(errp, "Invalid 'thread' setting %s", value);
    }
}

@@ -153,15 +173,19 @@ static void tcg_accel_class_init(ObjectClass *oc, void *data)
    ac->name = "tcg";
    ac->init_machine = tcg_init;
    ac->allowed = &tcg_allowed;
}

#define TYPE_TCG_ACCEL ACCEL_CLASS_NAME("tcg")
    object_class_property_add_str(oc, "thread",
                                  tcg_get_thread,
                                  tcg_set_thread,
                                  NULL);
}

static const TypeInfo tcg_accel_type = {
    .name = TYPE_TCG_ACCEL,
    .parent = TYPE_ACCEL,
    .instance_init = tcg_accel_instance_init,
    .class_init = tcg_accel_class_init,
    .instance_size = sizeof(TCGState),
};

static void register_accel_types(void)
+0 −2
Original line number Diff line number Diff line
@@ -40,6 +40,4 @@ extern int smp_threads;

void list_cpus(const char *optarg);

void qemu_tcg_configure(QemuOpts *opts, Error **errp);

#endif
+17 −15
Original line number Diff line number Diff line
@@ -293,17 +293,12 @@ static QemuOptsList qemu_accel_opts = {
    .implied_opt_name = "accel",
    .head = QTAILQ_HEAD_INITIALIZER(qemu_accel_opts.head),
    .desc = {
        {
            .name = "accel",
            .type = QEMU_OPT_STRING,
            .help = "Select the type of accelerator",
        },
        {
            .name = "thread",
            .type = QEMU_OPT_STRING,
            .help = "Enable/disable multi-threaded TCG",
        },
        { /* end of list */ }
        /*
         * no elements => accept any
         * sanity checking will happen later
         * when setting accelerator properties
         */
        { }
    },
};

@@ -2711,6 +2706,13 @@ static int do_configure_icount(void *opaque, QemuOpts *opts, Error **errp)
    return 0;
}

static int accelerator_set_property(void *opaque,
                                const char *name, const char *value,
                                Error **errp)
{
    return object_parse_property_opt(opaque, name, value, "accel", errp);
}

static int do_configure_accelerator(void *opaque, QemuOpts *opts, Error **errp)
{
    bool *p_init_failed = opaque;
@@ -2725,6 +2727,10 @@ static int do_configure_accelerator(void *opaque, QemuOpts *opts, Error **errp)
        return 0;
    }
    accel = ACCEL(object_new_with_class(OBJECT_CLASS(ac)));
    qemu_opt_foreach(opts, accelerator_set_property,
                     accel,
                     &error_fatal);

    ret = accel_init_machine(accel, current_machine);
    if (ret < 0) {
        *p_init_failed = true;
@@ -2732,10 +2738,6 @@ static int do_configure_accelerator(void *opaque, QemuOpts *opts, Error **errp)
                     acc, strerror(-ret));
        return 0;
    }

    if (tcg_enabled()) {
        qemu_tcg_configure(opts, &error_fatal);
    }
    return 1;
}