From: Thomas Huth <thuth@redhat.com>
To: Bharata B Rao <bharata@linux.vnet.ibm.com>, qemu-devel@nongnu.org
Cc: mjrosato@linux.vnet.ibm.com, pkrempa@redhat.com,
ehabkost@redhat.com, aik@ozlabs.ru, armbru@redhat.com,
agraf@suse.de, borntraeger@de.ibm.com, qemu-ppc@nongnu.org,
pbonzini@redhat.com, imammedo@redhat.com,
mdroth@linux.vnet.ibm.com, afaerber@suse.de,
david@gibson.dropbear.id.au
Subject: Re: [Qemu-devel] [RFC PATCH v0 2/6] spapr: CPU core device
Date: Fri, 26 Feb 2016 11:46:19 +0100 [thread overview]
Message-ID: <56D02CFB.8000207@redhat.com> (raw)
In-Reply-To: <1456417362-20652-3-git-send-email-bharata@linux.vnet.ibm.com>
On 25.02.2016 17:22, Bharata B Rao wrote:
> Add sPAPR specific CPU core device that is based on generic CPU core device.
> Creating this core device will result in creation of all the CPU thread
> devices that are part of this core.
>
> Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
> ---
...
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> new file mode 100644
> index 0000000..c44eb61
> --- /dev/null
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -0,0 +1,210 @@
> +/*
> + * sPAPR CPU core device, acts as container of CPU thread devices.
> + *
> + * Copyright (C) 2016 Bharata B Rao <bharata@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +#include "hw/cpu/core.h"
> +#include "hw/ppc/spapr_cpu_core.h"
> +#include "hw/ppc/spapr.h"
> +#include "hw/boards.h"
> +#include "qemu/error-report.h"
> +#include "qapi/visitor.h"
> +#include <sysemu/cpus.h>
> +
> +static int spapr_cpu_core_realize_child(Object *child, void *opaque)
> +{
> + Error **errp = opaque;
> +
> + object_property_set_bool(child, true, "realized", errp);
> + if (*errp) {
> + return 1;
> + }
> + return 0;
> +}
> +
> +static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
> +{
> + sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
> + sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
> + Error *local_err = NULL;
> +
> + if (!core->nr_threads) {
> + error_setg(errp, "nr_threads property can't be 0");
> + return;
> + }
> +
> + if (!core->cpu_model) {
> + error_setg(errp, "cpu_model property isn't set");
> + return;
> + }
> +
> + /*
> + * TODO: If slot isn't specified, plug this core into
> + * an existing empty slot.
> + */
> + if (!core->slot) {
> + error_setg(errp, "slot property isn't set");
> + return;
> + }
> +
> + object_property_set_link(OBJECT(spapr), OBJECT(core), core->slot,
> + &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> +
> + object_child_foreach(OBJECT(dev), spapr_cpu_core_realize_child, errp);
> +}
> +
> +/*
> + * This creates the CPU threads for a given @core.
> + *
> + * In order to create the threads, we need two inputs - number of
> + * threads and the cpu_model. These are set as core object's properties.
> + * When both of them become available/set, this routine will be called from
> + * either property's set handler to create the threads.
> + *
> + * TODO: Dependence of threads creation on two properties is resulting
> + * in this not-so-clean way of creating threads from either of the
> + * property setters based on the order in which they get set. Check if
> + * this can be handled in a better manner.
> + */
> +static void spapr_cpu_core_create_threads(sPAPRCPUCore *core, Error **errp)
> +{
> + int i;
> +
> + for (i = 0; i < core->nr_threads; i++) {
> + char id[32];
> + char type[32];
> +
> + snprintf(type, sizeof(type), "%s-%s", core->cpu_model,
> + TYPE_POWERPC_CPU);
> + object_initialize(&core->threads[i], sizeof(core->threads[i]), type);
> +
> + snprintf(id, sizeof(id), "thread[%d]", i);
> + object_property_add_child(OBJECT(core), id, OBJECT(&core->threads[i]),
> + errp);
Need to check errp here to see whether something went wrong?
> + }
> +}
> +
> +static char *spapr_cpu_core_prop_get_slot(Object *obj, Error **errp)
> +{
> + sPAPRCPUCore *core = SPAPR_CPU_CORE(obj);
> +
> + return core->slot;
> +}
> +
> +static void spapr_cpu_core_prop_set_slot(Object *obj, const char *val,
> + Error **errp)
> +{
> + sPAPRCPUCore *core = SPAPR_CPU_CORE(obj);
> +
> + core->slot = g_strdup(val);
> +}
> +
> +static char *spapr_cpu_core_prop_get_cpu_model(Object *obj, Error **errp)
> +{
> + sPAPRCPUCore *core = SPAPR_CPU_CORE(obj);
> +
> + return core->cpu_model;
> +}
> +
> +static void spapr_cpu_core_prop_set_cpu_model(Object *obj, const char *val,
> + Error **errp)
> +{
> + sPAPRCPUCore *core = SPAPR_CPU_CORE(obj);
> + MachineState *machine = MACHINE(qdev_get_machine());
> +
> + /*
> + * cpu_model can't be different from what is specified with -cpu
> + */
> + if (strcmp(val, machine->cpu_model)) {
> + error_setg(errp, "cpu_model should be %s", machine->cpu_model);
s/should/must/
> + return;
> + }
> +
> + core->cpu_model = g_strdup(val);
> + if (core->nr_threads && core->cpu_model) {
> + spapr_cpu_core_create_threads(core, errp);
> + }
> +}
> +
> +static void spapr_cpu_core_prop_get_nr_threads(Object *obj, Visitor *v,
> + const char *name, void *opaque,
> + Error **errp)
> +{
> + sPAPRCPUCore *core = SPAPR_CPU_CORE(obj);
> + int64_t value = core->nr_threads;
> +
> + visit_type_int(v, name, &value, errp);
> +}
> +
> +static void spapr_cpu_core_prop_set_nr_threads(Object *obj, Visitor *v,
> + const char *name, void *opaque,
> + Error **errp)
> +{
> + sPAPRCPUCore *core = SPAPR_CPU_CORE(obj);
> + Error *local_err = NULL;
> + int64_t value;
> +
> + visit_type_int(v, name, &value, &local_err);
> + if (local_err) {
> + error_propagate(errp, local_err);
> + return;
> + }
> +
> + /* Allow only homogeneous configuration */
> + if (value != smp_threads) {
> + error_setg(errp, "nr_threads should be %d", smp_threads);
s/should/must/
> + return;
> + }
> +
> + core->nr_threads = value;
> + core->threads = g_malloc0(core->nr_threads * sizeof(PowerPCCPU));
I think it's preferable to use g_new0 for such allocations instead.
Also, should this memory maybe be freed during instance_finalize again,
so that there is no memory leak here in case the cores are deleted again
one day?
> + if (core->nr_threads && core->cpu_model) {
> + spapr_cpu_core_create_threads(core, errp);
> + }
> +}
> +
> +static void spapr_cpu_core_instance_init(Object *obj)
> +{
> + object_property_add(obj, "nr_threads", "int",
> + spapr_cpu_core_prop_get_nr_threads,
> + spapr_cpu_core_prop_set_nr_threads,
> + NULL, NULL, NULL);
> + object_property_add_str(obj, "cpu_model",
> + spapr_cpu_core_prop_get_cpu_model,
> + spapr_cpu_core_prop_set_cpu_model,
> + NULL);
> + object_property_add_str(obj, "slot",
> + spapr_cpu_core_prop_get_slot,
> + spapr_cpu_core_prop_set_slot,
> + NULL);
> +}
> +
> +static void spapr_cpu_core_class_init(ObjectClass *oc, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(oc);
> +
> + dc->realize = spapr_cpu_core_realize;
> +}
> +
> +static const TypeInfo spapr_cpu_core_type_info = {
> + .name = TYPE_SPAPR_CPU_CORE,
> + .parent = TYPE_CPU_CORE,
> + .instance_init = spapr_cpu_core_instance_init,
> + .instance_size = sizeof(sPAPRCPUCore),
> + .class_init = spapr_cpu_core_class_init,
> +};
> +
> +static void spapr_cpu_core_register_types(void)
> +{
> + type_register_static(&spapr_cpu_core_type_info);
> +}
> +
> +type_init(spapr_cpu_core_register_types)
> diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_core.h
> new file mode 100644
> index 0000000..ed9bc7f
> --- /dev/null
> +++ b/include/hw/ppc/spapr_cpu_core.h
> @@ -0,0 +1,32 @@
> +/*
> + * sPAPR CPU core device.
> + *
> + * Copyright (C) 2016 Bharata B Rao <bharata@linux.vnet.ibm.com>
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +#ifndef HW_SPAPR_CPU_CORE_H
> +#define HW_SPAPR_CPU_CORE_H
> +
> +#include "hw/qdev.h"
> +#include "hw/cpu/core.h"
> +
> +#define TYPE_SPAPR_CPU_CORE "spapr-cpu-core"
> +#define SPAPR_CPU_CORE(obj) \
> + OBJECT_CHECK(sPAPRCPUCore, (obj), TYPE_SPAPR_CPU_CORE)
> +
> +typedef struct sPAPRCPUCore {
> + /*< private >*/
> + DeviceState parent_obj;
> +
> + /*< public >*/
> + int nr_threads;
> + char *cpu_model;
> + char *slot;
<bikeshedpainting>
I'd maybe call that "slot_name" instead ... if you only call it "slot",
I'd rather think of an integer value than a string here.
</bikeshedpainting>
> + PowerPCCPU *threads;
> +} sPAPRCPUCore;
> +
> +#define SPAPR_CPU_CORE_SLOT_PROP "slot"
> +
> +#endif
>
Thomas
next prev parent reply other threads:[~2016-02-26 10:46 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-25 16:22 [Qemu-devel] [RFC PATCH v0 0/6] Core based CPU hotplug for PowerPC sPAPR Bharata B Rao
2016-02-25 16:22 ` [Qemu-devel] [RFC PATCH v0 1/6] cpu: Abstract CPU core type Bharata B Rao
2016-02-25 16:22 ` [Qemu-devel] [RFC PATCH v0 2/6] spapr: CPU core device Bharata B Rao
2016-02-26 2:57 ` David Gibson
2016-02-26 5:39 ` Bharata B Rao
2016-02-26 10:46 ` Thomas Huth [this message]
2016-02-29 5:39 ` Bharata B Rao
2016-02-26 18:13 ` Michael Roth
2016-02-29 3:44 ` David Gibson
2016-02-29 5:50 ` Bharata B Rao
2016-02-29 10:03 ` Igor Mammedov
2016-02-29 12:55 ` Bharata B Rao
2016-02-29 15:15 ` Igor Mammedov
2016-03-01 1:21 ` David Gibson
2016-03-01 9:27 ` Igor Mammedov
2016-03-01 8:17 ` Bharata B Rao
2016-03-01 9:16 ` Igor Mammedov
2016-03-01 9:45 ` Bharata B Rao
2016-02-25 16:22 ` [Qemu-devel] [RFC PATCH v0 3/6] spapr: Represent boot CPUs as spapr-cpu-core devices Bharata B Rao
2016-02-26 3:45 ` David Gibson
2016-02-26 4:02 ` Bharata B Rao
2016-02-26 15:18 ` Igor Mammedov
2016-02-29 5:35 ` Bharata B Rao
2016-02-29 7:11 ` David Gibson
2016-02-25 16:22 ` [Qemu-devel] [RFC PATCH v0 4/6] spapr: CPU hotplug support Bharata B Rao
2016-02-26 3:51 ` David Gibson
2016-02-29 4:42 ` Bharata B Rao
2016-03-01 7:58 ` Bharata B Rao
2016-03-02 0:53 ` David Gibson
2016-02-26 13:03 ` Thomas Huth
2016-02-26 14:54 ` Bharata B Rao
2016-02-25 16:22 ` [Qemu-devel] [RFC PATCH v0 5/6] qmp, spapr: Show hot-plugged/pluggable CPU slots in the Machine Bharata B Rao
2016-02-26 4:03 ` David Gibson
2016-02-26 9:40 ` Bharata B Rao
2016-02-26 15:58 ` Eric Blake
2016-02-29 5:43 ` Bharata B Rao
2016-02-26 16:33 ` Thomas Huth
2016-02-29 10:46 ` Igor Mammedov
2016-03-01 9:09 ` Bharata B Rao
2016-03-01 13:55 ` Igor Mammedov
2016-03-03 9:30 ` Bharata B Rao
2016-03-03 15:54 ` Igor Mammedov
2016-02-25 16:22 ` [Qemu-devel] [RFC PATCH v0 6/6] hmp: Implement 'info cpu-slots' Bharata B Rao
2016-03-01 10:00 ` [Qemu-devel] [RFC PATCH v0 0/6] Core based CPU hotplug for PowerPC sPAPR Bharata B Rao
2016-03-01 13:59 ` Andreas Färber
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=56D02CFB.8000207@redhat.com \
--to=thuth@redhat.com \
--cc=afaerber@suse.de \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=armbru@redhat.com \
--cc=bharata@linux.vnet.ibm.com \
--cc=borntraeger@de.ibm.com \
--cc=david@gibson.dropbear.id.au \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mjrosato@linux.vnet.ibm.com \
--cc=pbonzini@redhat.com \
--cc=pkrempa@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.