mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
Apply memory policies to top two highest zones when highest zone is ZONE_MOVABLE
The NUMA layer only supports NUMA policies for the highest zone. When ZONE_MOVABLE is configured with kernelcore=, the the highest zone becomes ZONE_MOVABLE. The result is that policies are only applied to allocations like anonymous pages and page cache allocated from ZONE_MOVABLE when the zone is used. This patch applies policies to the two highest zones when the highest zone is ZONE_MOVABLE. As ZONE_MOVABLE consists of pages from the highest "real" zone, it's always functionally equivalent. The patch has been tested on a variety of machines both NUMA and non-NUMA covering x86, x86_64 and ppc64. No abnormal results were seen in kernbench, tbench, dbench or hackbench. It passes regression tests from the numactl package with and without kernelcore= once numactl tests are patched to wait for vmstat counters to update. akpm: this is the nasty hack to fix NUMA mempolicies in the presence of ZONE_MOVABLE and kernelcore= in 2.6.23. Christoph says "For .24 either merge the mobility or get the other solution that Mel is working on. That solution would only use a single zonelist per node and filter on the fly. That may help performance and also help to make memory policies work better." Signed-off-by: Mel Gorman <mel@csn.ul.ie> Acked-by: Lee Schermerhorn <lee.schermerhorn@hp.com> Tested-by: Lee Schermerhorn <lee.schermerhorn@hp.com> Acked-by: Christoph Lameter <clameter@sgi.com> Cc: Andi Kleen <ak@suse.de> Cc: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
8e92f21ba3
commit
b377fd3982
4 changed files with 33 additions and 2 deletions
|
@ -410,6 +410,24 @@ struct zonelist {
|
|||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
/*
|
||||
* Only custom zonelists like MPOL_BIND need to be filtered as part of
|
||||
* policies. As described in the comment for struct zonelist_cache, these
|
||||
* zonelists will not have a zlcache so zlcache_ptr will not be set. Use
|
||||
* that to determine if the zonelists needs to be filtered or not.
|
||||
*/
|
||||
static inline int alloc_should_filter_zonelist(struct zonelist *zonelist)
|
||||
{
|
||||
return !zonelist->zlcache_ptr;
|
||||
}
|
||||
#else
|
||||
static inline int alloc_should_filter_zonelist(struct zonelist *zonelist)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
#ifdef CONFIG_ARCH_POPULATES_NODE_MAP
|
||||
struct node_active_region {
|
||||
unsigned long start_pfn;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue