From: David Gibson <david@gibson.dropbear.id.au>
To: Bharata B Rao <bharata@linux.vnet.ibm.com>
Cc: mjrosato@linux.vnet.ibm.com, agraf@suse.de, thuth@redhat.com,
pkrempa@redhat.com, ehabkost@redhat.com, aik@ozlabs.ru,
qemu-devel@nongnu.org, armbru@redhat.com, borntraeger@de.ibm.com,
qemu-ppc@nongnu.org, pbonzini@redhat.com, imammedo@redhat.com,
afaerber@suse.de, mdroth@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [RFC PATCH v0 3/6] spapr: Represent boot CPUs as spapr-cpu-core devices
Date: Fri, 26 Feb 2016 14:45:35 +1100 [thread overview]
Message-ID: <20160226034535.GF20657@voom.fritz.box> (raw)
In-Reply-To: <1456417362-20652-4-git-send-email-bharata@linux.vnet.ibm.com>
[-- Attachment #1: Type: text/plain, Size: 7183 bytes --]
On Thu, Feb 25, 2016 at 09:52:39PM +0530, Bharata B Rao wrote:
> Initialize boot CPUs as spapr-cpu-core devices and create links from
> machine object to these core devices. These links can be considered
> as CPU slots in which core devices will get hot-plugged. spapr-cpu-core
> device's slot property indicates the slot where it is plugged. Information
> about all the CPU slots can be obtained by walking these links.
>
> Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
> ---
> hw/ppc/spapr.c | 65 +++++++++++++++++++++++++++++++++++++++++++-------
> include/hw/ppc/spapr.h | 3 +++
> 2 files changed, 60 insertions(+), 8 deletions(-)
>
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index e214a34..1f0d232 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -64,6 +64,7 @@
>
> #include "hw/compat.h"
> #include "qemu-common.h"
> +#include "hw/ppc/spapr_cpu_core.h"
>
> #include <libfdt.h>
>
> @@ -1720,6 +1721,21 @@ static void spapr_validate_node_memory(MachineState *machine, Error **errp)
> }
> }
>
> +/*
> + * Check to see if core is being hot-plugged into an already populated slot.
> + */
> +static void spapr_cpu_core_allow_set_link(Object *obj, const char *name,
> + Object *val, Error **errp)
> +{
> + Object *core = object_property_get_link(qdev_get_machine(), name, NULL);
> +
> + if (core) {
> + char *path = object_get_canonical_path(core);
> + error_setg(errp, "Slot %s already populated with %s", name, path);
> + g_free(path);
> + }
> +}
> +
> /* pSeries LPAR / sPAPR hardware init */
> static void ppc_spapr_init(MachineState *machine)
> {
> @@ -1728,7 +1744,6 @@ static void ppc_spapr_init(MachineState *machine)
> const char *kernel_filename = machine->kernel_filename;
> const char *kernel_cmdline = machine->kernel_cmdline;
> const char *initrd_filename = machine->initrd_filename;
> - PowerPCCPU *cpu;
> PCIHostState *phb;
> int i;
> MemoryRegion *sysmem = get_system_memory();
> @@ -1742,6 +1757,8 @@ static void ppc_spapr_init(MachineState *machine)
> long load_limit, fw_size;
> bool kernel_le = false;
> char *filename;
> + int spapr_cores = smp_cpus / smp_threads;
> + int spapr_max_cores = max_cpus / smp_threads;
>
> msi_supported = true;
>
> @@ -1800,13 +1817,38 @@ static void ppc_spapr_init(MachineState *machine)
> if (machine->cpu_model == NULL) {
> machine->cpu_model = kvm_enabled() ? "host" : "POWER7";
> }
> - for (i = 0; i < smp_cpus; i++) {
> - cpu = cpu_ppc_init(machine->cpu_model);
> - if (cpu == NULL) {
> - error_report("Unable to find PowerPC CPU definition");
> - exit(1);
> +
> + spapr->cores = g_malloc0(spapr_max_cores * sizeof(Object));
> +
> + for (i = 0; i < spapr_max_cores; i++) {
> + Object *spapr_cpu_core = object_new(TYPE_SPAPR_CPU_CORE);
So.. if I understand correctly this will always construct maxcpus
threads at startup. I's just that the ones beyond initial cpus won't
be realized. Was that your intention? I thought the plan was to only
construct the hotplugged cpus when they were hotplugged (in contrast
to my earlier proposal).
> + char name[32];
> +
> + object_property_set_str(spapr_cpu_core, machine->cpu_model, "cpu_model",
> + &error_fatal);
> + object_property_set_int(spapr_cpu_core, smp_threads, "nr_threads",
> + &error_fatal);
> + /*
> + * Create links from machine objects to all possible cores.
> + */
> + snprintf(name, sizeof(name), "%s[%d]", SPAPR_MACHINE_CPU_CORE_PROP, i);
Why do SPAPR_MACHINE_CPU_CORE_PROP and SPAPR_CPU_CORE_SLOT_PROP get
#defines, but the other properties get bare strings? I find the bare
strings are usually easier to follow.
> + object_property_add_link(OBJECT(spapr), name, TYPE_SPAPR_CPU_CORE,
> + (Object **)&spapr->cores[i],
> + spapr_cpu_core_allow_set_link, 0,
> + &error_fatal);
> +
> + /*
> + * Set the link from machine object to core object for all
> + * boot time CPUs specified with -smp and realize them.
> + * For rest of the hotpluggable cores this is happens from
> + * the core hotplug/realization path.
> + */
> + if (i < spapr_cores) {
> + object_property_set_str(spapr_cpu_core, name,
> + SPAPR_CPU_CORE_SLOT_PROP, &error_fatal);
> + object_property_set_bool(spapr_cpu_core, true, "realized",
> + &error_fatal);
> }
> - spapr_cpu_init(spapr, cpu, &error_fatal);
> }
>
> if (kvm_enabled()) {
> @@ -2209,6 +2251,7 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
> DeviceState *dev, Error **errp)
> {
> sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(qdev_get_machine());
> + sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
>
> if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
> int node;
> @@ -2245,6 +2288,11 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
> }
>
> spapr_memory_plug(hotplug_dev, dev, node, errp);
> + } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
> + CPUState *cs = CPU(dev);
> + PowerPCCPU *cpu = POWERPC_CPU(cs);
> +
> + spapr_cpu_init(ms, cpu, errp);
I tend to thin the spapr_cpu_init() should be done from the core's
create_threads() function, but I'm willing to be persuaded otherwise.
> }
> }
>
> @@ -2259,7 +2307,8 @@ static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev,
> static HotplugHandler *spapr_get_hotpug_handler(MachineState *machine,
> DeviceState *dev)
> {
> - if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
> + if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) ||
> + object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
> return HOTPLUG_HANDLER(machine);
> }
> return NULL;
> diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> index 098d85d..20b3417 100644
> --- a/include/hw/ppc/spapr.h
> +++ b/include/hw/ppc/spapr.h
> @@ -79,8 +79,11 @@ struct sPAPRMachineState {
> /*< public >*/
> char *kvm_type;
> MemoryHotplugState hotplug_memory;
> + Object *cores;
> };
>
> +#define SPAPR_MACHINE_CPU_CORE_PROP "core"
> +
> #define H_SUCCESS 0
> #define H_BUSY 1 /* Hardware busy -- retry later */
> #define H_CLOSED 2 /* Resource closed */
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-02-26 3:50 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
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 [this message]
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=20160226034535.GF20657@voom.fritz.box \
--to=david@gibson.dropbear.id.au \
--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=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 \
--cc=thuth@redhat.com \
/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.