All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: peter.maydell@linaro.org
Cc: David Gibson <david@gibson.dropbear.id.au>,
	qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org
Subject: [PULL 04/30] spapr: Do NVDIMM/PC-DIMM device hotplug sanity checks at pre-plug only
Date: Fri, 11 Dec 2020 15:14:41 +1100	[thread overview]
Message-ID: <20201211041507.425378-5-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20201211041507.425378-1-david@gibson.dropbear.id.au>

From: Greg Kurz <groug@kaod.org>

Pre-plug of a memory device, be it an NVDIMM or a PC-DIMM, ensures
that the memory slot is available and that addresses don't overlap
with existing memory regions. The corresponding DRCs in the LMB
and PMEM namespaces are thus necessarily attachable at plug time.

Pass &error_abort to spapr_drc_attach() in spapr_add_lmbs() and
spapr_add_nvdimm(). This allows to greatly simplify error handling
on the plug path.

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <20201120234208.683521-3-groug@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c                | 40 ++++++++++++-----------------------
 hw/ppc/spapr_nvdimm.c         | 11 +++++-----
 include/hw/ppc/spapr_nvdimm.h |  2 +-
 3 files changed, 20 insertions(+), 33 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index c060702013..3be27ee2cd 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -3382,8 +3382,8 @@ int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
     return 0;
 }
 
-static bool spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
-                           bool dedicated_hp_event_source, Error **errp)
+static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
+                           bool dedicated_hp_event_source)
 {
     SpaprDrc *drc;
     uint32_t nr_lmbs = size/SPAPR_MEMORY_BLOCK_SIZE;
@@ -3396,15 +3396,12 @@ static bool spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
                               addr / SPAPR_MEMORY_BLOCK_SIZE);
         g_assert(drc);
 
-        if (!spapr_drc_attach(drc, dev, errp)) {
-            while (addr > addr_start) {
-                addr -= SPAPR_MEMORY_BLOCK_SIZE;
-                drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB,
-                                      addr / SPAPR_MEMORY_BLOCK_SIZE);
-                spapr_drc_detach(drc);
-            }
-            return false;
-        }
+        /*
+         * memory_device_get_free_addr() provided a range of free addresses
+         * that doesn't overlap with any existing mapping at pre-plug. The
+         * corresponding LMB DRCs are thus assumed to be all attachable.
+         */
+        spapr_drc_attach(drc, dev, &error_abort);
         if (!hotplugged) {
             spapr_drc_reset(drc);
         }
@@ -3425,11 +3422,9 @@ static bool spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
                                            nr_lmbs);
         }
     }
-    return true;
 }
 
-static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
-                              Error **errp)
+static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev)
 {
     SpaprMachineState *ms = SPAPR_MACHINE(hotplug_dev);
     PCDIMMDevice *dimm = PC_DIMM(dev);
@@ -3444,24 +3439,15 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
     if (!is_nvdimm) {
         addr = object_property_get_uint(OBJECT(dimm),
                                         PC_DIMM_ADDR_PROP, &error_abort);
-        if (!spapr_add_lmbs(dev, addr, size,
-                            spapr_ovec_test(ms->ov5_cas, OV5_HP_EVT), errp)) {
-            goto out_unplug;
-        }
+        spapr_add_lmbs(dev, addr, size,
+                       spapr_ovec_test(ms->ov5_cas, OV5_HP_EVT));
     } else {
         slot = object_property_get_int(OBJECT(dimm),
                                        PC_DIMM_SLOT_PROP, &error_abort);
         /* We should have valid slot number at this point */
         g_assert(slot >= 0);
-        if (!spapr_add_nvdimm(dev, slot, errp)) {
-            goto out_unplug;
-        }
+        spapr_add_nvdimm(dev, slot);
     }
-
-    return;
-
-out_unplug:
-    pc_dimm_unplug(dimm, MACHINE(ms));
 }
 
 static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
@@ -4009,7 +3995,7 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
                                       DeviceState *dev, Error **errp)
 {
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
-        spapr_memory_plug(hotplug_dev, dev, errp);
+        spapr_memory_plug(hotplug_dev, dev);
     } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_CPU_CORE)) {
         spapr_core_plug(hotplug_dev, dev, errp);
     } else if (object_dynamic_cast(OBJECT(dev), TYPE_SPAPR_PCI_HOST_BRIDGE)) {
diff --git a/hw/ppc/spapr_nvdimm.c b/hw/ppc/spapr_nvdimm.c
index a833a63b5e..2f1c196e1b 100644
--- a/hw/ppc/spapr_nvdimm.c
+++ b/hw/ppc/spapr_nvdimm.c
@@ -89,7 +89,7 @@ bool spapr_nvdimm_validate(HotplugHandler *hotplug_dev, NVDIMMDevice *nvdimm,
 }
 
 
-bool spapr_add_nvdimm(DeviceState *dev, uint64_t slot, Error **errp)
+void spapr_add_nvdimm(DeviceState *dev, uint64_t slot)
 {
     SpaprDrc *drc;
     bool hotplugged = spapr_drc_hotplugged(dev);
@@ -97,14 +97,15 @@ bool spapr_add_nvdimm(DeviceState *dev, uint64_t slot, Error **errp)
     drc = spapr_drc_by_id(TYPE_SPAPR_DRC_PMEM, slot);
     g_assert(drc);
 
-    if (!spapr_drc_attach(drc, dev, errp)) {
-        return false;
-    }
+    /*
+     * pc_dimm_get_free_slot() provided a free slot at pre-plug. The
+     * corresponding DRC is thus assumed to be attachable.
+     */
+    spapr_drc_attach(drc, dev, &error_abort);
 
     if (hotplugged) {
         spapr_hotplug_req_add_by_index(drc);
     }
-    return true;
 }
 
 static int spapr_dt_nvdimm(SpaprMachineState *spapr, void *fdt,
diff --git a/include/hw/ppc/spapr_nvdimm.h b/include/hw/ppc/spapr_nvdimm.h
index 344582d2f5..73be250e2a 100644
--- a/include/hw/ppc/spapr_nvdimm.h
+++ b/include/hw/ppc/spapr_nvdimm.h
@@ -30,6 +30,6 @@ int spapr_pmem_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
 void spapr_dt_persistent_memory(SpaprMachineState *spapr, void *fdt);
 bool spapr_nvdimm_validate(HotplugHandler *hotplug_dev, NVDIMMDevice *nvdimm,
                            uint64_t size, Error **errp);
-bool spapr_add_nvdimm(DeviceState *dev, uint64_t slot, Error **errp);
+void spapr_add_nvdimm(DeviceState *dev, uint64_t slot);
 
 #endif
-- 
2.29.2



  parent reply	other threads:[~2020-12-11  4:18 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-11  4:14 [PULL 00/30] ppc-for-6.0 queue 20201211 David Gibson
2020-12-11  4:14 ` [PULL 01/30] spapr/xive: Turn some sanity checks into assertions David Gibson
2020-12-11  4:14 ` [PULL 02/30] spapr/xics: Drop unused argument to xics_kvm_has_broken_disconnect() David Gibson
2020-12-11  4:14 ` [PULL 03/30] spapr: Do PCI device hotplug sanity checks at pre-plug only David Gibson
2020-12-11  4:14 ` David Gibson [this message]
2020-12-11  4:14 ` [PULL 05/30] spapr: Make PHB placement functions and spapr_pre_plug_phb() return status David Gibson
2020-12-11  4:14 ` [PULL 06/30] spapr: Do PHB hoplug sanity check at pre-plug David Gibson
2020-12-11  4:14 ` [PULL 07/30] spapr: Do TPM proxy hotplug sanity checks " David Gibson
2020-12-11  4:14 ` [PULL 08/30] target/ppc: replaced the TODO with LOG_UNIMP and add break for silence warnings David Gibson
2020-12-11  4:14 ` [PULL 09/30] ppc: Add a missing break for PPC6xx_INPUT_TBEN David Gibson
2020-12-11  4:14 ` [PULL 10/30] ppc/translate: Fix unordered f64/f128 comparisons David Gibson
2020-12-11  4:14 ` [PULL 11/30] ppc/translate: Turn the helper macros into functions David Gibson
2020-12-11  4:14 ` [PULL 12/30] ppc/translate: Delay NaN checking after comparison David Gibson
2020-12-11  4:14 ` [PULL 13/30] ppc/translate: Raise exceptions after setting the cc David Gibson
2020-12-11  4:14 ` [PULL 14/30] ppc/translate: Rewrite gen_lxvdsx to use gvec primitives David Gibson
2020-12-11  4:14 ` [PULL 15/30] hw/ppc/spapr_tpm_proxy: Fix hexadecimal format string specifier David Gibson
2020-12-11  4:14 ` [PULL 16/30] xive: Add trace events David Gibson
2020-12-11  4:14 ` [PULL 17/30] spapr: Fix pre-2.10 dummy ICP hack David Gibson
2020-12-11  4:14 ` [PULL 18/30] spapr: Abort if ppc_set_compat() fails for hot-plugged CPUs David Gibson
2020-12-11  4:14 ` [PULL 19/30] spapr: Simplify error path of spapr_core_plug() David Gibson
2020-12-11  4:14 ` [PULL 20/30] spapr: spapr_drc_attach() cannot fail David Gibson
2020-12-11  4:14 ` [PULL 21/30] target/ppc: Remove "compat" property of server class POWER CPUs David Gibson
2020-12-11  4:14 ` [PULL 22/30] hw/ppc: Do not re-read the clock on pre_save if doing savevm David Gibson
2020-12-11  4:15 ` [PULL 23/30] MAINTAINERS: Add Greg Kurz as co-maintainer for ppc David Gibson
2020-12-11  4:15 ` [PULL 24/30] ppc/e500: Free irqs array to avoid memleak David Gibson
2020-12-11  4:15 ` [PULL 25/30] ppc/translate: Use POWERPC_MMU_64 to detect 64-bit MMU models David Gibson
2020-12-11  4:15 ` [PULL 26/30] target/ppc: Introduce an mmu_is_64bit() helper David Gibson
2020-12-11  4:15 ` [PULL 27/30] spapr: Pass sPAPR machine state down to spapr_pci_switch_vga() David Gibson
2020-12-11  4:15 ` [PULL 28/30] spapr: Don't use qdev_get_machine() in spapr_msi_write() David Gibson
2020-12-11  4:15 ` [PULL 29/30] spapr: Pass sPAPR machine state to some RTAS events handling functions David Gibson
2020-12-11  4:15 ` [PULL 30/30] spapr.c: set a 'kvm-type' default value instead of relying on NULL David Gibson
2020-12-11 12:35 ` [PULL 00/30] ppc-for-6.0 queue 20201211 Philippe Mathieu-Daudé
2020-12-11 12:48   ` Peter Maydell
2020-12-14  4:58     ` David Gibson
2020-12-14  4:57 [PULL 00/30] ppc-for-6.0 queue 20201214 David Gibson
2020-12-14  4:57 ` [PULL 04/30] spapr: Do NVDIMM/PC-DIMM device hotplug sanity checks at pre-plug only David Gibson

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=20201211041507.425378-5-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=groug@kaod.org \
    --cc=peter.maydell@linaro.org \
    --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.