Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752784AbdFSWKg (ORCPT ); Mon, 19 Jun 2017 18:10:36 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:55278 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752647AbdFSWKd (ORCPT ); Mon, 19 Jun 2017 18:10:33 -0400 To: linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org Cc: Benjamin Herrenschmidt , Paul Mackerras , Michael Ellerman , Michael Bringmann , David Gibson , Reza Arbab , John Allen , Thomas Gleixner , Bharata B Rao , Shailendra Singh , "Aneesh Kumar K.V" , Sebastian Andrzej Siewior , Rashmica Gupta , Ingo Molnar In-Reply-To: <081bb19d-3008-842d-6872-f51fccb94139@linux.vnet.ibm.com> From: Michael Bringmann Subject: [PATCH V6 1/2] powerpc/hotplug: Ensure enough nodes avail for operations Organization: IBM Linux Technology Center Date: Mon, 19 Jun 2017 17:10:20 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.1.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 x-cbid: 17061922-0020-0000-0000-00000C31CD45 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007257; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000214; SDB=6.00877159; UDB=6.00436930; IPR=6.00657302; BA=6.00005431; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00015889; XFM=3.00000015; UTC=2017-06-19 22:10:25 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17061922-0021-0000-0000-00005CDD6775 Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-06-19_11:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1706190366 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2402 Lines: 79 powerpc/hotplug: On systems like PowerPC which allow 'hot-add' of CPU or memory resources, it may occur that the new resources are to be inserted into nodes that were not used for these resources at bootup. In the kernel, any node that is used must be defined and initialized at boot. In order to meet both needs, this patch adds a new kernel command line option (numnodes=) for use by the PowerPC architecture- specific code that defines the maximum number of nodes that the kernel will ever need in its current hardware environment. The boot code that initializes nodes for PowerPC will read this value and use it to ensure that all of the desired nodes are setup in the 'node_possible_map', and elsewhere. Signed-off-by: Michael Bringmann --- --- arch/powerpc/mm/numa.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 2b808a1..e6ee829 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c @@ -60,10 +60,27 @@ static int n_mem_addr_cells, n_mem_size_cells; static int form1_affinity; +#define TOPOLOGY_DEF_NUM_NODES 0 #define MAX_DISTANCE_REF_POINTS 4 static int distance_ref_points_depth; static const __be32 *distance_ref_points; static int distance_lookup_table[MAX_NUMNODES][MAX_DISTANCE_REF_POINTS]; +static int topology_num_nodes = TOPOLOGY_DEF_NUM_NODES; + +/* + * Topology-related early parameters + */ +static int __init early_num_nodes(char *p) +{ + if (!p) + return 1; + + topology_num_nodes = memparse(p, &p); + dbg("topology num nodes = 0x%d\n", topology_num_nodes); + + return 0; +} +early_param("numnodes", early_num_nodes); /* * Allocate node_to_cpumask_map based on number of available nodes @@ -892,6 +909,18 @@ static void __init setup_node_data(int nid, u64 start_pfn, u64 end_pfn) NODE_DATA(nid)->node_spanned_pages = spanned_pages; } +static void __init setup_min_nodes(void) +{ + int i, l = topology_num_nodes; + + for (i = 0; i < l; i++) { + if (!node_possible(i)) { + setup_node_data(i, 0, 0); + node_set(i, node_possible_map); + } + } +} + void __init initmem_init(void) { int nid, cpu; @@ -911,6 +940,8 @@ void __init initmem_init(void) */ nodes_and(node_possible_map, node_possible_map, node_online_map); + setup_min_nodes(); + for_each_online_node(nid) { unsigned long start_pfn, end_pfn;