Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1186778
| From | Mel Gorman <mgorman@suse.de> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 3/3] mm, meminit: Allow early_pfn_to_nid to be used during runtime |
| Date | 2015-07-17 14:30 +0200 |
| Message-ID | <pNcW6-5lc-13@gated-at.bofh.it> (permalink) |
| References | <pNcW6-5lc-7@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
early_pfn_to_nid historically was inherently not SMP safe but only
used during boot which is inherently single threaded or during hotplug
which is protected by a giant mutex. With deferred memory initialisation
there was a thread-safe version introduced and the early_pfn_to_nid
would trigger a BUG_ON if used unsafely. Memory hotplug hit that check.
This patch makes early_pfn_to_nid introduces a lock to make it safe to
use during hotplug.
Reported-and-tested-by: Alex Ng <alexng@microsoft.com>
Signed-off-by: Mel Gorman <mgorman@suse.de>
---
mm/page_alloc.c | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 94e2599830c2..f1e841c67b7a 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -982,21 +982,26 @@ static void __init __free_pages_boot_core(struct page *page,
#if defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID) || \
defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP)
-/* Only safe to use early in boot when initialisation is single-threaded */
+
static struct mminit_pfnnid_cache early_pfnnid_cache __meminitdata;
int __meminit early_pfn_to_nid(unsigned long pfn)
{
+ static DEFINE_SPINLOCK(early_pfn_lock);
int nid;
- /* The system will behave unpredictably otherwise */
- BUG_ON(system_state != SYSTEM_BOOTING);
+ /* Avoid locking overhead during boot but hotplug must lock */
+ if (system_state != SYSTEM_BOOTING)
+ spin_lock(&early_pfn_lock);
nid = __early_pfn_to_nid(pfn, &early_pfnnid_cache);
- if (nid >= 0)
- return nid;
- /* just returns 0 */
- return 0;
+ if (nid < 0)
+ nid = 0;
+
+ if (system_state != SYSTEM_BOOTING)
+ spin_unlock(&early_pfn_lock);
+
+ return nid;
}
#endif
--
2.4.3
--
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/
Back to linux.kernel | Previous | Next — Next in thread | Find similar | Unroll thread
[PATCH 3/3] mm, meminit: Allow early_pfn_to_nid to be used during runtime Mel Gorman <mgorman@suse.de> - 2015-07-17 14:30 +0200
Re: [PATCH 3/3] mm, meminit: Allow early_pfn_to_nid to be used during runtime Mel Gorman <mgorman@suse.de> - 2015-07-17 15:20 +0200
Re: [PATCH 3/3] mm, meminit: Allow early_pfn_to_nid to be used during runtime Peter Zijlstra <peterz@infradead.org> - 2015-07-17 15:30 +0200
Re: [PATCH 3/3] mm, meminit: Allow early_pfn_to_nid to be used during runtime Mel Gorman <mgorman@suse.de> - 2015-07-17 15:40 +0200
Re: [PATCH 3/3] mm, meminit: Allow early_pfn_to_nid to be used during runtime Peter Zijlstra <peterz@infradead.org> - 2015-07-17 16:00 +0200
Re: [PATCH 3/3] mm, meminit: Allow early_pfn_to_nid to be used during runtime Peter Zijlstra <peterz@infradead.org> - 2015-07-17 15:20 +0200
csiph-web