X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=arch%2Fia64%2Fmm%2Fnuma.c;h=4248492b9321b2eb5f7c3079d532982011a907ef;hb=d7ab7302f970a254997687a1cdede421a5635c68;hp=def782e31aac31a5401d5bb75d2c6b2a25f682f2;hpb=5415ba99c229105a6939a7f9effe21045b8b2e5b;p=~andy%2Flinux diff --git a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c index def782e31aa..4248492b932 100644 --- a/arch/ia64/mm/numa.c +++ b/arch/ia64/mm/numa.c @@ -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;