aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMel Gorman <mgorman@suse.de>2013-10-07 06:29:09 -0400
committerIngo Molnar <mingo@kernel.org>2013-10-09 06:40:38 -0400
commitfc3147245d193bd0f57307859c698fa28a20b0fe (patch)
treed1c6339ab156fc1f1419fe62164dfd1947cec14d
parent6fe6b2d6dabf392aceb3ad3a5e859b46a04465c6 (diff)
mm: numa: Limit NUMA scanning to migrate-on-fault VMAs
There is a 90% regression observed with a large Oracle performance test on a 4 node system. Profiles indicated that the overhead was due to contention on sp_lock when looking up shared memory policies. These policies do not have the appropriate flags to allow them to be automatically balanced so trapping faults on them is pointless. This patch skips VMAs that do not have MPOL_F_MOF set. [riel@redhat.com: Initial patch] Signed-off-by: Mel Gorman <mgorman@suse.de> Reported-and-tested-by: Joe Mario <jmario@redhat.com> Reviewed-by: Rik van Riel <riel@redhat.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Signed-off-by: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1381141781-10992-32-git-send-email-mgorman@suse.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--include/linux/mempolicy.h1
-rw-r--r--kernel/sched/fair.c2
-rw-r--r--mm/mempolicy.c24
3 files changed, 26 insertions, 1 deletions
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h
index da6716b9e3fe..ea4d2495c646 100644
--- a/include/linux/mempolicy.h
+++ b/include/linux/mempolicy.h
@@ -136,6 +136,7 @@ struct mempolicy *mpol_shared_policy_lookup(struct shared_policy *sp,
136 136
137struct mempolicy *get_vma_policy(struct task_struct *tsk, 137struct mempolicy *get_vma_policy(struct task_struct *tsk,
138 struct vm_area_struct *vma, unsigned long addr); 138 struct vm_area_struct *vma, unsigned long addr);
139bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma);
139 140
140extern void numa_default_policy(void); 141extern void numa_default_policy(void);
141extern void numa_policy_init(void); 142extern void numa_policy_init(void);
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 61ec0d4765b9..d98175d5c2c6 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -1130,7 +1130,7 @@ void task_numa_work(struct callback_head *work)
1130 vma = mm->mmap; 1130 vma = mm->mmap;
1131 } 1131 }
1132 for (; vma; vma = vma->vm_next) { 1132 for (; vma; vma = vma->vm_next) {
1133 if (!vma_migratable(vma)) 1133 if (!vma_migratable(vma) || !vma_policy_mof(p, vma))
1134 continue; 1134 continue;
1135 1135
1136 do { 1136 do {
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 196d8da2b657..0e895a2eed5f 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -1679,6 +1679,30 @@ struct mempolicy *get_vma_policy(struct task_struct *task,
1679 return pol; 1679 return pol;
1680} 1680}
1681 1681
1682bool vma_policy_mof(struct task_struct *task, struct vm_area_struct *vma)
1683{
1684 struct mempolicy *pol = get_task_policy(task);
1685 if (vma) {
1686 if (vma->vm_ops && vma->vm_ops->get_policy) {
1687 bool ret = false;
1688
1689 pol = vma->vm_ops->get_policy(vma, vma->vm_start);
1690 if (pol && (pol->flags & MPOL_F_MOF))
1691 ret = true;
1692 mpol_cond_put(pol);
1693
1694 return ret;
1695 } else if (vma->vm_policy) {
1696 pol = vma->vm_policy;
1697 }
1698 }
1699
1700 if (!pol)
1701 return default_policy.flags & MPOL_F_MOF;
1702
1703 return pol->flags & MPOL_F_MOF;
1704}
1705
1682static int apply_policy_zone(struct mempolicy *policy, enum zone_type zone) 1706static int apply_policy_zone(struct mempolicy *policy, enum zone_type zone)
1683{ 1707{
1684 enum zone_type dynamic_policy_zone = policy_zone; 1708 enum zone_type dynamic_policy_zone = policy_zone;