From: David Gibson <david@gibson.dropbear.id.au>
To: peter.maydell@linaro.org, groug@kaod.org
Cc: agraf@suse.de, surajjs@au1.ibm.com, qemu-ppc@nongnu.org,
qemu-devel@nongnu.org, David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PULL 08/30] spapr: harden code that depends on VSMT
Date: Tue, 6 Mar 2018 15:01:32 +1100 [thread overview]
Message-ID: <20180306040154.3669-9-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20180306040154.3669-1-david@gibson.dropbear.id.au>
From: Greg Kurz <groug@kaod.org>
VSMT must be set in order to compute VCPU ids. This means that the
following functions must not be called before spapr_set_vsmt_mode()
was called:
- spapr_vcpu_id()
- spapr_is_thread0_in_vcore()
- xics_max_server_number()
We had a recent regression where the latter would be called before VSMT
was set, and broke migration of some old machine types. This patch
adds assert() in the above functions to avoid problems in the future.
Also, since VSMT is really a CPU related thing, spapr_set_vsmt_mode() is
now called from spapr_init_cpus(), just before the first VSMT user.
Signed-off-by: Greg Kurz <groug@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/ppc/spapr.c | 144 ++++++++++++++++++++++++++++++---------------------------
1 file changed, 75 insertions(+), 69 deletions(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 3f1c5c5133..1c2703cb6b 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -105,12 +105,14 @@
*/
static int spapr_vcpu_id(sPAPRMachineState *spapr, int cpu_index)
{
+ assert(spapr->vsmt);
return
(cpu_index / smp_threads) * spapr->vsmt + cpu_index % smp_threads;
}
static bool spapr_is_thread0_in_vcore(sPAPRMachineState *spapr,
PowerPCCPU *cpu)
{
+ assert(spapr->vsmt);
return spapr_get_vcpu_id(cpu) % spapr->vsmt == 0;
}
@@ -177,6 +179,7 @@ static void pre_2_10_vmstate_unregister_dummy_icp(int i)
static int xics_max_server_number(sPAPRMachineState *spapr)
{
+ assert(spapr->vsmt);
return DIV_ROUND_UP(max_cpus * spapr->vsmt, smp_threads);
}
@@ -2220,73 +2223,6 @@ static CPUArchId *spapr_find_cpu_slot(MachineState *ms, uint32_t id, int *idx)
return &ms->possible_cpus->cpus[index];
}
-static void spapr_init_cpus(sPAPRMachineState *spapr)
-{
- MachineState *machine = MACHINE(spapr);
- MachineClass *mc = MACHINE_GET_CLASS(machine);
- sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
- const char *type = spapr_get_cpu_core_type(machine->cpu_type);
- const CPUArchIdList *possible_cpus;
- int boot_cores_nr = smp_cpus / smp_threads;
- int i;
-
- possible_cpus = mc->possible_cpu_arch_ids(machine);
- if (mc->has_hotpluggable_cpus) {
- if (smp_cpus % smp_threads) {
- error_report("smp_cpus (%u) must be multiple of threads (%u)",
- smp_cpus, smp_threads);
- exit(1);
- }
- if (max_cpus % smp_threads) {
- error_report("max_cpus (%u) must be multiple of threads (%u)",
- max_cpus, smp_threads);
- exit(1);
- }
- } else {
- if (max_cpus != smp_cpus) {
- error_report("This machine version does not support CPU hotplug");
- exit(1);
- }
- boot_cores_nr = possible_cpus->len;
- }
-
- if (smc->pre_2_10_has_unused_icps) {
- int i;
-
- for (i = 0; i < xics_max_server_number(spapr); i++) {
- /* Dummy entries get deregistered when real ICPState objects
- * are registered during CPU core hotplug.
- */
- pre_2_10_vmstate_register_dummy_icp(i);
- }
- }
-
- for (i = 0; i < possible_cpus->len; i++) {
- int core_id = i * smp_threads;
-
- if (mc->has_hotpluggable_cpus) {
- spapr_dr_connector_new(OBJECT(spapr), TYPE_SPAPR_DRC_CPU,
- spapr_vcpu_id(spapr, core_id));
- }
-
- if (i < boot_cores_nr) {
- Object *core = object_new(type);
- int nr_threads = smp_threads;
-
- /* Handle the partially filled core for older machine types */
- if ((i + 1) * smp_threads >= smp_cpus) {
- nr_threads = smp_cpus - i * smp_threads;
- }
-
- object_property_set_int(core, nr_threads, "nr-threads",
- &error_fatal);
- object_property_set_int(core, core_id, CPU_CORE_PROP_CORE_ID,
- &error_fatal);
- object_property_set_bool(core, true, "realized", &error_fatal);
- }
- }
-}
-
static void spapr_set_vsmt_mode(sPAPRMachineState *spapr, Error **errp)
{
Error *local_err = NULL;
@@ -2359,6 +2295,78 @@ out:
error_propagate(errp, local_err);
}
+static void spapr_init_cpus(sPAPRMachineState *spapr)
+{
+ MachineState *machine = MACHINE(spapr);
+ MachineClass *mc = MACHINE_GET_CLASS(machine);
+ sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
+ const char *type = spapr_get_cpu_core_type(machine->cpu_type);
+ const CPUArchIdList *possible_cpus;
+ int boot_cores_nr = smp_cpus / smp_threads;
+ int i;
+
+ possible_cpus = mc->possible_cpu_arch_ids(machine);
+ if (mc->has_hotpluggable_cpus) {
+ if (smp_cpus % smp_threads) {
+ error_report("smp_cpus (%u) must be multiple of threads (%u)",
+ smp_cpus, smp_threads);
+ exit(1);
+ }
+ if (max_cpus % smp_threads) {
+ error_report("max_cpus (%u) must be multiple of threads (%u)",
+ max_cpus, smp_threads);
+ exit(1);
+ }
+ } else {
+ if (max_cpus != smp_cpus) {
+ error_report("This machine version does not support CPU hotplug");
+ exit(1);
+ }
+ boot_cores_nr = possible_cpus->len;
+ }
+
+ /* VSMT must be set in order to be able to compute VCPU ids, ie to
+ * call xics_max_server_number() or spapr_vcpu_id().
+ */
+ spapr_set_vsmt_mode(spapr, &error_fatal);
+
+ if (smc->pre_2_10_has_unused_icps) {
+ int i;
+
+ for (i = 0; i < xics_max_server_number(spapr); i++) {
+ /* Dummy entries get deregistered when real ICPState objects
+ * are registered during CPU core hotplug.
+ */
+ pre_2_10_vmstate_register_dummy_icp(i);
+ }
+ }
+
+ for (i = 0; i < possible_cpus->len; i++) {
+ int core_id = i * smp_threads;
+
+ if (mc->has_hotpluggable_cpus) {
+ spapr_dr_connector_new(OBJECT(spapr), TYPE_SPAPR_DRC_CPU,
+ spapr_vcpu_id(spapr, core_id));
+ }
+
+ if (i < boot_cores_nr) {
+ Object *core = object_new(type);
+ int nr_threads = smp_threads;
+
+ /* Handle the partially filled core for older machine types */
+ if ((i + 1) * smp_threads >= smp_cpus) {
+ nr_threads = smp_cpus - i * smp_threads;
+ }
+
+ object_property_set_int(core, nr_threads, "nr-threads",
+ &error_fatal);
+ object_property_set_int(core, core_id, CPU_CORE_PROP_CORE_ID,
+ &error_fatal);
+ object_property_set_bool(core, true, "realized", &error_fatal);
+ }
+ }
+}
+
/* pSeries LPAR / sPAPR hardware init */
static void spapr_machine_init(MachineState *machine)
{
@@ -2486,8 +2494,6 @@ static void spapr_machine_init(MachineState *machine)
}
/* init CPUs */
- spapr_set_vsmt_mode(spapr, &error_fatal);
-
spapr_init_cpus(spapr);
if (kvm_enabled()) {
--
2.14.3
next prev parent reply other threads:[~2018-03-06 4:02 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-06 4:01 [Qemu-devel] [PULL 00/30] ppc-for-2.12 queue 20180306 David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 01/30] spapr: fix missing CPU core nodes in DT when running with TCG David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 02/30] ppc440_uc: Fix unintialized variable warning with older gcc David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 03/30] ppc440: Add emulation of plb-pcix controller found in some 440 SoCs David Gibson
2018-04-27 12:34 ` Peter Maydell
2018-04-27 21:38 ` BALATON Zoltan
2018-03-06 4:01 ` [Qemu-devel] [PULL 04/30] roms: Added git submodule for u-boot-sam460 (firmware for sam460ex) David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 05/30] pc-bios: Added u-boot-sam460 firmware binary David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 06/30] ppc: Add aCube Sam460ex board David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 07/30] spapr: register dummy ICPs later David Gibson
2018-03-06 4:01 ` David Gibson [this message]
2018-03-06 4:01 ` [Qemu-devel] [PULL 09/30] macio: embed DBDMA device directly within macio David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 10/30] macio: move ESCC device within the macio device David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 11/30] heathrow: QOMify heathrow PIC David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 12/30] heathrow: convert to trace-events David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 13/30] heathrow: change heathrow_pic_init() to return the heathrow device David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 14/30] macio: move macio related structures and defines into separate macio.h file David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 15/30] mac_oldworld: use object link to pass heathrow PIC object to macio David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 16/30] openpic: move KVM-specific declarations into separate openpic_kvm.h file David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 17/30] openpic: move OpenPIC state and related definitions to openpic.h David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 18/30] mac_newworld: use object link to pass OpenPIC object to macio David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 19/30] macio: move setting of CUDA timebase frequency to macio_common_realize() David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 20/30] macio: remove macio_init() function David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 21/30] target/ppc: Check mask when setting cap_ppc_safe_indirect_branch David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 22/30] ppc/spapr-caps: Add support for custom spapr_capabilities David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 23/30] ppc/spapr-caps: Convert cap-cfpc to custom spapr-cap David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 24/30] ppc/spapr-caps: Convert cap-sbbc " David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 25/30] ppc/spapr-caps: Convert cap-ibs " David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 26/30] ppc/spapr-caps: Define the pseries-2.12-sxxm machine type David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 27/30] hw/ppc/spapr, e500: Use new property "stdout-path" for boot console David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 28/30] PPC: e500: Fix duplicate kernel load and device tree overlap David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 29/30] adb: add trace-events for monitoring keyboard/mouse during bus enumeration David Gibson
2018-03-06 4:01 ` [Qemu-devel] [PULL 30/30] PowerPC: Add TS bits into msr_mask David Gibson
2018-03-06 4:30 ` [Qemu-devel] [PULL 00/30] ppc-for-2.12 queue 20180306 no-reply
2018-03-06 4:39 ` David Gibson
2018-03-06 11:19 ` Peter Maydell
2018-03-06 16:48 ` Thomas Huth
2018-03-06 17:28 ` Mark Cave-Ayland
2018-03-06 17:47 ` Thomas Huth
2018-03-06 17:54 ` [Qemu-devel] [Qemu-ppc] " Greg Kurz
2018-03-06 17:56 ` [Qemu-devel] " Mark Cave-Ayland
2018-03-07 10:23 ` Daniel P. Berrangé
2018-03-06 18:55 ` Peter Maydell
2018-03-07 12:16 ` [Qemu-devel] [Qemu-ppc] " luigi burdo
2018-03-07 12:21 ` Thomas Huth
2018-03-07 12:52 ` Cornelia Huck
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=20180306040154.3669-9-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=agraf@suse.de \
--cc=groug@kaod.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=surajjs@au1.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).