From nobody Tue Feb 10 17:31:15 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1495685165391435.03223249330506; Wed, 24 May 2017 21:06:05 -0700 (PDT) Received: from localhost ([::1]:58061 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dDk2G-0003Ui-1Y for importer@patchew.org; Thu, 25 May 2017 00:06:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57482) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dDjoT-0006aI-UQ for qemu-devel@nongnu.org; Wed, 24 May 2017 23:51:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dDjoS-0007Xk-BX for qemu-devel@nongnu.org; Wed, 24 May 2017 23:51:49 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:36895) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dDjoR-0007Uz-U7; Wed, 24 May 2017 23:51:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 3wYFgZ56Scz9sP0; Thu, 25 May 2017 13:51:37 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1495684298; bh=QvK6JDluqp4TFb60+V9qcuFcfdLz22BV3pXryxHgs4Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PjAG36TebUBRx6neMzNMbJSw+hdy1mRcija20mSy9gpkzyR98szu1dsXAKfdHoGRC RESflpvnIZtfrIC5/QWPapUfo1rPcil3aHsHjzZbhQ+N9jUnNuDI+i1I2tnfwkBCsk 6aT/VW3qEpz8OYPPqTLA82Ox47JdYfvur0OCysBo= From: David Gibson To: peter.maydell@linaro.org Date: Thu, 25 May 2017 13:51:31 +1000 Message-Id: <20170525035132.24268-18-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170525035132.24268-1-david@gibson.dropbear.id.au> References: <20170525035132.24268-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 17/18] hw/ppc/spapr.c: recover pending LMB unplug info in spapr_lmb_release X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel@nongnu.org, aik@ozlabs.ru, sursingh@redhat.com, agraf@suse.de, mdroth@linux.vnet.ibm.com, qemu-ppc@nongnu.org, Daniel Henrique Barboza , sbobroff@redhat.com, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Daniel Henrique Barboza When a LMB hot unplug starts, the current DRC LMB status is stored at spapr->pending_dimm_unplugs QTAILQ. This queue isn't migrated, thus if a migration occurs in the middle of a LMB unplug the spapr_lmb_release callback will lost track of the LMB unplug progress. This patch implements a new recover function spapr_recover_pending_dimm_sta= te that is used inside spapr_lmb_release to recover this DRC LMB release status that is lost during the migration. Signed-off-by: Daniel Henrique Barboza [dwg: Minor stylistic changes, simplify error handling] Signed-off-by: David Gibson --- hw/ppc/spapr.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 14399f4..ab3aab1 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2655,6 +2655,40 @@ static void spapr_pending_dimm_unplugs_remove(sPAPRM= achineState *spapr, g_free(dimm_state); } =20 +static sPAPRDIMMState *spapr_recover_pending_dimm_state(sPAPRMachineState = *ms, + PCDIMMDevice *dimm) +{ + sPAPRDRConnector *drc; + PCDIMMDeviceClass *ddc =3D PC_DIMM_GET_CLASS(dimm); + MemoryRegion *mr =3D ddc->get_memory_region(dimm); + uint64_t size =3D memory_region_size(mr); + uint32_t nr_lmbs =3D size / SPAPR_MEMORY_BLOCK_SIZE; + uint32_t avail_lmbs =3D 0; + uint64_t addr_start, addr; + int i; + sPAPRDIMMState *ds; + + addr_start =3D object_property_get_int(OBJECT(dimm), PC_DIMM_ADDR_PROP, + &error_abort); + + addr =3D addr_start; + for (i =3D 0; i < nr_lmbs; i++) { + drc =3D spapr_dr_connector_by_id(SPAPR_DR_CONNECTOR_TYPE_LMB, + addr / SPAPR_MEMORY_BLOCK_SIZE); + g_assert(drc); + if (drc->indicator_state !=3D SPAPR_DR_INDICATOR_STATE_INACTIVE) { + avail_lmbs++; + } + addr +=3D SPAPR_MEMORY_BLOCK_SIZE; + } + + ds =3D g_malloc0(sizeof(sPAPRDIMMState)); + ds->nr_lmbs =3D avail_lmbs; + ds->dimm =3D dimm; + spapr_pending_dimm_unplugs_add(ms, ds); + return ds; +} + /* Callback to be called during DRC release. */ void spapr_lmb_release(DeviceState *dev) { @@ -2662,7 +2696,14 @@ void spapr_lmb_release(DeviceState *dev) sPAPRMachineState *spapr =3D SPAPR_MACHINE(hotplug_ctrl); sPAPRDIMMState *ds =3D spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(= dev)); =20 - if (--ds->nr_lmbs) { + /* This information will get lost if a migration occurs + * during the unplug process. In this case recover it. */ + if (ds =3D=3D NULL) { + ds =3D spapr_recover_pending_dimm_state(spapr, PC_DIMM(dev)); + if (ds->nr_lmbs) { + return; + } + } else if (--ds->nr_lmbs) { return; } =20 --=20 2.9.4