Commit 62468d81 authored by Yipeng Zou's avatar Yipeng Zou
Browse files

smart_grid: introduce smart_grid_strategy_ctrl sysctl

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


CVE: NA

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

Considering for inheritance of the pre-verion code.

We make all task to the highest qos_level (grid_qos_level = 0),when
smart_grid strategy was disabled.

Otherwise, When smart_grid strategy was enabled, we use the task's
actually grid_qos_level.

Default smart_grid strategy was disable (=0).

Signed-off-by: default avatarYipeng Zou <zouyipeng@huawei.com>
parent 5ed9128f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -112,6 +112,7 @@ int sched_grid_zone_update(bool is_locked);
int sched_grid_zone_add_af(struct auto_affinity *af);
int sched_grid_zone_del_af(struct auto_affinity *af);
struct cpumask *sched_grid_zone_cpumask(enum sg_zone_type zone);
struct cpumask *sched_grid_prefer_cpus(struct task_struct *p);
#else
static inline int __init sched_grid_zone_init(void) { return 0; }

+1 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ extern int sysctl_sched_util_low_pct;
#endif

#ifdef CONFIG_QOS_SCHED_SMART_GRID
extern unsigned int sysctl_smart_grid_strategy_ctrl;
extern int sysctl_affinity_adjust_delay_ms;
#endif

+1 −4
Original line number Diff line number Diff line
@@ -5839,16 +5839,13 @@ static void smart_grid_usage_dec(void)

static inline struct cpumask *task_prefer_cpus(struct task_struct *p)
{
	struct affinity_domain *ad;

	if (!smart_grid_used())
		return p->prefer_cpus;

	if (task_group(p)->auto_affinity->mode == 0)
		return (void *)p->cpus_ptr;

	ad = &task_group(p)->auto_affinity->ad;
	return ad->domains[ad->curr_level];
	return sched_grid_prefer_cpus(p);
}

static inline int dynamic_affinity_mode(struct task_struct *p)
+34 −0
Original line number Diff line number Diff line
@@ -236,3 +236,37 @@ struct cpumask *sched_grid_zone_cpumask(enum sg_zone_type zone)

	return &sg_zone.cpus[zone];
}

/*
 * Default smart_grid strategy was disable (=0).
 * But, considering for inheritance of the pre-verion code.
 * We make all the task to the highest qos_level (class_lvl = 0),
 * when smart_grid strategy was disabled.
 * Otherwise, When smart_grid strategy was enabled, we use the task's
 * actually class_lvl.
 */
unsigned int sysctl_smart_grid_strategy_ctrl;

struct cpumask *sched_grid_prefer_cpus(struct task_struct *p)
{
	struct affinity_domain *ad;
	enum sg_zone_type current_zone;

	ad = &task_group(p)->auto_affinity->ad;
	/*
	 * when smart_grid strategy was disabled,
	 * We make all the task to the highest qos_level (class_lvl = 0)
	 */
	if (sysctl_smart_grid_strategy_ctrl == 0)
		return ad->domains[ad->curr_level];

	/* Only place the highest level task into hot zone */
	current_zone = p->grid_qos->stat.class_lvl == SCHED_GRID_QOS_TASK_LEVEL_HIGHEST ?
		       SMART_GRID_ZONE_HOT : SMART_GRID_ZONE_WARM;

	/* Place the highest level task in current domain level itself */
	if (current_zone == SMART_GRID_ZONE_HOT)
		return ad->domains[ad->curr_level];

	return &sg_zone.cpus[current_zone];
}
+9 −0
Original line number Diff line number Diff line
@@ -2804,6 +2804,15 @@ static struct ctl_table kern_table[] = {
	},
#endif
#ifdef CONFIG_QOS_SCHED_SMART_GRID
	{
		.procname	= "smart_grid_strategy_ctrl",
		.data		= &sysctl_smart_grid_strategy_ctrl,
		.maxlen		= sizeof(unsigned int),
		.mode		= 0644,
		.proc_handler   = proc_dointvec_minmax,
		.extra1         = SYSCTL_ZERO,
		.extra2		= SYSCTL_ONE,
	},
	{
		.procname	= "affinity_adjust_delay_ms",
		.data		= &sysctl_affinity_adjust_delay_ms,