mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
sched/numa, mm: Use active_nodes nodemask to limit numa migrations
Use the active_nodes nodemask to make smarter decisions on NUMA migrations.
In order to maximize performance of workloads that do not fit in one NUMA
node, we want to satisfy the following criteria:
1) keep private memory local to each thread
2) avoid excessive NUMA migration of pages
3) distribute shared memory across the active nodes, to
maximize memory bandwidth available to the workload
This patch accomplishes that by implementing the following policy for
NUMA migrations:
1) always migrate on a private fault
2) never migrate to a node that is not in the set of active nodes
for the numa_group
3) always migrate from a node outside of the set of active nodes,
to a node that is in that set
4) within the set of active nodes in the numa_group, only migrate
from a node with more NUMA page faults, to a node with fewer
NUMA page faults, with a 25% margin to avoid ping-ponging
This results in most pages of a workload ending up on the actively
used nodes, with reduced ping-ponging of pages between those nodes.
Signed-off-by: Rik van Riel <[email protected]>
Acked-by: Mel Gorman <[email protected]>
Signed-off-by: Peter Zijlstra <[email protected]>
Cc: Chegu Vinod <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
This commit is contained in:
parent
20e07dea28
commit
10f3904271
3 changed files with 71 additions and 28 deletions
|
|
@ -2377,37 +2377,10 @@ int mpol_misplaced(struct page *page, struct vm_area_struct *vma, unsigned long
|
|||
|
||||
/* Migrate the page towards the node whose CPU is referencing it */
|
||||
if (pol->flags & MPOL_F_MORON) {
|
||||
int last_cpupid;
|
||||
int this_cpupid;
|
||||
|
||||
polnid = thisnid;
|
||||
this_cpupid = cpu_pid_to_cpupid(thiscpu, current->pid);
|
||||
|
||||
/*
|
||||
* Multi-stage node selection is used in conjunction
|
||||
* with a periodic migration fault to build a temporal
|
||||
* task<->page relation. By using a two-stage filter we
|
||||
* remove short/unlikely relations.
|
||||
*
|
||||
* Using P(p) ~ n_p / n_t as per frequentist
|
||||
* probability, we can equate a task's usage of a
|
||||
* particular page (n_p) per total usage of this
|
||||
* page (n_t) (in a given time-span) to a probability.
|
||||
*
|
||||
* Our periodic faults will sample this probability and
|
||||
* getting the same result twice in a row, given these
|
||||
* samples are fully independent, is then given by
|
||||
* P(n)^2, provided our sample period is sufficiently
|
||||
* short compared to the usage pattern.
|
||||
*
|
||||
* This quadric squishes small probabilities, making
|
||||
* it less likely we act on an unlikely task<->page
|
||||
* relation.
|
||||
*/
|
||||
last_cpupid = page_cpupid_xchg_last(page, this_cpupid);
|
||||
if (!cpupid_pid_unset(last_cpupid) && cpupid_to_nid(last_cpupid) != thisnid) {
|
||||
if (!should_numa_migrate_memory(current, page, curnid, thiscpu))
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (curnid != polnid)
|
||||
|
|
|
|||
Loading…
Reference in a new issue