]> Pileus Git - ~andy/linux/blobdiff - arch/ia64/mm/numa.c
Merge tag 'mfd-3.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd...
[~andy/linux] / arch / ia64 / mm / numa.c
index def782e31aac31a5401d5bb75d2c6b2a25f682f2..4248492b9321b2eb5f7c3079d532982011a907ef 100644 (file)
@@ -61,13 +61,26 @@ paddr_to_nid(unsigned long paddr)
 int __meminit __early_pfn_to_nid(unsigned long pfn)
 {
        int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec;
+       /*
+        * NOTE: The following SMP-unsafe globals are only used early in boot
+        * when the kernel is running single-threaded.
+        */
+       static int __meminitdata last_ssec, last_esec;
+       static int __meminitdata last_nid;
+
+       if (section >= last_ssec && section < last_esec)
+               return last_nid;
 
        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)
+               if (section >= ssec && section < esec) {
+                       last_ssec = ssec;
+                       last_esec = esec;
+                       last_nid = node_memblk[i].nid;
                        return node_memblk[i].nid;
+               }
        }
 
        return -1;