Commit b9687ac2 authored by Hui Tang's avatar Hui Tang
Browse files

sched: Add cmdline for dynamic affinity

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



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

Add cmdline 'dynamic_affinity' to control dynamic affinity feature,
which is disabled by default.

Signed-off-by: default avatarHui Tang <tanghui20@huawei.com>
parent c3ade221
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -2484,5 +2484,11 @@ int set_prefer_cpus_ptr(struct task_struct *p,
			const struct cpumask *new_mask);
int sched_prefer_cpus_fork(struct task_struct *p, struct cpumask *mask);
void sched_prefer_cpus_free(struct task_struct *p);

extern struct static_key_false __dynamic_affinity_switch;
static inline bool dynamic_affinity_enabled(void)
{
	return static_branch_unlikely(&__dynamic_affinity_switch);
}
#endif
#endif
+3 −0
Original line number Diff line number Diff line
@@ -858,6 +858,9 @@ static int update_prefer_cpumask(struct cpuset *cs, struct cpuset *trialcs,
	if (cs == &top_cpuset)
		return -EACCES;

	if (!dynamic_affinity_enabled())
		return -EPERM;

	/*
	 * An empty prefer_cpus is ok which mean that the cpuset tasks disable
	 * dynamic affinity feature.
+7 −4
Original line number Diff line number Diff line
@@ -626,6 +626,7 @@ void free_task(struct task_struct *tsk)
		free_kthread_struct(tsk);
	bpf_task_storage_free(tsk);
#ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY
	if (dynamic_affinity_enabled())
		sched_prefer_cpus_free(tsk);
#endif
	free_task_struct(tsk);
@@ -2365,9 +2366,11 @@ __latent_entropy struct task_struct *copy_process(
	rt_mutex_init_task(p);

#ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY
	if (dynamic_affinity_enabled()) {
		retval = sched_prefer_cpus_fork(p, current->prefer_cpus);
		if (retval)
			goto bad_fork_free;
	}
#endif

	lockdep_assert_irqs_enabled();
+3 −0
Original line number Diff line number Diff line
@@ -11635,6 +11635,9 @@ static int __set_prefer_cpus_ptr(struct task_struct *p,
	struct rq *rq;
	int ret = 0;

	if (!dynamic_affinity_enabled())
		return -EPERM;

	if (unlikely(!p->prefer_cpus))
		return -EINVAL;

+4 −2
Original line number Diff line number Diff line
@@ -1040,8 +1040,10 @@ void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns,
		P_SCHEDSTAT(nr_wakeups_passive);
		P_SCHEDSTAT(nr_wakeups_idle);
#ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY
		if (dynamic_affinity_enabled()) {
			P_SCHEDSTAT(nr_wakeups_preferred_cpus);
			P_SCHEDSTAT(nr_wakeups_force_preferred_cpus);
		}
#endif

		avg_atom = p->se.sum_exec_runtime;
Loading