From 2275b9c1570445bf3e29f8edccae291d362e3d7f Mon Sep 17 00:00:00 2001 From: Russ Anderson Date: Mon, 29 Apr 2013 15:07:59 -0700 Subject: [PATCH] --- yaml --- r: 365421 b: refs/heads/master c: 7c243c7168dcc1bc2081fc0494923cd7cc808fb6 h: refs/heads/master i: 365419: 28c1a082a96043993560ab6aa1f3de874daf5f1b v: v3 --- [refs] | 2 +- trunk/arch/ia64/mm/numa.c | 15 ++++++++++++++- trunk/mm/page_alloc.c | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index e9f62f1aeec6..9f1f999c8b42 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fed5b64a95326697f942f5003c138c7ff3043ef5 +refs/heads/master: 7c243c7168dcc1bc2081fc0494923cd7cc808fb6 diff --git a/trunk/arch/ia64/mm/numa.c b/trunk/arch/ia64/mm/numa.c index def782e31aac..4248492b9321 100644 --- a/trunk/arch/ia64/mm/numa.c +++ b/trunk/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; diff --git a/trunk/mm/page_alloc.c b/trunk/mm/page_alloc.c index b54c5cbf0200..5a234b64f3ac 100644 --- a/trunk/mm/page_alloc.c +++ b/trunk/mm/page_alloc.c @@ -4187,10 +4187,23 @@ int __meminit __early_pfn_to_nid(unsigned long pfn) { unsigned long start_pfn, end_pfn; int i, nid; + /* + * NOTE: The following SMP-unsafe globals are only used early in boot + * when the kernel is running single-threaded. + */ + static unsigned long __meminitdata last_start_pfn, last_end_pfn; + static int __meminitdata last_nid; + + if (last_start_pfn <= pfn && pfn < last_end_pfn) + return last_nid; for_each_mem_pfn_range(i, MAX_NUMNODES, &start_pfn, &end_pfn, &nid) - if (start_pfn <= pfn && pfn < end_pfn) + if (start_pfn <= pfn && pfn < end_pfn) { + last_start_pfn = start_pfn; + last_end_pfn = end_pfn; + last_nid = nid; return nid; + } /* This is a memory hole */ return -1; }