Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8a50729 authored by Pavankumar Kondeti's avatar Pavankumar Kondeti Committed by Gerrit - the friendly Code Review server
Browse files

sched/walt: Improve the scheduler



This change is for general scheduler improvements.

Change-Id: I84f84973b815fb0bb95d1d950a4ac90be11f9470
Signed-off-by: default avatarPavankumar Kondeti <pkondeti@codeaurora.org>
parent 9dad727a
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -2712,15 +2712,14 @@ extern void clear_top_tasks_bitmap(unsigned long *bitmap);
#if defined(CONFIG_SCHED_TUNE) && defined(CONFIG_CGROUP_SCHEDTUNE)
extern bool task_sched_boost(struct task_struct *p);
extern int sync_cgroup_colocation(struct task_struct *p, bool insert);
extern bool same_schedtune(struct task_struct *tsk1, struct task_struct *tsk2);
extern bool schedtune_task_colocated(struct task_struct *p);
extern void update_cgroup_boost_settings(void);
extern void restore_cgroup_boost_settings(void);

#else
static inline bool
same_schedtune(struct task_struct *tsk1, struct task_struct *tsk2)
static inline bool schedtune_task_colocated(struct task_struct *p)
{
	return true;
	return false;
}

static inline bool task_sched_boost(struct task_struct *p)
+17 −5
Original line number Diff line number Diff line
@@ -344,11 +344,6 @@ static inline void init_sched_boost(struct schedtune *st)
	st->colocate_update_disabled = false;
}

bool same_schedtune(struct task_struct *tsk1, struct task_struct *tsk2)
{
	return task_schedtune(tsk1) == task_schedtune(tsk2);
}

void update_cgroup_boost_settings(void)
{
	int i;
@@ -658,6 +653,23 @@ static int sched_colocate_write(struct cgroup_subsys_state *css,
	return 0;
}

bool schedtune_task_colocated(struct task_struct *p)
{
	struct schedtune *st;
	bool colocated;

	if (unlikely(!schedtune_initialized))
		return false;

	/* Get task boost value */
	rcu_read_lock();
	st = task_schedtune(p);
	colocated = st->colocate;
	rcu_read_unlock();

	return colocated;
}

#else /* CONFIG_SCHED_WALT */

static inline void init_sched_boost(struct schedtune *st) { }
+12 −22
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -2559,7 +2559,6 @@ static void transfer_busy_time(struct rq *rq, struct related_thread_group *grp,
 * Enable colocation and frequency aggregation for all threads in a process.
 * The children inherits the group id from the parent.
 */
unsigned int __read_mostly sysctl_sched_enable_thread_grouping;

/* Maximum allowed threshold before freq aggregation must be enabled */
#define MAX_FREQ_AGGR_THRESH 1000
@@ -2853,34 +2852,25 @@ void add_new_task_to_grp(struct task_struct *new)
{
	unsigned long flags;
	struct related_thread_group *grp;
	struct task_struct *leader = new->group_leader;
	unsigned int leader_grp_id = sched_get_group_id(leader);

	if (!sysctl_sched_enable_thread_grouping &&
	    leader_grp_id != DEFAULT_CGROUP_COLOC_ID)
		return;

	if (thread_group_leader(new))
	/*
	 * If the task does not belong to colocated schedtune
	 * cgroup, nothing to do. We are checking this without
	 * lock. Even if there is a race, it will be added
	 * to the co-located cgroup via cgroup attach.
	 */
	if (!schedtune_task_colocated(new))
		return;

	if (leader_grp_id == DEFAULT_CGROUP_COLOC_ID) {
		if (!same_schedtune(new, leader))
			return;
	}

	grp = lookup_related_thread_group(DEFAULT_CGROUP_COLOC_ID);
	write_lock_irqsave(&related_thread_group_lock, flags);

	rcu_read_lock();
	grp = task_related_thread_group(leader);
	rcu_read_unlock();

	/*
	 * It's possible that someone already added the new task to the
	 * group. A leader's thread group is updated prior to calling
	 * this function. It's also possible that the leader has exited
	 * the group. In either case, there is nothing else to do.
	 * group. or it might have taken out from the colocated schedtune
	 * cgroup. check these conditions under lock.
	 */
	if (!grp || new->grp) {
	if (!schedtune_task_colocated(new) || new->grp) {
		write_unlock_irqrestore(&related_thread_group_lock, flags);
		return;
	}