Commit 2bdaf115 authored by Andy Whitcroft's avatar Andy Whitcroft Committed by Linus Torvalds

[PATCH] flatmem split out memory model

There are three places we define pfn_to_nid().  Two in linux/mmzone.h and one
in asm/mmzone.h.  These in essence represent the three memory models.  The
definition in linux/mmzone.h under !NEED_MULTIPLE_NODES is both the FLATMEM
definition and the optimisation for single NUMA nodes; the one under SPARSEMEM
is the NUMA sparsemem one; the one in asm/mmzone.h under DISCONTIGMEM is the
discontigmem one.  This is not in the least bit obvious, particularly the
connection between the non-NUMA optimisations and the memory models.

Two patches:

flatmem-split-out-memory-model: simplifies the selection of pfn_to_nid()
implementations.  The selection is based primarily off the memory model
selected.  Optimisations for non-NUMA are applied where needed.

sparse-provide-pfn_to_nid: implement pfn_to_nid() for SPARSEMEM

This patch:

pfn_to_nid is memory model specific

The pfn_to_nid() call is memory model specific.  It represents the locality
identifier for the memory passed.  Classically this would be a NUMA node,
but not a chunk of memory under DISCONTIGMEM.

The SPARSEMEM and FLATMEM memory model non-NUMA versions of pfn_to_nid()
are folded together under NEED_MULTIPLE_NODES, while DISCONTIGMEM has its
own optimisation.  This is all very confusing.

This patch splits out each implementation of pfn_to_nid() so that we can
see them and the optimisations to each.
Signed-off-by: default avatarAndy Whitcroft <apw@shadowen.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 03b00ebc
...@@ -435,7 +435,6 @@ extern struct pglist_data contig_page_data; ...@@ -435,7 +435,6 @@ extern struct pglist_data contig_page_data;
#define NODE_DATA(nid) (&contig_page_data) #define NODE_DATA(nid) (&contig_page_data)
#define NODE_MEM_MAP(nid) mem_map #define NODE_MEM_MAP(nid) mem_map
#define MAX_NODES_SHIFT 1 #define MAX_NODES_SHIFT 1
#define pfn_to_nid(pfn) (0)
#else /* CONFIG_NEED_MULTIPLE_NODES */ #else /* CONFIG_NEED_MULTIPLE_NODES */
...@@ -470,6 +469,10 @@ extern struct pglist_data contig_page_data; ...@@ -470,6 +469,10 @@ extern struct pglist_data contig_page_data;
#define early_pfn_to_nid(nid) (0UL) #define early_pfn_to_nid(nid) (0UL)
#endif #endif
#ifdef CONFIG_FLATMEM
#define pfn_to_nid(pfn) (0)
#endif
#define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT) #define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT)
#define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT) #define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT)
...@@ -594,6 +597,8 @@ static inline int pfn_valid(unsigned long pfn) ...@@ -594,6 +597,8 @@ static inline int pfn_valid(unsigned long pfn)
*/ */
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
#define pfn_to_nid early_pfn_to_nid #define pfn_to_nid early_pfn_to_nid
#else
#define pfn_to_nid(pfn) (0)
#endif #endif
#define early_pfn_valid(pfn) pfn_valid(pfn) #define early_pfn_valid(pfn) pfn_valid(pfn)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment