|
@@ -814,6 +814,7 @@ const_debug unsigned int sysctl_sched_nr_migrate = 32;
|
|
|
* default: 0.25ms
|
|
|
*/
|
|
|
unsigned int sysctl_sched_shares_ratelimit = 250000;
|
|
|
+unsigned int normalized_sysctl_sched_shares_ratelimit = 250000;
|
|
|
|
|
|
/*
|
|
|
* Inject some fuzzyness into changing the per-cpu group shares
|
|
@@ -1814,6 +1815,7 @@ static void cfs_rq_set_shares(struct cfs_rq *cfs_rq, unsigned long shares)
|
|
|
#endif
|
|
|
|
|
|
static void calc_load_account_active(struct rq *this_rq);
|
|
|
+static void update_sysctl(void);
|
|
|
|
|
|
static inline void __set_task_cpu(struct task_struct *p, unsigned int cpu)
|
|
|
{
|
|
@@ -7028,22 +7030,23 @@ cpumask_var_t nohz_cpu_mask;
|
|
|
*
|
|
|
* This idea comes from the SD scheduler of Con Kolivas:
|
|
|
*/
|
|
|
-static inline void sched_init_granularity(void)
|
|
|
+static void update_sysctl(void)
|
|
|
{
|
|
|
- unsigned int factor = 1 + ilog2(num_online_cpus());
|
|
|
- const unsigned long limit = 200000000;
|
|
|
-
|
|
|
- sysctl_sched_min_granularity *= factor;
|
|
|
- if (sysctl_sched_min_granularity > limit)
|
|
|
- sysctl_sched_min_granularity = limit;
|
|
|
-
|
|
|
- sysctl_sched_latency *= factor;
|
|
|
- if (sysctl_sched_latency > limit)
|
|
|
- sysctl_sched_latency = limit;
|
|
|
+ unsigned int cpus = min(num_online_cpus(), 8U);
|
|
|
+ unsigned int factor = 1 + ilog2(cpus);
|
|
|
|
|
|
- sysctl_sched_wakeup_granularity *= factor;
|
|
|
+#define SET_SYSCTL(name) \
|
|
|
+ (sysctl_##name = (factor) * normalized_sysctl_##name)
|
|
|
+ SET_SYSCTL(sched_min_granularity);
|
|
|
+ SET_SYSCTL(sched_latency);
|
|
|
+ SET_SYSCTL(sched_wakeup_granularity);
|
|
|
+ SET_SYSCTL(sched_shares_ratelimit);
|
|
|
+#undef SET_SYSCTL
|
|
|
+}
|
|
|
|
|
|
- sysctl_sched_shares_ratelimit *= factor;
|
|
|
+static inline void sched_init_granularity(void)
|
|
|
+{
|
|
|
+ update_sysctl();
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SMP
|