From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AB1D8C00449 for ; Wed, 3 Oct 2018 13:27:57 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0F92E2082A for ; Wed, 3 Oct 2018 13:27:56 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0F92E2082A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.vnet.ibm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 42QGzZ50zgzF37M for ; Wed, 3 Oct 2018 23:27:54 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.vnet.ibm.com Authentication-Results: lists.ozlabs.org; spf=none (mailfrom) smtp.mailfrom=linux.vnet.ibm.com (client-ip=148.163.156.1; helo=mx0a-001b2d01.pphosted.com; envelope-from=mwb@linux.vnet.ibm.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.vnet.ibm.com Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 42QGsp6sCvzF37D for ; Wed, 3 Oct 2018 23:22:54 +1000 (AEST) Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w93DDv0X065492 for ; Wed, 3 Oct 2018 09:22:51 -0400 Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.153]) by mx0a-001b2d01.pphosted.com with ESMTP id 2mvwvj1yy4-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 03 Oct 2018 09:22:51 -0400 Received: from localhost by e35.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 3 Oct 2018 07:22:50 -0600 Received: from b03cxnp08025.gho.boulder.ibm.com (9.17.130.17) by e35.co.us.ibm.com (192.168.1.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 3 Oct 2018 07:22:49 -0600 Received: from b03ledav004.gho.boulder.ibm.com (b03ledav004.gho.boulder.ibm.com [9.17.130.235]) by b03cxnp08025.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w93DMmoH21692482 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 3 Oct 2018 06:22:48 -0700 Received: from b03ledav004.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EB9057806E for ; Wed, 3 Oct 2018 07:22:47 -0600 (MDT) Received: from b03ledav004.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 73CE578060 for ; Wed, 3 Oct 2018 07:22:47 -0600 (MDT) Received: from oc5000245537.ibm.com (unknown [9.80.203.154]) by b03ledav004.gho.boulder.ibm.com (Postfix) with ESMTP for ; Wed, 3 Oct 2018 07:22:47 -0600 (MDT) Subject: Re: [PATCH v03 1/5] powerpc/drmem: Export 'dynamic-memory' loader To: linuxppc-dev@lists.ozlabs.org References: <20181001125846.2676.89826.stgit@ltcalpine2-lp9.aus.stglabs.ibm.com> <20181001125924.2676.54786.stgit@ltcalpine2-lp9.aus.stglabs.ibm.com> From: Michael Bringmann Openpgp: preference=signencrypt Autocrypt: addr=mwb@linux.vnet.ibm.com; prefer-encrypt=mutual; keydata= xsBNBFcY7GcBCADzw3en+yzo9ASFGCfldVkIg95SAMPK0myXp2XJYET3zT45uBsX/uj9/2nA lBmXXeOSXnPfJ9V3vtiwcfATnWIsVt3tL6n1kqikzH9nXNxZT7MU/7gqzWZngMAWh/GJ9qyg DTOZdjsvdUNUWxtiLvBo7y+reA4HjlQhwhYxxvCpXBeRoF0qDWfQ8DkneemqINzDZPwSQ7zY t4F5iyN1I9GC5RNK8Y6jiKmm6bDkrrbtXPOtzXKs0J0FqWEIab/u3BDrRP3STDVPdXqViHua AjEzthQbGZm0VCxI4a7XjMi99g614/qDcXZCs00GLZ/VYIE8hB9C5Q+l66S60PLjRrxnABEB AAHNLU1pY2hhZWwgVy4gQnJpbmdtYW5uIDxtd2JAbGludXgudm5ldC5pYm0uY29tPsLAeAQT AQIAIgUCVxjsZwIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQSEdag3dpuTI0NAf8 CKYTDKQLgOSjVrU2L5rM4lXaJRmQV6oidD3vIhKSnWRvPq9C29ifRG6ri20prTHAlc0vycgm 41HHg0y2vsGgNXGTWC2ObemoZBI7mySXe/7Tq5mD/semGzOp0YWZ7teqrkiSR8Bw0p+LdE7K QmT7tpjjvuhrtQ3RRojUYcuy1nWUsc4D+2cxsnZslsx84FUKxPbLagDgZmgBhUw/sUi40s6S AkdViVCVS0WANddLIpG0cfdsV0kCae/XdjK3mRK6drFKv1z+QFjvOhc8QIkkxFD0da9w3tJj oqnqHFV5gLcHO6/wizPx/NV90y6RngeBORkQiRFWxTXS4Oj9GVI/Us7ATQRXGOxnAQgAmJ5Y ikTWrMWPfiveUacETyEhWVl7u8UhZcx3yy2te8O0ay7t9fYcZgIEfQPPVVus89acIXlG3wYL DDPvb21OprLxi+ZJ2a0S5we+LcSWN1jByxJlbWBq+/LcMtGAOhNLpysY1gD0Y4UW/eKS+TFZ 562qKC3k1dBvnV9JXCgeS1taYFxRdVAn+2DwK3nuyG/DDq/XgJ5BtmyC3MMx8CiW3POj+O+l 6SedIeAfZlZ7/xhijx82g93h07VavUQRwMZgZFsqmuxBxVGiav2HB+dNvs3PFB087Pvc9OHe qhajPWOP/gNLMmvBvknn1NToM9a8/E8rzcIZXoYs4RggRRYh6wARAQABwsBfBBgBAgAJBQJX GOxnAhsMAAoJEEhHWoN3abky+RUH/jE08/r5QzaNKYeVhu0uVbgXu5fsxqr2cAxhf+KuwT3T efhEP2alarxzUZdEh4MsG6c+X2NYLbD3cryiXxVx/7kSAJEFQJfA5P06g8NLR25Qpq9BLsN7 ++dxQ+CLKzSEb1X24hYAJZpOhS8ev3ii+M/XIo+olDBKuTaTgB6elrg3CaxUsVgLBJ+jbRkW yQe2S5f/Ja1ThDpSSLLWLiLK/z7+gaqwhnwjQ8Z8Y9D2itJQcj4itHilwImsqwLG7SxzC0NX IQ5KaAFYdRcOgwR8VhhkOIVd70ObSZU+E4pTET1WDz4o65xZ89yfose1No0+r5ht/xWOOrh8 53/hcWvxHVs= Organization: IBM Linux Technology Center Date: Wed, 3 Oct 2018 08:22:46 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 x-cbid: 18100313-0012-0000-0000-000016C10B7F X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00009814; HX=3.00000242; KW=3.00000007; PH=3.00000004; SC=3.00000267; SDB=6.01097277; UDB=6.00567451; IPR=6.00877319; MB=3.00023600; MTD=3.00000008; XFM=3.00000015; UTC=2018-10-03 13:22:49 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18100313-0013-0000-0000-0000549F2A11 Message-Id: <12cd16f1-a493-726f-82f9-8d4e21528f42@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2018-10-03_07:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1807170000 definitions=main-1810030129 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" On 10/02/2018 03:56 PM, Tyrel Datwyler wrote: > On 10/01/2018 05:59 AM, Michael Bringmann wrote: >> powerpc/drmem: Export many of the functions of DRMEM to parse >> "ibm,dynamic-memory" and "ibm,dynamic-memory-v2" during hotplug >> operations and for Post Migration events. >> >> Also modify the DRMEM initialization code to allow it to, >> >> * Be called after system initialization >> * Provide a separate user copy of the LMB array that is produces >> * Free the user copy upon request >> >> In addition, a couple of changes were made to make the creation >> of additional copies of the LMB array more useful including, >> >> * Add new iterator to work through a pair of drmem_info arrays. >> * Modify DRMEM code to replace usages of dt_root_addr_cells, and >> dt_mem_next_cell, as these are only available at first boot. >> >> Signed-off-by: Michael Bringmann >> --- >> arch/powerpc/include/asm/drmem.h | 15 ++++++++ >> arch/powerpc/mm/drmem.c | 75 ++++++++++++++++++++++++++++---------- >> 2 files changed, 70 insertions(+), 20 deletions(-) >> >> diff --git a/arch/powerpc/include/asm/drmem.h b/arch/powerpc/include/asm/drmem.h >> index ce242b9..b0e70fd 100644 >> --- a/arch/powerpc/include/asm/drmem.h >> +++ b/arch/powerpc/include/asm/drmem.h >> @@ -35,6 +35,18 @@ struct drmem_lmb_info { >> &drmem_info->lmbs[0], \ >> &drmem_info->lmbs[drmem_info->n_lmbs - 1]) >> >> +#define for_each_dinfo_lmb(dinfo, lmb) \ >> + for_each_drmem_lmb_in_range((lmb), \ >> + &dinfo->lmbs[0], \ >> + &dinfo->lmbs[dinfo->n_lmbs - 1]) >> + >> +#define for_each_pair_dinfo_lmb(dinfo1, lmb1, dinfo2, lmb2) \ >> + for ((lmb1) = (&dinfo1->lmbs[0]), \ >> + (lmb2) = (&dinfo2->lmbs[0]); \ >> + ((lmb1) <= (&dinfo1->lmbs[dinfo1->n_lmbs - 1])) && \ >> + ((lmb2) <= (&dinfo2->lmbs[dinfo2->n_lmbs - 1])); \ >> + (lmb1)++, (lmb2)++) >> + >> /* >> * The of_drconf_cell_v1 struct defines the layout of the LMB data >> * specified in the ibm,dynamic-memory device tree property. >> @@ -94,6 +106,9 @@ void __init walk_drmem_lmbs(struct device_node *dn, >> void (*func)(struct drmem_lmb *, const __be32 **)); >> int drmem_update_dt(void); >> >> +struct drmem_lmb_info *drmem_lmbs_init(struct property *prop); >> +void drmem_lmbs_free(struct drmem_lmb_info *dinfo); >> + >> #ifdef CONFIG_PPC_PSERIES >> void __init walk_drmem_lmbs_early(unsigned long node, >> void (*func)(struct drmem_lmb *, const __be32 **)); >> diff --git a/arch/powerpc/mm/drmem.c b/arch/powerpc/mm/drmem.c >> index 3f18036..13d2abb 100644 >> --- a/arch/powerpc/mm/drmem.c >> +++ b/arch/powerpc/mm/drmem.c >> @@ -20,6 +20,7 @@ >> >> static struct drmem_lmb_info __drmem_info; >> struct drmem_lmb_info *drmem_info = &__drmem_info; >> +static int n_root_addr_cells; > > What is the point of this new global? I see two places were it gets initialized if it is null, and both those initializers simply set it to "dt_root_addr_cells". I also checked the rest of the patches in the series and none of those even reference this variable. The point of these changes is to introduce code that can be used after an LPAR migration. The variable dt_root_addr_cells was observed to be zero (0) after migration on powerpc. As it is defined as, ./drivers/of/fdt.c:int __initdata dt_root_addr_cells; its definition may be replaced by other code/variables after initial boot. We needed the value to persist, and it was cheaper to cache it. > >> >> u64 drmem_lmb_memory_max(void) >> { >> @@ -193,12 +194,13 @@ int drmem_update_dt(void) >> return rc; >> } >> >> -static void __init read_drconf_v1_cell(struct drmem_lmb *lmb, >> +static void read_drconf_v1_cell(struct drmem_lmb *lmb, >> const __be32 **prop) >> { >> const __be32 *p = *prop; >> >> - lmb->base_addr = dt_mem_next_cell(dt_root_addr_cells, &p); >> + lmb->base_addr = of_read_number(p, n_root_addr_cells); >> + p += n_root_addr_cells; > > Unnecessary code churn do to the introduction of "n_root_addr_cells".' See note above. > >> lmb->drc_index = of_read_number(p++, 1); >> >> p++; /* skip reserved field */ >> @@ -209,7 +211,7 @@ static void __init read_drconf_v1_cell(struct drmem_lmb *lmb, >> *prop = p; >> } >> >> -static void __init __walk_drmem_v1_lmbs(const __be32 *prop, const __be32 *usm, >> +static void __walk_drmem_v1_lmbs(const __be32 *prop, const __be32 *usm, >> void (*func)(struct drmem_lmb *, const __be32 **)) >> { >> struct drmem_lmb lmb; >> @@ -225,13 +227,14 @@ static void __init __walk_drmem_v1_lmbs(const __be32 *prop, const __be32 *usm, >> } >> } >> >> -static void __init read_drconf_v2_cell(struct of_drconf_cell_v2 *dr_cell, >> +static void read_drconf_v2_cell(struct of_drconf_cell_v2 *dr_cell, >> const __be32 **prop) >> { >> const __be32 *p = *prop; >> >> dr_cell->seq_lmbs = of_read_number(p++, 1); >> - dr_cell->base_addr = dt_mem_next_cell(dt_root_addr_cells, &p); >> + dr_cell->base_addr = of_read_number(p, n_root_addr_cells); >> + p += n_root_addr_cells; > > Same comment as above. See note above. > >> dr_cell->drc_index = of_read_number(p++, 1); >> dr_cell->aa_index = of_read_number(p++, 1); >> dr_cell->flags = of_read_number(p++, 1); >> @@ -239,7 +242,7 @@ static void __init read_drconf_v2_cell(struct of_drconf_cell_v2 *dr_cell, >> *prop = p; >> } >> >> -static void __init __walk_drmem_v2_lmbs(const __be32 *prop, const __be32 *usm, >> +static void __walk_drmem_v2_lmbs(const __be32 *prop, const __be32 *usm, >> void (*func)(struct drmem_lmb *, const __be32 **)) >> { >> struct of_drconf_cell_v2 dr_cell; >> @@ -275,6 +278,9 @@ void __init walk_drmem_lmbs_early(unsigned long node, >> const __be32 *prop, *usm; >> int len; >> >> + if (n_root_addr_cells == 0) >> + n_root_addr_cells = dt_root_addr_cells; >> + > > As I mentioned initially whats the point? Why not just use "dt_root_addr_cells"? See note above. > >> prop = of_get_flat_dt_prop(node, "ibm,lmb-size", &len); >> if (!prop || len < dt_root_size_cells * sizeof(__be32)) >> return; >> @@ -353,24 +359,26 @@ void __init walk_drmem_lmbs(struct device_node *dn, >> } >> } >> >> -static void __init init_drmem_v1_lmbs(const __be32 *prop) >> +static void init_drmem_v1_lmbs(const __be32 *prop, >> + struct drmem_lmb_info *dinfo) >> { >> struct drmem_lmb *lmb; >> >> - drmem_info->n_lmbs = of_read_number(prop++, 1); >> - if (drmem_info->n_lmbs == 0) >> + dinfo->n_lmbs = of_read_number(prop++, 1); >> + if (dinfo->n_lmbs == 0) >> return; >> >> - drmem_info->lmbs = kcalloc(drmem_info->n_lmbs, sizeof(*lmb), >> + dinfo->lmbs = kcalloc(dinfo->n_lmbs, sizeof(*lmb), >> GFP_KERNEL); >> - if (!drmem_info->lmbs) >> + if (!dinfo->lmbs) >> return; >> >> - for_each_drmem_lmb(lmb) >> + for_each_dinfo_lmb(dinfo, lmb) >> read_drconf_v1_cell(lmb, &prop); >> } >> >> -static void __init init_drmem_v2_lmbs(const __be32 *prop) >> +static void init_drmem_v2_lmbs(const __be32 *prop, >> + struct drmem_lmb_info *dinfo) >> { >> struct drmem_lmb *lmb; >> struct of_drconf_cell_v2 dr_cell; >> @@ -386,12 +394,12 @@ static void __init init_drmem_v2_lmbs(const __be32 *prop) >> p = prop; >> for (i = 0; i < lmb_sets; i++) { >> read_drconf_v2_cell(&dr_cell, &p); >> - drmem_info->n_lmbs += dr_cell.seq_lmbs; >> + dinfo->n_lmbs += dr_cell.seq_lmbs; >> } >> >> - drmem_info->lmbs = kcalloc(drmem_info->n_lmbs, sizeof(*lmb), >> + dinfo->lmbs = kcalloc(dinfo->n_lmbs, sizeof(*lmb), >> GFP_KERNEL); >> - if (!drmem_info->lmbs) >> + if (!dinfo->lmbs) >> return; >> >> /* second pass, read in the LMB information */ >> @@ -402,10 +410,10 @@ static void __init init_drmem_v2_lmbs(const __be32 *prop) >> read_drconf_v2_cell(&dr_cell, &p); >> >> for (j = 0; j < dr_cell.seq_lmbs; j++) { >> - lmb = &drmem_info->lmbs[lmb_index++]; >> + lmb = &dinfo->lmbs[lmb_index++]; >> >> lmb->base_addr = dr_cell.base_addr; >> - dr_cell.base_addr += drmem_info->lmb_size; >> + dr_cell.base_addr += dinfo->lmb_size; >> >> lmb->drc_index = dr_cell.drc_index; >> dr_cell.drc_index++; >> @@ -416,11 +424,38 @@ static void __init init_drmem_v2_lmbs(const __be32 *prop) >> } >> } >> >> +void drmem_lmbs_free(struct drmem_lmb_info *dinfo) >> +{ >> + if (dinfo) { >> + kfree(dinfo->lmbs); >> + kfree(dinfo); >> + } >> +} >> + >> +struct drmem_lmb_info *drmem_lmbs_init(struct property *prop) >> +{ >> + struct drmem_lmb_info *dinfo; >> + >> + dinfo = kzalloc(sizeof(*dinfo), GFP_KERNEL); >> + if (!dinfo) >> + return NULL; >> + >> + if (!strcmp("ibm,dynamic-memory", prop->name)) >> + init_drmem_v1_lmbs(prop->value, dinfo); >> + else if (!strcmp("ibm,dynamic-memory-v2", prop->name)) >> + init_drmem_v2_lmbs(prop->value, dinfo); >> + >> + return dinfo; >> +} >> + >> static int __init drmem_init(void) >> { >> struct device_node *dn; >> const __be32 *prop; >> >> + if (n_root_addr_cells == 0) >> + n_root_addr_cells = dt_root_addr_cells; >> + > > See previous comment. See note above. > > -Tyrel Michael > >> dn = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory"); >> if (!dn) { >> pr_info("No dynamic reconfiguration memory found\n"); >> @@ -434,11 +469,11 @@ static int __init drmem_init(void) >> >> prop = of_get_property(dn, "ibm,dynamic-memory", NULL); >> if (prop) { >> - init_drmem_v1_lmbs(prop); >> + init_drmem_v1_lmbs(prop, drmem_info); >> } else { >> prop = of_get_property(dn, "ibm,dynamic-memory-v2", NULL); >> if (prop) >> - init_drmem_v2_lmbs(prop); >> + init_drmem_v2_lmbs(prop, drmem_info); >> } >> >> of_node_put(dn); >> > > -- Michael W. Bringmann Linux Technology Center IBM Corporation Tie-Line 363-5196 External: (512) 286-5196 Cell: (512) 466-0650 mwb@linux.vnet.ibm.com