Commit 8b45f57c authored by Yu Jiahua's avatar Yu Jiahua Committed by Zheng Zengkai
Browse files

sched: Add switch for update_blocked_averages

hulk inclusion
category: feature
bugzilla: 175551 https://gitee.com/openeuler/kernel/issues/I4DVI3



--------------------------------

Avaliable for switch on/off for update_blocked_averages, it helps reducing
cpu usage when system in heavy load.

Signed-off-by: default avatarYu Jiahua <yujiahua1@huawei.com>
Reviewed-by: default avatarChen Hui <judy.chenhui@huawei.com>
Signed-off-by: default avatarChen Jun <chenjun102@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 44483ea0
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -98,4 +98,11 @@ int sched_energy_aware_handler(struct ctl_table *table, int write,
		void *buffer, size_t *lenp, loff_t *ppos);
#endif

#ifdef CONFIG_SCHED_OPTIMIZE_LOAD_TRACKING
extern int sysctl_blocked_averages(struct ctl_table *table, int write,
		  void __user *buffer, size_t *lenp, loff_t *ppos);

extern struct static_key_true sched_blocked_averages;
#endif

#endif /* _LINUX_SCHED_SYSCTL_H */
+40 −0
Original line number Diff line number Diff line
@@ -8001,6 +8001,39 @@ static void attach_tasks(struct lb_env *env)
	rq_unlock(env->dst_rq, &rf);
}

#ifdef CONFIG_SCHED_OPTIMIZE_LOAD_TRACKING
DEFINE_STATIC_KEY_TRUE(sched_blocked_averages);

static void set_blocked_averages(bool enabled)
{
	if (enabled)
		static_branch_enable(&sched_blocked_averages);
	else
		static_branch_disable(&sched_blocked_averages);
}

int sysctl_blocked_averages(struct ctl_table *table, int write,
			    void __user *buffer, size_t *lenp, loff_t *ppos)
{
	struct ctl_table t;
	int err;
	int state = static_branch_likely(&sched_blocked_averages);

	if (write && !capable(CAP_SYS_ADMIN))
		return -EPERM;

	t = *table;
	t.data = &state;
	err = proc_dointvec_minmax(&t, write, buffer, lenp, ppos);
	if (err < 0)
		return err;
	if (write)
		set_blocked_averages(state);

	return err;
}
#endif

#ifdef CONFIG_NO_HZ_COMMON
static inline bool cfs_rq_has_blocked(struct cfs_rq *cfs_rq)
{
@@ -8204,6 +8237,13 @@ static void update_blocked_averages(int cpu)
	rq_lock_irqsave(rq, &rf);
	update_rq_clock(rq);

#ifdef CONFIG_SCHED_OPTIMIZE_LOAD_TRACKING
	if (!static_branch_unlikely(&sched_blocked_averages)) {
		rq_unlock_irqrestore(rq, &rf);
		return;
	}
#endif

	decayed |= __update_blocked_others(rq, &done);
	decayed |= __update_blocked_fair(rq, &done);

+11 −0
Original line number Diff line number Diff line
@@ -1764,6 +1764,17 @@ static struct ctl_table kern_table[] = {
	},
#endif /* CONFIG_NUMA_BALANCING */
#endif /* CONFIG_SCHED_DEBUG */
#ifdef CONFIG_SCHED_OPTIMIZE_LOAD_TRACKING
	{
		.procname	= "sched_blocked_averages",
		.data		= NULL,
		.maxlen		= sizeof(unsigned int),
		.mode		= 0644,
		.proc_handler	= sysctl_blocked_averages,
		.extra1		= SYSCTL_ZERO,
		.extra2		= SYSCTL_ONE,
	},
#endif
	{
		.procname	= "sched_rt_period_us",
		.data		= &sysctl_sched_rt_period,