aboutsummaryrefslogtreecommitdiff
path: root/kernel/sched/boost.c
blob: 1608dae6bd09f26d7d415a59513b1a4b4c1421d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/* Copyright (c) 2012-2016, 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
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include "sched.h"

/*
 * Scheduler boost is a mechanism to temporarily place tasks on CPUs
 * with higher capacity than those where a task would have normally
 * ended up with their load characteristics. Any entity enabling
 * boost is responsible for disabling it as well.
 */

unsigned int sysctl_sched_boost;

#ifdef CONFIG_DYNAMIC_STUNE_BOOST
static int boost_slot;
#endif // CONFIG_DYNAMIC_STUNE_BOOST

static bool verify_boost_params(int old_val, int new_val)
{
	/*
	 * Boost can only be turned on or off. There is no possiblity of
	 * switching from one boost type to another or to set the same
	 * kind of boost several times.
	 */
	return !(!!old_val == !!new_val);
}

int sched_boost_handler(struct ctl_table *table, int write,
		void __user *buffer, size_t *lenp,
		loff_t *ppos)
{
	int ret;
	unsigned int *data = (unsigned int *)table->data;
	unsigned int old_val;

	// Backup current sysctl_sched_boost value
	old_val = *data;

	// Set new sysctl_sched_boost value
	ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);

	if (ret || !write)
		goto done;

#ifdef CONFIG_DYNAMIC_STUNE_BOOST
	if (verify_boost_params(old_val, *data)) {
		if (*data > 0)
			do_stune_sched_boost("top-app", &boost_slot);
		else
			reset_stune_boost("top-app", boost_slot);
	} else {
		*data = old_val;
		ret = -EINVAL;
	}
#endif // CONFIG_DYNAMIC_STUNE_BOOST

done:
	return ret;
}