Unverified Commit 23c0e711 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!256 sched: Supprot dynamic affinity in scheduler

Merge Pull Request from: @zhangjian210 
 
This pathchset support dynamic affinity feature.

Dynamic affinity set preferred cpus for task. When the utilization of
taskgroup's preferred cpu is low, task only run in cpus preferred to
enhance cpu resource locality and reduce interference between task cgroups,
otherwise task can burst preferred cpus to use external cpu within
cpus allowed. 
 
Link:https://gitee.com/openeuler/kernel/pulls/256

 

Reviewed-by: default avatarZucheng Zheng <zhengzucheng@huawei.com>
Reviewed-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 80748ad9 9ef80982
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_V1_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_QOS_SCHED=y
CONFIG_QOS_SCHED_DYNAMIC_AFFINITY=y
# CONFIG_QOS_SCHED_SMT_EXPELLER is not set
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_QOS_SCHED_PRIO_LB=y
+1 −0
Original line number Diff line number Diff line
@@ -158,6 +158,7 @@ CONFIG_CGROUP_WRITEBACK=y
CONFIG_CGROUP_V1_WRITEBACK=y
CONFIG_CGROUP_SCHED=y
CONFIG_QOS_SCHED=y
CONFIG_QOS_SCHED_DYNAMIC_AFFINITY=y
# CONFIG_QOS_SCHED_SMT_EXPELLER is not set
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_QOS_SCHED_PRIO_LB=y
+73 −0
Original line number Diff line number Diff line
@@ -3251,6 +3251,76 @@ static const struct file_operations proc_setgroups_operations = {
};
#endif /* CONFIG_USER_NS */

#ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY

static int preferred_cpuset_show(struct seq_file *m, void *v)
{
	struct inode *inode = m->private;
	struct task_struct *p;

	p = get_proc_task(inode);
	if (!p)
		return -ESRCH;

	if (p->prefer_cpus)
		seq_printf(m, "%*pbl\n", cpumask_pr_args(p->prefer_cpus));
	else
		seq_putc(m, '\n');

	put_task_struct(p);

	return 0;
}

static ssize_t preferred_cpuset_write(struct file *file, const char __user *buf,
					size_t count, loff_t *offset)
{
	cpumask_var_t new_mask;
	int retval;
	struct inode *inode = file_inode(file);
	struct task_struct *p;

	p = get_proc_task(inode);
	if (!p)
		return -ESRCH;

	if (!alloc_cpumask_var(&new_mask, GFP_KERNEL)) {
		retval = -ENOMEM;
		goto out_put_task;
	}

	retval = cpumask_parselist_user(buf, count, new_mask);
	if (retval < 0)
		goto out_free_cpumask;

	retval = set_prefer_cpus_ptr(p, new_mask);
	if (retval < 0)
		goto out_free_cpumask;

	retval = count;

out_free_cpumask:
	free_cpumask_var(new_mask);
out_put_task:
	put_task_struct(p);

	return retval;
}

static int preferred_cpuset_open(struct inode *inode, struct file *filp)
{
	return single_open(filp, preferred_cpuset_show, inode);
}

static const struct file_operations proc_preferred_cpuset_operations = {
	.open		= preferred_cpuset_open,
	.write		= preferred_cpuset_write,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};
#endif

static int proc_pid_personality(struct seq_file *m, struct pid_namespace *ns,
				struct pid *pid, struct task_struct *task)
{
@@ -3820,6 +3890,9 @@ static const struct pid_entry tid_base_stuff[] = {
#ifdef CONFIG_BPF_SCHED
	REG("tag", 0644, proc_pid_tag_operations),
#endif
#ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY
	REG("preferred_cpuset", 0644, proc_preferred_cpuset_operations),
#endif
};

static int proc_tid_base_readdir(struct file *file, struct dir_context *ctx)
+18 −0
Original line number Diff line number Diff line
@@ -468,9 +468,15 @@ struct sched_statistics {
	KABI_RESERVE(1)
	KABI_RESERVE(2)
#endif

#if defined(CONFIG_QOS_SCHED_DYNAMIC_AFFINITY) && !defined(__GENKSYMS__)
	u64				nr_wakeups_preferred_cpus;
	u64				nr_wakeups_force_preferred_cpus;
#else
	KABI_RESERVE(3)
	KABI_RESERVE(4)
#endif
#endif
};

struct sched_entity {
@@ -1422,8 +1428,13 @@ struct task_struct {
	KABI_RESERVE(6)
#endif
	KABI_USE(7, void *pf_io_worker)
#if defined(CONFIG_QOS_SCHED_DYNAMIC_AFFINITY) && !defined(__GENKSYMS__)
	KABI_USE(8, cpumask_t *prefer_cpus)
	KABI_USE(9, const cpumask_t *select_cpus)
#else
	KABI_RESERVE(8)
	KABI_RESERVE(9)
#endif
	KABI_RESERVE(10)
	KABI_RESERVE(11)
	KABI_RESERVE(12)
@@ -2206,6 +2217,13 @@ static inline int sched_qos_cpu_overload(void)
}
#endif

#ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY
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);
#endif

#ifdef CONFIG_BPF_SCHED
extern void sched_settag(struct task_struct *tsk, s64 tag);

+4 −0
Original line number Diff line number Diff line
@@ -31,6 +31,10 @@ extern unsigned int sysctl_sched_min_granularity;
extern unsigned int sysctl_sched_wakeup_granularity;
extern unsigned int sysctl_sched_child_runs_first;

#ifdef CONFIG_QOS_SCHED_DYNAMIC_AFFINITY
extern int sysctl_sched_util_low_pct;
#endif

enum sched_tunable_scaling {
	SCHED_TUNABLESCALING_NONE,
	SCHED_TUNABLESCALING_LOG,
Loading