From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753043AbbI0S3A (ORCPT ); Sun, 27 Sep 2015 14:29:00 -0400 Received: from e17.ny.us.ibm.com ([129.33.205.207]:58311 "EHLO e17.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752715AbbI0S2j (ORCPT ); Sun, 27 Sep 2015 14:28:39 -0400 X-IBM-Helo: d01dlp03.pok.ibm.com X-IBM-MailFrom: raghavendra.kt@linux.vnet.ibm.com X-IBM-RcptTo: linux-kernel@vger.kernel.org From: Raghavendra K T To: , , Cc: , , , , , , , , , Subject: [PATCH RFC 4/5] powerpc:numa Add helper functions to maintain chipid to nid mapping Date: Sun, 27 Sep 2015 23:59:12 +0530 Message-Id: <1443378553-2146-5-git-send-email-raghavendra.kt@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1443378553-2146-1-git-send-email-raghavendra.kt@linux.vnet.ibm.com> References: <1443378553-2146-1-git-send-email-raghavendra.kt@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15092718-0041-0000-0000-000001AA88EE Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Create arrays that maps serial nids and sparse chipids. Note: My original idea had only two arrays of chipid to nid map. Final code is inspired by driver/acpi/numa.c that maps a proximity node with a logical node by Takayoshi Kochi , and thus uses an additional chipid_map nodemask. The mask helps in first unused nid easily by knowing first unset bit in the mask. No change in functionality. Signed-off-by: Raghavendra K T --- arch/powerpc/mm/numa.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index dd2073b..f015cad 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c @@ -63,6 +63,11 @@ static int form1_affinity; static int distance_ref_points_depth; static const __be32 *distance_ref_points; static int distance_lookup_table[MAX_NUMNODES][MAX_DISTANCE_REF_POINTS]; +static nodemask_t chipid_map = NODE_MASK_NONE; +static int chipid_to_nid_map[MAX_NUMNODES] + = { [0 ... MAX_NUMNODES - 1] = NUMA_NO_NODE }; +static int nid_to_chipid_map[MAX_NUMNODES] + = { [0 ... MAX_NUMNODES - 1] = NUMA_NO_NODE }; /* * Allocate node_to_cpumask_map based on number of available nodes @@ -133,6 +138,48 @@ static int __init fake_numa_create_new_node(unsigned long end_pfn, return 0; } +int chipid_to_nid(int chipid) +{ + if (chipid < 0) + return NUMA_NO_NODE; + return chipid_to_nid_map[chipid]; +} + +int nid_to_chipid(int nid) +{ + if (nid < 0) + return NUMA_NO_NODE; + return nid_to_chipid_map[nid]; +} + +static void __map_chipid_to_nid(int chipid, int nid) +{ + if (chipid_to_nid_map[chipid] == NUMA_NO_NODE + || nid < chipid_to_nid_map[chipid]) + chipid_to_nid_map[chipid] = nid; + if (nid_to_chipid_map[nid] == NUMA_NO_NODE + || chipid < nid_to_chipid_map[nid]) + nid_to_chipid_map[nid] = chipid; +} + +int map_chipid_to_nid(int chipid) +{ + int nid; + + if (chipid < 0 || chipid >= MAX_NUMNODES) + return NUMA_NO_NODE; + + nid = chipid_to_nid_map[chipid]; + if (nid == NUMA_NO_NODE) { + if (nodes_weight(chipid_map) >= MAX_NUMNODES) + return NUMA_NO_NODE; + nid = first_unset_node(chipid_map); + __map_chipid_to_nid(chipid, nid); + node_set(nid, chipid_map); + } + return nid; +} + int numa_cpu_lookup(int cpu) { return numa_cpu_lookup_table[cpu]; @@ -264,7 +311,6 @@ out: return chipid; } - /* Return the nid from associativity */ static int associativity_to_nid(const __be32 *associativity) { -- 1.7.11.7