blob: b00fa85612971ad6478ef4292288122425b6653d [file] [log] [blame]
Mark Salyzyn12717162014-04-29 15:49:14 -07001/*
San Mehat493dad92009-09-12 10:06:57 -07002** Copyright 2007, The Android Open Source Project
3**
Tim Murrayb769c8d2015-06-08 14:56:29 -07004** Licensed under the Apache License, Version 2.0 (the "License");
5** you may not use this file except in compliance with the License.
6** You may obtain a copy of the License at
San Mehat493dad92009-09-12 10:06:57 -07007**
Tim Murrayb769c8d2015-06-08 14:56:29 -07008** http://www.apache.org/licenses/LICENSE-2.0
San Mehat493dad92009-09-12 10:06:57 -07009**
Tim Murrayb769c8d2015-06-08 14:56:29 -070010** Unless required by applicable law or agreed to in writing, software
11** distributed under the License is distributed on an "AS IS" BASIS,
12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13** See the License for the specific language governing permissions and
San Mehat493dad92009-09-12 10:06:57 -070014** limitations under the License.
15*/
16
Jeff Brownbff8f3f2012-05-08 15:05:42 -070017#define LOG_TAG "SchedPolicy"
18
San Mehat493dad92009-09-12 10:06:57 -070019#include <errno.h>
20#include <fcntl.h>
Mark Salyzyn12717162014-04-29 15:49:14 -070021#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <unistd.h>
25
Mark Salyzyncfd5b082016-10-17 14:28:00 -070026#include <log/log.h>
Jeff Brownbff8f3f2012-05-08 15:05:42 -070027#include <cutils/sched_policy.h>
Mark Salyzyn12717162014-04-29 15:49:14 -070028
29#define UNUSED __attribute__((__unused__))
Raphael0384a982009-09-15 17:10:17 -070030
Jeff Brownbff8f3f2012-05-08 15:05:42 -070031/* Re-map SP_DEFAULT to the system default policy, and leave other values unchanged.
32 * Call this any place a SchedPolicy is used as an input parameter.
33 * Returns the possibly re-mapped policy.
34 */
35static inline SchedPolicy _policy(SchedPolicy p)
36{
37 return p == SP_DEFAULT ? SP_SYSTEM_DEFAULT : p;
38}
San Mehatd2e4e462009-10-29 11:48:00 -070039
Elliott Hughes9b828ad2015-07-30 08:47:35 -070040#if defined(__ANDROID__)
Raphael0384a982009-09-15 17:10:17 -070041
Brad Fitzpatrick86b12152010-05-08 11:51:13 -070042#include <pthread.h>
Elliott Hughese07d77e2014-07-11 20:57:03 -070043#include <sched.h>
44#include <sys/prctl.h>
San Mehat3cd5b662009-09-14 16:05:24 -070045
San Mehat805d67a2009-10-29 13:56:26 -070046#define POLICY_DEBUG 0
San Mehatd2e4e462009-10-29 11:48:00 -070047
Ruchi Kandoi422852e2014-04-22 18:55:08 -070048// timer slack value in nS enforced when the thread moves to background
49#define TIMER_SLACK_BG 40000000
Todd Kjos4cdce422015-06-25 13:08:14 -070050#define TIMER_SLACK_FG 50000
Ruchi Kandoi422852e2014-04-22 18:55:08 -070051
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070052static pthread_once_t the_once = PTHREAD_ONCE_INIT;
53
John Reck2e336b12016-08-26 13:43:19 -070054static int __sys_supports_timerslack = -1;
San Mehatc0dfca72009-10-27 11:52:55 -070055
Tim Murrayb769c8d2015-06-08 14:56:29 -070056// File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
Tim Murray4284f9f2015-11-10 14:31:09 -080057static int system_bg_cpuset_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -070058static int bg_cpuset_fd = -1;
59static int fg_cpuset_fd = -1;
Tim Murray6647bb52016-01-11 16:16:35 -080060static int ta_cpuset_fd = -1; // special cpuset for top app
Tim Murrayaa45cb82016-07-08 15:47:11 -070061
62// File descriptors open to /dev/stune/../tasks, setup by initialize, or -1 on error
Todd Kjosba8a4752015-10-26 16:22:11 -070063static int bg_schedboost_fd = -1;
64static int fg_schedboost_fd = -1;
Tim Murray955694b2016-07-11 11:40:15 -070065static int ta_schedboost_fd = -1;
Joel Fernandes88ef9f02017-03-25 22:46:10 -070066static int rt_schedboost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -070067
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070068/* Add tid to the scheduling group defined by the policy */
Tim Murrayb769c8d2015-06-08 14:56:29 -070069static int add_tid_to_cgroup(int tid, int fd)
San Mehat493dad92009-09-12 10:06:57 -070070{
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070071 if (fd < 0) {
Tim Murrayb769c8d2015-06-08 14:56:29 -070072 SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd);
73 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -070074 return -1;
San Mehat805d67a2009-10-29 13:56:26 -070075 }
San Mehat493dad92009-09-12 10:06:57 -070076
Brad Fitzpatrick253e27a2010-05-06 10:00:37 -070077 // specialized itoa -- works for tid > 0
78 char text[22];
79 char *end = text + sizeof(text) - 1;
80 char *ptr = end;
81 *ptr = '\0';
82 while (tid > 0) {
83 *--ptr = '0' + (tid % 10);
84 tid = tid / 10;
85 }
86
87 if (write(fd, ptr, end - ptr) < 0) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070088 /*
89 * If the thread is in the process of exiting,
90 * don't flag an error
91 */
92 if (errno == ESRCH)
93 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -070094 SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n",
95 ptr, strerror(errno), fd);
96 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -070097 return -1;
98 }
99
San Mehat493dad92009-09-12 10:06:57 -0700100 return 0;
101}
102
Isaac Chen795267d2017-02-16 11:47:33 +0800103/*
104 If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under
105 /dev/cpuset mounted in init.rc; otherwise, that file does not exist
106 even though the directory, /dev/cpuset, is still created (by init.rc).
107
108 A couple of other candidates (under cpuset mount directory):
109 notify_on_release
110 release_agent
111
112 Yet another way to decide if cpuset is enabled is to parse
113 /proc/self/status and search for lines begin with "Mems_allowed".
114
115 If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can
116 be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency
117 on where init.rc mounts cpuset. That's why we'd better require this
118 configuration be set if CONFIG_CPUSETS is set.
119
Elliott Hughes76a934a2017-06-28 07:50:00 -0700120 In older releases, this was controlled by build-time configuration.
Isaac Chen795267d2017-02-16 11:47:33 +0800121 */
Isaac Chen795267d2017-02-16 11:47:33 +0800122bool cpusets_enabled() {
123 static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0);
124
125 return enabled;
126}
127
128/*
129 Similar to CONFIG_CPUSETS above, but with a different configuration
Alex Naidis2d998ea2017-06-10 22:34:23 +0200130 CONFIG_CGROUP_SCHEDTUNE that's in Android common Linux kernel and Linaro
Isaac Chen795267d2017-02-16 11:47:33 +0800131 Stable Kernel (LSK), but not in mainline Linux as of v4.9.
132
Elliott Hughes5dc77362017-06-29 08:52:49 -0700133 In older releases, this was controlled by build-time configuration.
Isaac Chen795267d2017-02-16 11:47:33 +0800134 */
Isaac Chen795267d2017-02-16 11:47:33 +0800135bool schedboost_enabled() {
136 static bool enabled = (access("/dev/stune/tasks", F_OK) == 0);
137
138 return enabled;
139}
140
141static void __initialize() {
142 const char* filename;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700143
Isaac Chen795267d2017-02-16 11:47:33 +0800144 if (cpusets_enabled()) {
145 if (!access("/dev/cpuset/tasks", W_OK)) {
Tim Murrayb769c8d2015-06-08 14:56:29 -0700146
Isaac Chen795267d2017-02-16 11:47:33 +0800147 filename = "/dev/cpuset/foreground/tasks";
148 fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
149 filename = "/dev/cpuset/background/tasks";
150 bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
151 filename = "/dev/cpuset/system-background/tasks";
152 system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
153 filename = "/dev/cpuset/top-app/tasks";
154 ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray4284f9f2015-11-10 14:31:09 -0800155
Isaac Chen795267d2017-02-16 11:47:33 +0800156 if (schedboost_enabled()) {
157 filename = "/dev/stune/top-app/tasks";
158 ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
159 filename = "/dev/stune/foreground/tasks";
160 fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
161 filename = "/dev/stune/background/tasks";
162 bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
Joel Fernandes88ef9f02017-03-25 22:46:10 -0700163 filename = "/dev/stune/rt/tasks";
164 rt_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
Isaac Chen795267d2017-02-16 11:47:33 +0800165 }
166 }
Tim Murrayb769c8d2015-06-08 14:56:29 -0700167 }
John Reck2e336b12016-08-26 13:43:19 -0700168
169 char buf[64];
170 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
171 __sys_supports_timerslack = !access(buf, W_OK);
San Mehatc0dfca72009-10-27 11:52:55 -0700172}
173
174/*
Martijn Coenen7b173a12016-04-04 17:11:56 +0200175 * Returns the path under the requested cgroup subsystem (if it exists)
San Mehatc0dfca72009-10-27 11:52:55 -0700176 *
San Mehat503df202010-03-02 17:09:56 -0800177 * The data from /proc/<pid>/cgroup looks (something) like:
San Mehatc0dfca72009-10-27 11:52:55 -0700178 * 2:cpu:/bg_non_interactive
San Mehat503df202010-03-02 17:09:56 -0800179 * 1:cpuacct:/
San Mehatc0dfca72009-10-27 11:52:55 -0700180 *
181 * We return the part after the "/", which will be an empty string for
182 * the default cgroup. If the string is longer than "bufLen", the string
183 * will be truncated.
184 */
Martijn Coenen7b173a12016-04-04 17:11:56 +0200185static int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
San Mehatc0dfca72009-10-27 11:52:55 -0700186{
Elliott Hughes9b828ad2015-07-30 08:47:35 -0700187#if defined(__ANDROID__)
San Mehatc0dfca72009-10-27 11:52:55 -0700188 char pathBuf[32];
San Mehat503df202010-03-02 17:09:56 -0800189 char lineBuf[256];
190 FILE *fp;
San Mehatc0dfca72009-10-27 11:52:55 -0700191
192 snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
John Stultz2f13f0a2016-07-01 17:45:06 -0700193 if (!(fp = fopen(pathBuf, "re"))) {
San Mehatc0dfca72009-10-27 11:52:55 -0700194 return -1;
195 }
196
San Mehat503df202010-03-02 17:09:56 -0800197 while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
198 char *next = lineBuf;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200199 char *found_subsys;
San Mehat503df202010-03-02 17:09:56 -0800200 char *grp;
201 size_t len;
San Mehatc0dfca72009-10-27 11:52:55 -0700202
San Mehat503df202010-03-02 17:09:56 -0800203 /* Junk the first field */
204 if (!strsep(&next, ":")) {
205 goto out_bad_data;
206 }
San Mehatc0dfca72009-10-27 11:52:55 -0700207
Martijn Coenen7b173a12016-04-04 17:11:56 +0200208 if (!(found_subsys = strsep(&next, ":"))) {
San Mehat503df202010-03-02 17:09:56 -0800209 goto out_bad_data;
210 }
211
Martijn Coenen7b173a12016-04-04 17:11:56 +0200212 if (strcmp(found_subsys, subsys)) {
San Mehat503df202010-03-02 17:09:56 -0800213 /* Not the subsys we're looking for */
214 continue;
215 }
216
217 if (!(grp = strsep(&next, ":"))) {
218 goto out_bad_data;
219 }
220 grp++; /* Drop the leading '/' */
221 len = strlen(grp);
222 grp[len-1] = '\0'; /* Drop the trailing '\n' */
223
224 if (bufLen <= len) {
225 len = bufLen - 1;
226 }
227 strncpy(buf, grp, len);
228 buf[len] = '\0';
229 fclose(fp);
230 return 0;
San Mehatc0dfca72009-10-27 11:52:55 -0700231 }
232
Martijn Coenen7b173a12016-04-04 17:11:56 +0200233 SLOGE("Failed to find subsys %s", subsys);
San Mehat503df202010-03-02 17:09:56 -0800234 fclose(fp);
235 return -1;
236 out_bad_data:
San Mehat7e8529a2010-03-25 09:31:42 -0700237 SLOGE("Bad cgroup data {%s}", lineBuf);
San Mehat503df202010-03-02 17:09:56 -0800238 fclose(fp);
239 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700240#else
241 errno = ENOSYS;
242 return -1;
243#endif
244}
245
246int get_sched_policy(int tid, SchedPolicy *policy)
247{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700248 if (tid == 0) {
249 tid = gettid();
250 }
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700251 pthread_once(&the_once, __initialize);
San Mehatc0dfca72009-10-27 11:52:55 -0700252
Wei Wang40267982017-03-25 09:53:31 -0700253 char grpBuf[32];
Isaac Chen795267d2017-02-16 11:47:33 +0800254
Erik Staatsb4c46542017-04-24 14:49:28 -0700255 grpBuf[0] = '\0';
256 if (schedboost_enabled()) {
257 if (getCGroupSubsys(tid, "schedtune", grpBuf, sizeof(grpBuf)) < 0) return -1;
258 }
259 if ((grpBuf[0] == '\0') && cpusets_enabled()) {
Wei Wang40267982017-03-25 09:53:31 -0700260 if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0) return -1;
Erik Staatsb4c46542017-04-24 14:49:28 -0700261 }
262 if (grpBuf[0] == '\0') {
Wei Wanga8d59fa2017-03-28 11:13:51 -0700263 *policy = SP_FOREGROUND;
Erik Staatsb4c46542017-04-24 14:49:28 -0700264 } else if (!strcmp(grpBuf, "foreground")) {
265 *policy = SP_FOREGROUND;
266 } else if (!strcmp(grpBuf, "system-background")) {
267 *policy = SP_SYSTEM;
268 } else if (!strcmp(grpBuf, "background")) {
269 *policy = SP_BACKGROUND;
270 } else if (!strcmp(grpBuf, "top-app")) {
271 *policy = SP_TOP_APP;
272 } else {
273 errno = ERANGE;
274 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700275 }
276 return 0;
277}
278
Tim Murrayb769c8d2015-06-08 14:56:29 -0700279int set_cpuset_policy(int tid, SchedPolicy policy)
280{
281 // in the absence of cpusets, use the old sched policy
Isaac Chen795267d2017-02-16 11:47:33 +0800282 if (!cpusets_enabled()) {
283 return set_sched_policy(tid, policy);
284 }
285
Tim Murrayb769c8d2015-06-08 14:56:29 -0700286 if (tid == 0) {
287 tid = gettid();
288 }
289 policy = _policy(policy);
290 pthread_once(&the_once, __initialize);
291
Tim Murrayb43225e2015-11-18 16:42:44 -0800292 int fd = -1;
293 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700294 switch (policy) {
295 case SP_BACKGROUND:
296 fd = bg_cpuset_fd;
Todd Kjosba8a4752015-10-26 16:22:11 -0700297 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700298 break;
299 case SP_FOREGROUND:
300 case SP_AUDIO_APP:
301 case SP_AUDIO_SYS:
302 fd = fg_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700303 boost_fd = fg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700304 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800305 case SP_TOP_APP :
306 fd = ta_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700307 boost_fd = ta_schedboost_fd;
Tim Murray6647bb52016-01-11 16:16:35 -0800308 break;
Tim Murray4284f9f2015-11-10 14:31:09 -0800309 case SP_SYSTEM:
310 fd = system_bg_cpuset_fd;
Tim Murray4284f9f2015-11-10 14:31:09 -0800311 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700312 default:
Todd Kjosba8a4752015-10-26 16:22:11 -0700313 boost_fd = fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700314 break;
315 }
316
317 if (add_tid_to_cgroup(tid, fd) != 0) {
318 if (errno != ESRCH && errno != ENOENT)
319 return -errno;
320 }
321
Isaac Chen795267d2017-02-16 11:47:33 +0800322 if (schedboost_enabled()) {
323 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
324 if (errno != ESRCH && errno != ENOENT)
325 return -errno;
326 }
Todd Kjosba8a4752015-10-26 16:22:11 -0700327 }
328
Tim Murray99910262015-06-22 14:00:56 -0700329 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700330}
331
Stephen Cranef5b8e342017-06-06 15:35:51 -0700332static void set_timerslack_ns(int tid, unsigned long slack) {
Elliott Hughesd7967c12016-08-03 15:11:01 -0700333 // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
334 // TODO: once we've backported this, log if the open(2) fails.
Erik Staatsd32331f2017-04-26 15:15:55 -0700335 if (__sys_supports_timerslack) {
336 char buf[64];
337 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
338 int fd = open(buf, O_WRONLY | O_CLOEXEC);
339 if (fd != -1) {
Stephen Cranef5b8e342017-06-06 15:35:51 -0700340 int len = snprintf(buf, sizeof(buf), "%lu", slack);
Erik Staatsd32331f2017-04-26 15:15:55 -0700341 if (write(fd, buf, len) != len) {
342 SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
343 }
344 close(fd);
345 return;
John Stultz2f13f0a2016-07-01 17:45:06 -0700346 }
Erik Staatsd32331f2017-04-26 15:15:55 -0700347 }
348
349 // TODO: Remove when /proc/<tid>/timerslack_ns interface is backported.
350 if ((tid == 0) || (tid == gettid())) {
351 if (prctl(PR_SET_TIMERSLACK, slack) == -1) {
352 SLOGE("set_timerslack_ns prctl failed: %s\n", strerror(errno));
353 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700354 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700355}
356
San Mehatc0dfca72009-10-27 11:52:55 -0700357int set_sched_policy(int tid, SchedPolicy policy)
358{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700359 if (tid == 0) {
360 tid = gettid();
361 }
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700362 policy = _policy(policy);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700363 pthread_once(&the_once, __initialize);
San Mehat493dad92009-09-12 10:06:57 -0700364
San Mehatd2e4e462009-10-29 11:48:00 -0700365#if POLICY_DEBUG
366 char statfile[64];
367 char statline[1024];
368 char thread_name[255];
San Mehatd2e4e462009-10-29 11:48:00 -0700369
Raja Ma2f37e42016-04-19 23:55:14 +0530370 snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
San Mehatd2e4e462009-10-29 11:48:00 -0700371 memset(thread_name, 0, sizeof(thread_name));
372
John Stultz2f13f0a2016-07-01 17:45:06 -0700373 int fd = open(statfile, O_RDONLY | O_CLOEXEC);
San Mehatd2e4e462009-10-29 11:48:00 -0700374 if (fd >= 0) {
375 int rc = read(fd, statline, 1023);
376 close(fd);
377 statline[rc] = 0;
378 char *p = statline;
379 char *q;
380
381 for (p = statline; *p != '('; p++);
382 p++;
383 for (q = p; *q != ')'; q++);
384
385 strncpy(thread_name, p, (q-p));
386 }
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700387 switch (policy) {
388 case SP_BACKGROUND:
San Mehat7e8529a2010-03-25 09:31:42 -0700389 SLOGD("vvv tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700390 break;
391 case SP_FOREGROUND:
Dima Zavin29319a62012-06-04 13:14:36 -0700392 case SP_AUDIO_APP:
393 case SP_AUDIO_SYS:
Tim Murray6647bb52016-01-11 16:16:35 -0800394 case SP_TOP_APP:
San Mehat7e8529a2010-03-25 09:31:42 -0700395 SLOGD("^^^ tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700396 break;
397 case SP_SYSTEM:
398 SLOGD("/// tid %d (%s)", tid, thread_name);
399 break;
Joel Fernandes88ef9f02017-03-25 22:46:10 -0700400 case SP_RT_APP:
401 SLOGD("RT tid %d (%s)", tid, thread_name);
402 break;
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700403 default:
San Mehat7e8529a2010-03-25 09:31:42 -0700404 SLOGD("??? tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700405 break;
San Mehatd2e4e462009-10-29 11:48:00 -0700406 }
407#endif
408
Wei Wang40267982017-03-25 09:53:31 -0700409 if (schedboost_enabled()) {
Tim Murrayaa45cb82016-07-08 15:47:11 -0700410 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700411 switch (policy) {
412 case SP_BACKGROUND:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700413 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700414 break;
415 case SP_FOREGROUND:
416 case SP_AUDIO_APP:
417 case SP_AUDIO_SYS:
Tim Murray955694b2016-07-11 11:40:15 -0700418 boost_fd = fg_schedboost_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700419 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800420 case SP_TOP_APP:
Tim Murray955694b2016-07-11 11:40:15 -0700421 boost_fd = ta_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700422 break;
Joel Fernandes88ef9f02017-03-25 22:46:10 -0700423 case SP_RT_APP:
424 boost_fd = rt_schedboost_fd;
425 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700426 default:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700427 boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700428 break;
429 }
430
Wei Wang40267982017-03-25 09:53:31 -0700431 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
San Mehat493dad92009-09-12 10:06:57 -0700432 if (errno != ESRCH && errno != ENOENT)
433 return -errno;
434 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700435
San Mehat493dad92009-09-12 10:06:57 -0700436 }
437
Erik Staatsd32331f2017-04-26 15:15:55 -0700438 set_timerslack_ns(tid, policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG);
Ruchi Kandoi422852e2014-04-22 18:55:08 -0700439
San Mehat493dad92009-09-12 10:06:57 -0700440 return 0;
441}
Raphael0384a982009-09-15 17:10:17 -0700442
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700443#else
444
445/* Stubs for non-Android targets. */
446
Mark Salyzyn12717162014-04-29 15:49:14 -0700447int set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700448{
449 return 0;
450}
451
Mark Salyzyn12717162014-04-29 15:49:14 -0700452int get_sched_policy(int tid UNUSED, SchedPolicy *policy)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700453{
454 *policy = SP_SYSTEM_DEFAULT;
455 return 0;
456}
457
458#endif
459
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800460const char *get_sched_policy_name(SchedPolicy policy)
461{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700462 policy = _policy(policy);
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800463 static const char * const strings[SP_CNT] = {
464 [SP_BACKGROUND] = "bg",
465 [SP_FOREGROUND] = "fg",
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700466 [SP_SYSTEM] = " ",
467 [SP_AUDIO_APP] = "aa",
468 [SP_AUDIO_SYS] = "as",
Tim Murray6647bb52016-01-11 16:16:35 -0800469 [SP_TOP_APP] = "ta",
Joel Fernandes88ef9f02017-03-25 22:46:10 -0700470 [SP_RT_APP] = "rt",
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800471 };
472 if ((policy < SP_CNT) && (strings[policy] != NULL))
473 return strings[policy];
474 else
475 return "error";
476}