sched: make sched_cpu_high_irqload a runtime tunable

It may be desirable to be able to alter the scehd_cpu_high_irqload
setting easily, so make it a runtime tunable value.

Change-Id: I832030eec2aafa101f0f435a4fd2d401d447880d
Signed-off-by: Steve Muckle <smuckle@codeaurora.org>
This commit is contained in:
Steve Muckle 2014-11-30 16:26:55 -08:00
parent e5f54d3484
commit 75d1c94217
5 changed files with 29 additions and 2 deletions

View File

@ -1351,6 +1351,24 @@ frequency. Hence it is strongly advised to have all cpus in a cluster have the
same value for mostly_idle_freq. For more details, see section on "Task
packing" (sec 5.6).
*** 7.22 sched_cpu_high_irqload
Appears at: /proc/sys/kernel/sched_cpu_high_irqload
Default value: 10000000 (10ms)
The scheduler keeps a decaying average of the amount of irq and softirq activity
seen on each CPU within a ten millisecond window. Note that this "irqload"
(reported in the sched_cpu_load tracepoint) will be higher than the typical load
in a single window since every time the window rolls over, the value is decayed
by some fraction and then added to the irq/softirq time spent in the next
window.
When the irqload on a CPU exceeds the value of this tunable, the CPU is no
longer eligible to be seen as mostly idle. This will affect the task placement
logic described above, causing the scheduler to try and steer tasks away from
the CPU.
=========================
8. HMP SCHEDULER TRACE POINTS
=========================

View File

@ -40,6 +40,7 @@ extern unsigned int sysctl_sched_wakeup_load_threshold;
extern unsigned int sysctl_sched_window_stats_policy;
extern unsigned int sysctl_sched_account_wait_time;
extern unsigned int sysctl_sched_ravg_hist_size;
extern unsigned int sysctl_sched_cpu_high_irqload;
extern unsigned int sysctl_sched_freq_account_wait_time;
extern unsigned int sysctl_sched_migration_fixup;
extern unsigned int sysctl_sched_heavy_task_pct;

View File

@ -1163,6 +1163,8 @@ __read_mostly unsigned int sysctl_sched_window_stats_policy =
static __read_mostly unsigned int sched_account_wait_time = 1;
__read_mostly unsigned int sysctl_sched_account_wait_time = 1;
__read_mostly unsigned int sysctl_sched_cpu_high_irqload = (10 * NSEC_PER_MSEC);
#ifdef CONFIG_SCHED_FREQ_INPUT
static __read_mostly unsigned int sched_migration_fixup = 1;

View File

@ -782,10 +782,9 @@ static inline u64 sched_irqload(int cpu)
return 0;
}
#define SCHED_HIGH_IRQ_NS (10 * NSEC_PER_MSEC)
static inline int sched_cpu_high_irqload(int cpu)
{
return sched_irqload(cpu) >= SCHED_HIGH_IRQ_NS;
return sched_irqload(cpu) >= sysctl_sched_cpu_high_irqload;
}
#else /* CONFIG_SCHED_HMP */

View File

@ -346,6 +346,13 @@ static struct ctl_table kern_table[] = {
.mode = 0644,
.proc_handler = sched_window_update_handler,
},
{
.procname = "sched_cpu_high_irqload",
.data = &sysctl_sched_cpu_high_irqload,
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
{
.procname = "sched_ravg_hist_size",
.data = &sysctl_sched_ravg_hist_size,