From: Bharata B Rao <bharata@linux.vnet.ibm.com>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: mdroth@linux.vnet.ibm.com, agraf@suse.de, qemu-devel@nongnu.org,
qemu-ppc@nongnu.org, tyreld@linux.vnet.ibm.com,
nfont@linux.vnet.ibm.com, imammedo@redhat.com, afaerber@suse.de
Subject: Re: [Qemu-devel] [RFC PATCH v2 12/23] spapr: CPU hotplug support
Date: Wed, 25 Mar 2015 14:06:29 +0530 [thread overview]
Message-ID: <20150325083629.GD32581@in.ibm.com> (raw)
In-Reply-To: <20150325030345.GW25043@voom.fritz.box>
On Wed, Mar 25, 2015 at 02:03:45PM +1100, David Gibson wrote:
> On Mon, Mar 23, 2015 at 07:05:53PM +0530, Bharata B Rao wrote:
> > Support CPU hotplug via device-add command. Set up device tree
> > entries for the hotplugged CPU core and use the exising EPOW event
> > infrastructure to send CPU hotplug notification to the guest.
> >
> > Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
> > ---
> > hw/ppc/spapr.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++
> > hw/ppc/spapr_events.c | 8 +++---
> > hw/ppc/spapr_rtas.c | 11 ++++++++
> > 3 files changed, 91 insertions(+), 3 deletions(-)
> >
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index f52d38f..b48994b 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -33,6 +33,7 @@
> > #include "sysemu/block-backend.h"
> > #include "sysemu/cpus.h"
> > #include "sysemu/kvm.h"
> > +#include "sysemu/device_tree.h"
> > #include "kvm_ppc.h"
> > #include "mmu-hash64.h"
> > #include "qom/cpu.h"
> > @@ -660,6 +661,10 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset)
> > QemuOpts *opts = qemu_opts_find(qemu_find_opts("smp-opts"), NULL);
> > unsigned sockets = opts ? qemu_opt_get_number(opts, "sockets", 0) : 0;
> > uint32_t cpus_per_socket = sockets ? (smp_cpus / sockets) : 1;
> > + sPAPRDRConnector *drc =
> > + spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, index);
> > + sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> > + int drc_index = drck->get_index(drc);
> >
> > _FDT((fdt_setprop_cell(fdt, offset, "reg", index)));
> > _FDT((fdt_setprop_string(fdt, offset, "device_type", "cpu")));
> > @@ -728,6 +733,8 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset)
> >
> > _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id",
> > cs->cpu_index / cpus_per_socket)));
> > + _FDT((fdt_setprop_cell(fdt, offset, "ibm,my-drc-index", drc_index)));
> > +
>
> What effect will this have when running with DR disabled?
I realize now that I shouldn't probably populate this at all in that case.
This routine is now common for both bootpath and hotplug path. Will take
care of this in next post.
>
> > _FDT(spapr_fixup_cpu_numa_smt_dt(fdt, offset, cs, spapr));
> > }
> > @@ -1840,6 +1847,70 @@ static void spapr_nmi(NMIState *n, int cpu_index, Error **errp)
> > }
> > }
> >
> > +static void spapr_cpu_hotplug_add(DeviceState *dev, CPUState *cs, Error **errp)
> > +{
> > + PowerPCCPU *cpu = POWERPC_CPU(cs);
> > + DeviceClass *dc = DEVICE_GET_CLASS(cs);
> > + int id = ppc_get_vcpu_dt_id(cpu);
> > + sPAPRDRConnector *drc =
> > + spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, id);
> > + sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> > + void *fdt;
> > + int offset, i, fdt_size;
> > + char *nodename;
> > +
> > + fdt = create_device_tree(&fdt_size);
> > + nodename = g_strdup_printf("%s@%x", dc->fw_name, id);
> > + offset = fdt_add_subnode(fdt, 0, nodename);
> > +
> > + /* Set NUMA node for the added CPU core */
> > + for (i = 0; i < nb_numa_nodes; i++) {
> > + if (test_bit(cs->cpu_index, numa_info[i].node_cpu)) {
> > + cs->numa_node = i;
> > + break;
> > + }
> > + }
> > +
> > + spapr_populate_cpu_dt(cs, fdt, offset);
> > + g_free(nodename);
> > +
> > + drck->attach(drc, dev, fdt, offset, !dev->hotplugged, errp);
> > + if (*errp) {
> > + g_free(fdt);
> > + }
> > +}
> > +
> > +static void spapr_cpu_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
> > + Error **errp)
> > +{
> > + CPUState *cs = CPU(dev);
> > + PowerPCCPU *cpu = POWERPC_CPU(cs);
> > + int id = ppc_get_vcpu_dt_id(cpu);
> > + sPAPRDRConnector *drc =
> > + spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_CPU, id);
> > + int smt = kvmppc_smt_threads();
> > + Error *local_err = NULL;
> > +
> > + /*
> > + * SMT threads return from here, only main thread (core) will
> > + * continue and signal hotplug event to the guest.
> > + */
> > + if ((id % smt) != 0) {
> > + return;
> > + }
> > +
> > + g_assert(drc);
> > +
> > + spapr_cpu_hotplug_add(dev, cs, &local_err);
> > + if (local_err) {
> > + error_propagate(errp, local_err);
> > + return;
> > + }
> > + spapr_hotplug_req_add_event(drc);
> > +
> > + return;
> > +}
> > +
> > static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
> > DeviceState *dev, Error **errp)
> > {
> > @@ -1848,6 +1919,10 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
> > PowerPCCPU *cpu = POWERPC_CPU(cs);
> >
> > spapr_cpu_init(cpu);
> > + spapr_cpu_reset(cpu);
> > + if (dev->hotplugged && spapr->dr_cpu_enabled) {
> > + spapr_cpu_plug(hotplug_dev, dev, errp);
> > + }
> > }
> > }
> >
> > diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
> > index be82815..4ae818a 100644
> > --- a/hw/ppc/spapr_events.c
> > +++ b/hw/ppc/spapr_events.c
> > @@ -421,14 +421,16 @@ static void spapr_hotplug_req_event(sPAPRDRConnector *drc, uint8_t hp_action)
> > hp->hdr.section_length = cpu_to_be16(sizeof(*hp));
> > hp->hdr.section_version = 1; /* includes extended modifier */
> > hp->hotplug_action = hp_action;
> > -
> > + hp->drc.index = cpu_to_be32(drck->get_index(drc));
> > + hp->hotplug_identifier = RTAS_LOG_V6_HP_ID_DRC_INDEX;
> >
> > switch (drc_type) {
> > case SPAPR_DR_CONNECTOR_TYPE_PCI:
> > - hp->drc.index = cpu_to_be32(drck->get_index(drc));
> > - hp->hotplug_identifier = RTAS_LOG_V6_HP_ID_DRC_INDEX;
> > hp->hotplug_type = RTAS_LOG_V6_HP_TYPE_PCI;
> > break;
> > + case SPAPR_DR_CONNECTOR_TYPE_CPU:
> > + hp->hotplug_type = RTAS_LOG_V6_HP_TYPE_CPU;
> > + break;
> > default:
> > /* we shouldn't be signaling hotplug events for resources
> > * that don't support them
> > diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
> > index 57ec97a..48aeb86 100644
> > --- a/hw/ppc/spapr_rtas.c
> > +++ b/hw/ppc/spapr_rtas.c
> > @@ -121,6 +121,16 @@ static void rtas_query_cpu_stopped_state(PowerPCCPU *cpu_,
> > rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
> > }
> >
> > +static void spapr_cpu_set_endianness(PowerPCCPU *cpu)
> > +{
> > + PowerPCCPU *fcpu = POWERPC_CPU(first_cpu);
> > + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(fcpu);
>
> In some ways it might be nicer to store the global endian mode in
> sPAPRMachineState, updating it on H_SET_MODE, rather than copying the
> first cpu, although I guess that works.
I can give it a stab at that if you feel strongly about it.
Regards,
Bharata.
next prev parent reply other threads:[~2015-03-25 8:36 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-23 13:35 [Qemu-devel] [RFC PATCH v2 00/23] CPU and Memory hotplug for PowerPC sPAPR guests Bharata B Rao
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 01/23] spapr: enable PHB/CPU/LMB hotplug for pseries-2.3 Bharata B Rao
2015-03-25 0:04 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 02/23] spapr: Add DRC dt entries for CPUs Bharata B Rao
2015-03-25 0:07 ` David Gibson
2015-03-25 5:02 ` Bharata B Rao
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 03/23] spapr: Consider max_cpus during xics initialization Bharata B Rao
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 04/23] spapr: Support ibm, lrdr-capacity device tree property Bharata B Rao
2015-03-25 0:15 ` David Gibson
2015-04-01 3:59 ` Bharata B Rao
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 05/23] spapr: Reorganize CPU dt generation code Bharata B Rao
2015-03-25 1:36 ` David Gibson
2015-03-25 8:26 ` Bharata B Rao
2015-03-26 1:40 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 06/23] spapr: Consolidate cpu init code into a routine Bharata B Rao
2015-03-25 1:37 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 07/23] cpu: Prepare Socket container type Bharata B Rao
2015-03-25 2:03 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 08/23] ppc: Prepare CPU socket/core abstraction Bharata B Rao
2015-03-25 2:06 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 09/23] spapr: Add CPU hotplug handler Bharata B Rao
2015-03-25 2:08 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 10/23] ppc: Update cpu_model in MachineState Bharata B Rao
2015-03-25 2:30 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 11/23] ppc: Create sockets and cores for CPUs Bharata B Rao
2015-03-25 2:39 ` David Gibson
2015-03-25 8:33 ` Bharata B Rao
2015-03-26 1:54 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 12/23] spapr: CPU hotplug support Bharata B Rao
2015-03-25 3:03 ` David Gibson
2015-03-25 8:36 ` Bharata B Rao [this message]
2015-03-26 1:42 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 13/23] cpus: Add Error argument to cpu_exec_init() Bharata B Rao
2015-03-25 3:12 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 14/23] cpus: Convert cpu_index into a bitmap Bharata B Rao
2015-03-25 3:23 ` David Gibson
2015-03-25 8:52 ` Bharata B Rao
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 15/23] ppc: Move cpu_exec_init() call to realize function Bharata B Rao
2015-03-25 3:25 ` David Gibson
2015-03-25 8:56 ` Bharata B Rao
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 16/23] cpus: Reclaim vCPU objects Bharata B Rao
2015-03-25 5:22 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 17/23] xics_kvm: Don't enable KVM_CAP_IRQ_XICS if already enabled Bharata B Rao
2015-03-25 5:24 ` David Gibson
2015-03-25 9:12 ` Bharata B Rao
2015-03-26 1:46 ` David Gibson
2015-03-23 13:35 ` [Qemu-devel] [RFC PATCH v2 18/23] xics_kvm: Add cpu_destroy method to XICS Bharata B Rao
2015-03-25 5:26 ` David Gibson
2015-03-23 13:36 ` [Qemu-devel] [RFC PATCH v2 19/23] spapr: CPU hot unplug support Bharata B Rao
2015-03-25 5:44 ` David Gibson
2015-03-25 16:34 ` Bharata B Rao
2015-04-07 6:45 ` [Qemu-devel] [Qemu-ppc] " Alexey Kardashevskiy
2015-04-09 3:51 ` Bharata B Rao
2015-03-23 13:36 ` [Qemu-devel] [RFC PATCH v2 20/23] spapr: Remove vCPU objects after CPU hot unplug Bharata B Rao
2015-03-25 5:46 ` David Gibson
2015-03-23 13:36 ` [Qemu-devel] [RFC PATCH v2 21/23] spapr: Initialize hotplug memory address space Bharata B Rao
2015-03-25 5:58 ` David Gibson
2015-04-13 2:59 ` Bharata B Rao
2015-04-13 14:04 ` Igor Mammedov
2015-04-13 14:27 ` Bharata B Rao
2015-04-13 14:55 ` Igor Mammedov
2015-04-14 7:17 ` David Gibson
2015-03-23 13:36 ` [Qemu-devel] [RFC PATCH v2 22/23] spapr: Support ibm, dynamic-reconfiguration-memory Bharata B Rao
2015-03-26 3:44 ` David Gibson
2015-03-30 9:11 ` Bharata B Rao
2015-03-31 2:19 ` David Gibson
2015-03-23 13:36 ` [Qemu-devel] [RFC PATCH v2 23/23] spapr: Memory hotplug support Bharata B Rao
2015-03-26 3:57 ` David Gibson
2015-04-13 3:03 ` Bharata B Rao
2015-04-13 14:12 ` Igor Mammedov
2015-03-26 3:58 ` [Qemu-devel] [RFC PATCH v2 00/23] CPU and Memory hotplug for PowerPC sPAPR guests David Gibson
2015-03-26 4:16 ` Bharata B Rao
2015-04-06 10:19 ` Bharata B Rao
2015-04-07 8:57 ` Igor Mammedov
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=20150325083629.GD32581@in.ibm.com \
--to=bharata@linux.vnet.ibm.com \
--cc=afaerber@suse.de \
--cc=agraf@suse.de \
--cc=david@gibson.dropbear.id.au \
--cc=imammedo@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=nfont@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=tyreld@linux.vnet.ibm.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.