aboutsummaryrefslogtreecommitdiff
path: root/arch/ia64/mm/numa.c
diff options
context:
space:
mode:
authorTony Luck <tony.luck@intel.com>2005-10-28 14:32:56 -0700
committerTony Luck <tony.luck@intel.com>2005-10-28 14:32:56 -0700
commitc87ff94333642ce3db4fc0857ad1f723cb42c1dd (patch)
tree9577010b5ca20b692904c4728b305a9cbde5373e /arch/ia64/mm/numa.c
parent556902cd2d2cfdc54fe1f1d7f3ac5e2eb276ac09 (diff)
parent1e5c936e3cc2ab745f66c0ae296c42f892ffd42a (diff)
Pull sparsemem-v5 into release branch
Diffstat (limited to 'arch/ia64/mm/numa.c')
-rw-r--r--arch/ia64/mm/numa.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c
index 77118bbf3d8..4e5c8b36ad9 100644
--- a/arch/ia64/mm/numa.c
+++ b/arch/ia64/mm/numa.c
@@ -47,3 +47,27 @@ paddr_to_nid(unsigned long paddr)
return (i < num_node_memblks) ? node_memblk[i].nid : (num_node_memblks ? -1 : 0);
}
+
+#if defined(CONFIG_SPARSEMEM) && defined(CONFIG_NUMA)
+/*
+ * Because of holes evaluate on section limits.
+ * If the section of memory exists, then return the node where the section
+ * resides. Otherwise return node 0 as the default. This is used by
+ * SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where
+ * the section resides.
+ */
+int early_pfn_to_nid(unsigned long pfn)
+{
+ int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec;
+
+ for (i = 0; i < num_node_memblks; i++) {
+ ssec = node_memblk[i].start_paddr >> PA_SECTION_SHIFT;
+ esec = (node_memblk[i].start_paddr + node_memblk[i].size +
+ ((1L << PA_SECTION_SHIFT) - 1)) >> PA_SECTION_SHIFT;
+ if (section >= ssec && section < esec)
+ return node_memblk[i].nid;
+ }
+
+ return 0;
+}
+#endif