From 21898f0eaac1eb1e2af597417e680f42b36d96e2 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Thu, 25 Oct 2012 14:16:47 +0200 Subject: [PATCH] --- yaml --- r: 344799 b: refs/heads/master c: 4b96a29ba891dd59734cb7be80a900fe93aa2d9f h: refs/heads/master i: 344797: e5c56d984ad6b5e41fa89e38791dd9af236bb84c 344795: f1e8cfcca682365a307132bcbf847b7aab39e719 344791: 9e71691a19ef205794a723f645d44b2226416240 344783: 409cb0f14de7f44756da532e1d7d870f155dbd63 344767: bcdf5b39cbcfcd68a9f4e8d163650141ddbbaf7a v: v3 --- [refs] | 2 +- trunk/include/linux/sched.h | 1 + trunk/kernel/sched/core.c | 2 +- trunk/kernel/sched/fair.c | 5 +++++ trunk/kernel/sysctl.c | 7 +++++++ 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 73c0d18c5caa..ffd6c5f24be9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9f40604cdab935e80db57b309c48659de349d4e6 +refs/heads/master: 4b96a29ba891dd59734cb7be80a900fe93aa2d9f diff --git a/trunk/include/linux/sched.h b/trunk/include/linux/sched.h index 37841958d234..7d95a232b5b9 100644 --- a/trunk/include/linux/sched.h +++ b/trunk/include/linux/sched.h @@ -2006,6 +2006,7 @@ enum sched_tunable_scaling { }; extern enum sched_tunable_scaling sysctl_sched_tunable_scaling; +extern unsigned int sysctl_numa_balancing_scan_delay; extern unsigned int sysctl_numa_balancing_scan_period_min; extern unsigned int sysctl_numa_balancing_scan_period_max; extern unsigned int sysctl_numa_balancing_scan_size; diff --git a/trunk/kernel/sched/core.c b/trunk/kernel/sched/core.c index cad0d092ce3b..fbfc4843063f 100644 --- a/trunk/kernel/sched/core.c +++ b/trunk/kernel/sched/core.c @@ -1543,7 +1543,7 @@ static void __sched_fork(struct task_struct *p) p->node_stamp = 0ULL; p->numa_scan_seq = p->mm ? p->mm->numa_scan_seq : 0; p->numa_migrate_seq = p->mm ? p->mm->numa_scan_seq - 1 : 0; - p->numa_scan_period = sysctl_numa_balancing_scan_period_min; + p->numa_scan_period = sysctl_numa_balancing_scan_delay; p->numa_work.next = &p->numa_work; #endif /* CONFIG_NUMA_BALANCING */ } diff --git a/trunk/kernel/sched/fair.c b/trunk/kernel/sched/fair.c index f6e1f25ed2bd..7727b0161579 100644 --- a/trunk/kernel/sched/fair.c +++ b/trunk/kernel/sched/fair.c @@ -788,6 +788,9 @@ unsigned int sysctl_numa_balancing_scan_period_max = 100*16; /* Portion of address space to scan in MB */ unsigned int sysctl_numa_balancing_scan_size = 256; +/* Scan @scan_size MB every @scan_period after an initial @scan_delay in ms */ +unsigned int sysctl_numa_balancing_scan_delay = 1000; + static void task_numa_placement(struct task_struct *p) { int seq = ACCESS_ONCE(p->mm->numa_scan_seq); @@ -929,6 +932,8 @@ void task_tick_numa(struct rq *rq, struct task_struct *curr) period = (u64)curr->numa_scan_period * NSEC_PER_MSEC; if (now - curr->node_stamp > period) { + if (!curr->node_stamp) + curr->numa_scan_period = sysctl_numa_balancing_scan_period_min; curr->node_stamp = now; if (!time_before(jiffies, curr->mm->numa_next_scan)) { diff --git a/trunk/kernel/sysctl.c b/trunk/kernel/sysctl.c index 7d3a2e0475e5..48a68cc258c1 100644 --- a/trunk/kernel/sysctl.c +++ b/trunk/kernel/sysctl.c @@ -352,6 +352,13 @@ static struct ctl_table kern_table[] = { }, #endif /* CONFIG_SMP */ #ifdef CONFIG_NUMA_BALANCING + { + .procname = "numa_balancing_scan_delay_ms", + .data = &sysctl_numa_balancing_scan_delay, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, { .procname = "numa_balancing_scan_period_min_ms", .data = &sysctl_numa_balancing_scan_period_min,