Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S261246AbUC3V3G (ORCPT ); Tue, 30 Mar 2004 16:29:06 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S261262AbUC3V3G (ORCPT ); Tue, 30 Mar 2004 16:29:06 -0500 Received: from e32.co.us.ibm.com ([32.97.110.130]:61405 "EHLO e32.co.us.ibm.com") by vger.kernel.org with ESMTP id S261246AbUC3V2v (ORCPT ); Tue, 30 Mar 2004 16:28:51 -0500 Subject: Re: [PATCH] mask ADT: x86_64 changes from Matthew's nodemask_t Patch 5/7 [14/22] From: Matthew Dobson Reply-To: colpatch@us.ibm.com To: Paul Jackson Cc: LKML , Andrew Morton In-Reply-To: <20040329041526.59298e48.pj@sgi.com> References: <20040329041526.59298e48.pj@sgi.com> Content-Type: multipart/mixed; boundary="=-fURoUUz8YV90/FCUJ5lV" Organization: IBM LTC Message-Id: <1080682085.6742.175.camel@arrakis> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.5 (1.4.5-7) Date: Tue, 30 Mar 2004 13:28:05 -0800 Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 8448 Lines: 245 --=-fURoUUz8YV90/FCUJ5lV Content-Type: text/plain Content-Transfer-Encoding: 7bit On Mon, 2004-03-29 at 04:15, Paul Jackson wrote: > Patch_14_of_22 - Matthew Dobson's [PATCH]_nodemask_t_x86_64_changes_[5_7] > Changes to x86_64 specific code. > Untested. Code review & testing requested. > Note Patch 22 of 22 below - needed to fix complement in this patch. This one has been updated as well. I chose a slightly different fix for the nodes_complement() bug I introduced. I just inserted: for_each_node(i) { if (node_online(i)) continue; ... } rather than doing any nodes_complement() at all. Either solution will work, and I don't have a strong preference for either solution. Your fix (correctly using nodes_complement to get a nodes_offline_map) is more efficient, especially for systems with lots of nodes. That said, though, k8_scan_nodes() is an __init function, so performance is far from critical. Going with my updated patch means you can shrink your patchset from 22 to 21 patches... ;) -Matt --=-fURoUUz8YV90/FCUJ5lV Content-Disposition: attachment; filename=nodemask_t-05-x86_64.patch Content-Type: text/x-patch; name=nodemask_t-05-x86_64.patch; charset= Content-Transfer-Encoding: 7bit diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/arch/x86_64/kernel/setup64.c linux-2.6.4-nodemask_t-x86_64/arch/x86_64/kernel/setup64.c --- linux-2.6.4-vanilla/arch/x86_64/kernel/setup64.c Wed Mar 10 18:55:24 2004 +++ linux-2.6.4-nodemask_t-x86_64/arch/x86_64/kernel/setup64.c Thu Mar 11 12:00:36 2004 @@ -135,11 +135,11 @@ void __init setup_per_cpu_areas(void) unsigned char *ptr; /* If possible allocate on the node of the CPU. In case it doesn't exist round-robin nodes. */ - if (!NODE_DATA(i % numnodes)) { - printk("cpu with no node %d, numnodes %d\n", i, numnodes); + if (!NODE_DATA(i % num_online_nodes())) { + printk("cpu with no node %d, num_online_nodes() %d\n", i, num_online_nodes()); ptr = alloc_bootmem(size); } else { - ptr = alloc_bootmem_node(NODE_DATA(i % numnodes), size); + ptr = alloc_bootmem_node(NODE_DATA(i % num_online_nodes()), size); } if (!ptr) panic("Cannot allocate cpu data for CPU %d\n", i); diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/arch/x86_64/mm/k8topology.c linux-2.6.4-nodemask_t-x86_64/arch/x86_64/mm/k8topology.c --- linux-2.6.4-vanilla/arch/x86_64/mm/k8topology.c Wed Mar 10 18:55:51 2004 +++ linux-2.6.4-nodemask_t-x86_64/arch/x86_64/mm/k8topology.c Thu Mar 25 17:34:27 2004 @@ -44,7 +44,7 @@ static __init int find_northbridge(void) int __init k8_scan_nodes(unsigned long start, unsigned long end) { unsigned long prevbase; - struct node nodes[MAXNODE]; + struct node nodes[MAX_NUMNODES]; int nodeid, i, nb; int found = 0; u32 reg; @@ -57,9 +57,10 @@ int __init k8_scan_nodes(unsigned long s printk(KERN_INFO "Scanning NUMA topology in Northbridge %d\n", nb); reg = read_pci_config(0, nb, 0, 0x60); - numnodes = ((reg >> 4) & 7) + 1; + for(i = 0; i <= ((reg >> 4) & 7); i++) + node_set_online(i); - printk(KERN_INFO "Number of nodes %d (%x)\n", numnodes, reg); + printk(KERN_INFO "Number of nodes %d (%x)\n", num_online_nodes(), reg); memset(&nodes,0,sizeof(nodes)); prevbase = 0; @@ -71,11 +72,11 @@ int __init k8_scan_nodes(unsigned long s nodeid = limit & 7; if ((base & 3) == 0) { - if (i < numnodes) + if (i < num_online_nodes()) printk("Skipping disabled node %d\n", i); continue; } - if (nodeid >= numnodes) { + if (nodeid >= num_online_nodes()) { printk("Ignoring excess node %d (%lx:%lx)\n", nodeid, base, limit); continue; @@ -91,7 +92,7 @@ int __init k8_scan_nodes(unsigned long s nodeid, (base>>8)&3, (limit>>8) & 3); return -1; } - if ((1UL << nodeid) & nodes_present) { + if (node_online(nodeid)) { printk(KERN_INFO "Node %d already present. Skipping\n", nodeid); continue; @@ -151,7 +152,7 @@ int __init k8_scan_nodes(unsigned long s } printk(KERN_INFO "Using node hash shift of %d\n", memnode_shift); - for (i = 0; i < MAXNODE; i++) { + for_each_node(i) { if (nodes[i].start != nodes[i].end) setup_node_bootmem(i, nodes[i].start, nodes[i].end); } @@ -161,15 +162,16 @@ int __init k8_scan_nodes(unsigned long s mapping. To avoid this fill in the mapping for all possible CPUs, as the number of CPUs is not known yet. We round robin the existing nodes. */ - rr = 0; - for (i = 0; i < MAXNODE; i++) { - if (nodes_present & (1UL<> rr) == 0) - rr = 0; - rr = ffz(~nodes_present >> rr); + rr = first_node(node_online_map); + for_each_node(i) { + if (node_online(i)) + continue; + node_data[i] = node_data[rr]; - rr++; + + rr = next_node(rr, node_online_map); + if (rr >= MAX_NUMNODES) + rr = first_node(node_online_map); } if (found == 1) diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/arch/x86_64/mm/numa.c linux-2.6.4-nodemask_t-x86_64/arch/x86_64/mm/numa.c --- linux-2.6.4-vanilla/arch/x86_64/mm/numa.c Wed Mar 10 18:55:43 2004 +++ linux-2.6.4-nodemask_t-x86_64/arch/x86_64/mm/numa.c Thu Mar 11 12:00:36 2004 @@ -16,7 +16,7 @@ #define Dprintk(x...) -struct pglist_data *node_data[MAXNODE]; +struct pglist_data *node_data[MAX_NUMNODES]; bootmem_data_t plat_node_bdata[MAX_NUMNODES]; int memnode_shift; @@ -24,8 +24,6 @@ u8 memnodemap[NODEMAPSIZE]; static int numa_off __initdata; -unsigned long nodes_present; - int __init compute_hash_shift(struct node *nodes) { int i; @@ -35,7 +33,7 @@ int __init compute_hash_shift(struct nod /* When in doubt use brute force. */ while (shift < 48) { memset(memnodemap,0xff,sizeof(*memnodemap) * NODEMAPSIZE); - for (i = 0; i < numnodes; i++) { + for_each_online_node(i) { if (nodes[i].start == nodes[i].end) continue; for (addr = nodes[i].start; @@ -101,9 +99,6 @@ void __init setup_node_bootmem(int nodei reserve_bootmem_node(NODE_DATA(nodeid), nodedata_phys, pgdat_size); reserve_bootmem_node(NODE_DATA(nodeid), bootmap_start, bootmap_pages< numnodes) - numnodes = nodeid + 1; - nodes_present |= (1UL << nodeid); node_set_online(nodeid); } @@ -152,7 +147,8 @@ int __init numa_initmem_init(unsigned lo fake_node = 1; memnode_shift = 63; memnodemap[0] = 0; - numnodes = 1; + nodes_clear(node_online_map); + node_set_online(0); setup_node_bootmem(0, start_pfn< -#define MAXNODE 8 #define NODEMAPSIZE 0xff /* Simple perfect hash to map physical addresses to node numbers */ diff -Nurp --exclude-from=/home/mcd/.dontdiff linux-2.6.4-vanilla/include/asm-x86_64/numa.h linux-2.6.4-nodemask_t-x86_64/include/asm-x86_64/numa.h --- linux-2.6.4-vanilla/include/asm-x86_64/numa.h Wed Mar 10 18:55:21 2004 +++ linux-2.6.4-nodemask_t-x86_64/include/asm-x86_64/numa.h Thu Mar 11 12:00:36 2004 @@ -1,19 +1,13 @@ #ifndef _ASM_X8664_NUMA_H #define _ASM_X8664_NUMA_H 1 -#define MAXNODE 8 #define NODEMASK 0xff struct node { u64 start,end; }; -#define for_all_nodes(x) for ((x) = 0; (x) < numnodes; (x)++) \ - if ((1UL << (x)) & nodes_present) - - extern int compute_hash_shift(struct node *nodes); -extern unsigned long nodes_present; #define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) --=-fURoUUz8YV90/FCUJ5lV-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/