blob: 7170b4826067bd69d178e299d583380e8bbb040d [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
Steven Morelandd73be1b2017-04-13 23:48:57 -070031#ifndef SLOGE
32#define SLOGE ALOGE
33#endif
34#ifndef SLOGW
35#define SLOGW ALOGW
36#endif
37
Jeff Brownbff8f3f2012-05-08 15:05:42 -070038/* Re-map SP_DEFAULT to the system default policy, and leave other values unchanged.
39 * Call this any place a SchedPolicy is used as an input parameter.
40 * Returns the possibly re-mapped policy.
41 */
42static inline SchedPolicy _policy(SchedPolicy p)
43{
44 return p == SP_DEFAULT ? SP_SYSTEM_DEFAULT : p;
45}
San Mehatd2e4e462009-10-29 11:48:00 -070046
Elliott Hughes9b828ad2015-07-30 08:47:35 -070047#if defined(__ANDROID__)
Raphael0384a982009-09-15 17:10:17 -070048
Brad Fitzpatrick86b12152010-05-08 11:51:13 -070049#include <pthread.h>
Elliott Hughese07d77e2014-07-11 20:57:03 -070050#include <sched.h>
51#include <sys/prctl.h>
San Mehat3cd5b662009-09-14 16:05:24 -070052
San Mehat805d67a2009-10-29 13:56:26 -070053#define POLICY_DEBUG 0
San Mehatd2e4e462009-10-29 11:48:00 -070054
Ruchi Kandoi422852e2014-04-22 18:55:08 -070055// timer slack value in nS enforced when the thread moves to background
56#define TIMER_SLACK_BG 40000000
Todd Kjos4cdce422015-06-25 13:08:14 -070057#define TIMER_SLACK_FG 50000
Ruchi Kandoi422852e2014-04-22 18:55:08 -070058
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070059static pthread_once_t the_once = PTHREAD_ONCE_INIT;
60
John Reck2e336b12016-08-26 13:43:19 -070061static int __sys_supports_timerslack = -1;
San Mehatc0dfca72009-10-27 11:52:55 -070062
Tim Murrayb769c8d2015-06-08 14:56:29 -070063// File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
Tim Murray4284f9f2015-11-10 14:31:09 -080064static int system_bg_cpuset_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -070065static int bg_cpuset_fd = -1;
66static int fg_cpuset_fd = -1;
Tim Murray6647bb52016-01-11 16:16:35 -080067static int ta_cpuset_fd = -1; // special cpuset for top app
Tim Murrayaa45cb82016-07-08 15:47:11 -070068
69// File descriptors open to /dev/stune/../tasks, setup by initialize, or -1 on error
Todd Kjosba8a4752015-10-26 16:22:11 -070070static int bg_schedboost_fd = -1;
71static int fg_schedboost_fd = -1;
Tim Murray955694b2016-07-11 11:40:15 -070072static int ta_schedboost_fd = -1;
Joel Fernandes88ef9f02017-03-25 22:46:10 -070073static int rt_schedboost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -070074
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070075/* Add tid to the scheduling group defined by the policy */
Tim Murrayb769c8d2015-06-08 14:56:29 -070076static int add_tid_to_cgroup(int tid, int fd)
San Mehat493dad92009-09-12 10:06:57 -070077{
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070078 if (fd < 0) {
Tim Murrayb769c8d2015-06-08 14:56:29 -070079 SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd);
80 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -070081 return -1;
San Mehat805d67a2009-10-29 13:56:26 -070082 }
San Mehat493dad92009-09-12 10:06:57 -070083
Brad Fitzpatrick253e27a2010-05-06 10:00:37 -070084 // specialized itoa -- works for tid > 0
85 char text[22];
86 char *end = text + sizeof(text) - 1;
87 char *ptr = end;
88 *ptr = '\0';
89 while (tid > 0) {
90 *--ptr = '0' + (tid % 10);
91 tid = tid / 10;
92 }
93
94 if (write(fd, ptr, end - ptr) < 0) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070095 /*
96 * If the thread is in the process of exiting,
97 * don't flag an error
98 */
99 if (errno == ESRCH)
100 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700101 SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n",
102 ptr, strerror(errno), fd);
103 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -0700104 return -1;
105 }
106
San Mehat493dad92009-09-12 10:06:57 -0700107 return 0;
108}
109
Isaac Chen795267d2017-02-16 11:47:33 +0800110/*
111 If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under
112 /dev/cpuset mounted in init.rc; otherwise, that file does not exist
113 even though the directory, /dev/cpuset, is still created (by init.rc).
114
115 A couple of other candidates (under cpuset mount directory):
116 notify_on_release
117 release_agent
118
119 Yet another way to decide if cpuset is enabled is to parse
120 /proc/self/status and search for lines begin with "Mems_allowed".
121
122 If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can
123 be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency
124 on where init.rc mounts cpuset. That's why we'd better require this
125 configuration be set if CONFIG_CPUSETS is set.
126
127 With runtime check using the following function, build time
128 variables like ENABLE_CPUSETS (used in Android.mk) or cpusets (used
129 in Android.bp) are not needed.
130 */
131
132bool cpusets_enabled() {
133 static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0);
134
135 return enabled;
136}
137
138/*
139 Similar to CONFIG_CPUSETS above, but with a different configuration
140 CONFIG_SCHEDTUNE that's in Android common Linux kernel and Linaro
141 Stable Kernel (LSK), but not in mainline Linux as of v4.9.
142
143 With runtime check using the following function, build time
144 variables like ENABLE_SCHEDBOOST (used in Android.mk) or schedboost
145 (used in Android.bp) are not needed.
146
147 */
148
149bool schedboost_enabled() {
150 static bool enabled = (access("/dev/stune/tasks", F_OK) == 0);
151
152 return enabled;
153}
154
155static void __initialize() {
156 const char* filename;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700157
Isaac Chen795267d2017-02-16 11:47:33 +0800158 if (cpusets_enabled()) {
159 if (!access("/dev/cpuset/tasks", W_OK)) {
Tim Murrayb769c8d2015-06-08 14:56:29 -0700160
Isaac Chen795267d2017-02-16 11:47:33 +0800161 filename = "/dev/cpuset/foreground/tasks";
162 fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
163 filename = "/dev/cpuset/background/tasks";
164 bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
165 filename = "/dev/cpuset/system-background/tasks";
166 system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
167 filename = "/dev/cpuset/top-app/tasks";
168 ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray4284f9f2015-11-10 14:31:09 -0800169
Isaac Chen795267d2017-02-16 11:47:33 +0800170 if (schedboost_enabled()) {
171 filename = "/dev/stune/top-app/tasks";
172 ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
173 filename = "/dev/stune/foreground/tasks";
174 fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
175 filename = "/dev/stune/background/tasks";
176 bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
Joel Fernandes88ef9f02017-03-25 22:46:10 -0700177 filename = "/dev/stune/rt/tasks";
178 rt_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
Isaac Chen795267d2017-02-16 11:47:33 +0800179 }
180 }
Tim Murrayb769c8d2015-06-08 14:56:29 -0700181 }
John Reck2e336b12016-08-26 13:43:19 -0700182
183 char buf[64];
184 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
185 __sys_supports_timerslack = !access(buf, W_OK);
San Mehatc0dfca72009-10-27 11:52:55 -0700186}
187
188/*
Martijn Coenen7b173a12016-04-04 17:11:56 +0200189 * Returns the path under the requested cgroup subsystem (if it exists)
San Mehatc0dfca72009-10-27 11:52:55 -0700190 *
San Mehat503df202010-03-02 17:09:56 -0800191 * The data from /proc/<pid>/cgroup looks (something) like:
San Mehatc0dfca72009-10-27 11:52:55 -0700192 * 2:cpu:/bg_non_interactive
San Mehat503df202010-03-02 17:09:56 -0800193 * 1:cpuacct:/
San Mehatc0dfca72009-10-27 11:52:55 -0700194 *
195 * We return the part after the "/", which will be an empty string for
196 * the default cgroup. If the string is longer than "bufLen", the string
197 * will be truncated.
198 */
Martijn Coenen7b173a12016-04-04 17:11:56 +0200199static int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
San Mehatc0dfca72009-10-27 11:52:55 -0700200{
Elliott Hughes9b828ad2015-07-30 08:47:35 -0700201#if defined(__ANDROID__)
San Mehatc0dfca72009-10-27 11:52:55 -0700202 char pathBuf[32];
San Mehat503df202010-03-02 17:09:56 -0800203 char lineBuf[256];
204 FILE *fp;
San Mehatc0dfca72009-10-27 11:52:55 -0700205
206 snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
John Stultz2f13f0a2016-07-01 17:45:06 -0700207 if (!(fp = fopen(pathBuf, "re"))) {
San Mehatc0dfca72009-10-27 11:52:55 -0700208 return -1;
209 }
210
San Mehat503df202010-03-02 17:09:56 -0800211 while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
212 char *next = lineBuf;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200213 char *found_subsys;
San Mehat503df202010-03-02 17:09:56 -0800214 char *grp;
215 size_t len;
San Mehatc0dfca72009-10-27 11:52:55 -0700216
San Mehat503df202010-03-02 17:09:56 -0800217 /* Junk the first field */
218 if (!strsep(&next, ":")) {
219 goto out_bad_data;
220 }
San Mehatc0dfca72009-10-27 11:52:55 -0700221
Martijn Coenen7b173a12016-04-04 17:11:56 +0200222 if (!(found_subsys = strsep(&next, ":"))) {
San Mehat503df202010-03-02 17:09:56 -0800223 goto out_bad_data;
224 }
225
Martijn Coenen7b173a12016-04-04 17:11:56 +0200226 if (strcmp(found_subsys, subsys)) {
San Mehat503df202010-03-02 17:09:56 -0800227 /* Not the subsys we're looking for */
228 continue;
229 }
230
231 if (!(grp = strsep(&next, ":"))) {
232 goto out_bad_data;
233 }
234 grp++; /* Drop the leading '/' */
235 len = strlen(grp);
236 grp[len-1] = '\0'; /* Drop the trailing '\n' */
237
238 if (bufLen <= len) {
239 len = bufLen - 1;
240 }
241 strncpy(buf, grp, len);
242 buf[len] = '\0';
243 fclose(fp);
244 return 0;
San Mehatc0dfca72009-10-27 11:52:55 -0700245 }
246
Martijn Coenen7b173a12016-04-04 17:11:56 +0200247 SLOGE("Failed to find subsys %s", subsys);
San Mehat503df202010-03-02 17:09:56 -0800248 fclose(fp);
249 return -1;
250 out_bad_data:
San Mehat7e8529a2010-03-25 09:31:42 -0700251 SLOGE("Bad cgroup data {%s}", lineBuf);
San Mehat503df202010-03-02 17:09:56 -0800252 fclose(fp);
253 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700254#else
255 errno = ENOSYS;
256 return -1;
257#endif
258}
259
260int get_sched_policy(int tid, SchedPolicy *policy)
261{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700262 if (tid == 0) {
263 tid = gettid();
264 }
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700265 pthread_once(&the_once, __initialize);
San Mehatc0dfca72009-10-27 11:52:55 -0700266
Wei Wang40267982017-03-25 09:53:31 -0700267 char grpBuf[32];
Isaac Chen795267d2017-02-16 11:47:33 +0800268
Erik Staatsb4c46542017-04-24 14:49:28 -0700269 grpBuf[0] = '\0';
270 if (schedboost_enabled()) {
271 if (getCGroupSubsys(tid, "schedtune", grpBuf, sizeof(grpBuf)) < 0) return -1;
272 }
273 if ((grpBuf[0] == '\0') && cpusets_enabled()) {
Wei Wang40267982017-03-25 09:53:31 -0700274 if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0) return -1;
Erik Staatsb4c46542017-04-24 14:49:28 -0700275 }
276 if (grpBuf[0] == '\0') {
Wei Wanga8d59fa2017-03-28 11:13:51 -0700277 *policy = SP_FOREGROUND;
Erik Staatsb4c46542017-04-24 14:49:28 -0700278 } else if (!strcmp(grpBuf, "foreground")) {
279 *policy = SP_FOREGROUND;
280 } else if (!strcmp(grpBuf, "system-background")) {
281 *policy = SP_SYSTEM;
282 } else if (!strcmp(grpBuf, "background")) {
283 *policy = SP_BACKGROUND;
284 } else if (!strcmp(grpBuf, "top-app")) {
285 *policy = SP_TOP_APP;
286 } else {
287 errno = ERANGE;
288 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700289 }
290 return 0;
291}
292
Tim Murrayb769c8d2015-06-08 14:56:29 -0700293int set_cpuset_policy(int tid, SchedPolicy policy)
294{
295 // in the absence of cpusets, use the old sched policy
Isaac Chen795267d2017-02-16 11:47:33 +0800296 if (!cpusets_enabled()) {
297 return set_sched_policy(tid, policy);
298 }
299
Tim Murrayb769c8d2015-06-08 14:56:29 -0700300 if (tid == 0) {
301 tid = gettid();
302 }
303 policy = _policy(policy);
304 pthread_once(&the_once, __initialize);
305
Tim Murrayb43225e2015-11-18 16:42:44 -0800306 int fd = -1;
307 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700308 switch (policy) {
309 case SP_BACKGROUND:
310 fd = bg_cpuset_fd;
Todd Kjosba8a4752015-10-26 16:22:11 -0700311 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700312 break;
313 case SP_FOREGROUND:
314 case SP_AUDIO_APP:
315 case SP_AUDIO_SYS:
316 fd = fg_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700317 boost_fd = fg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700318 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800319 case SP_TOP_APP :
320 fd = ta_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700321 boost_fd = ta_schedboost_fd;
Tim Murray6647bb52016-01-11 16:16:35 -0800322 break;
Tim Murray4284f9f2015-11-10 14:31:09 -0800323 case SP_SYSTEM:
324 fd = system_bg_cpuset_fd;
Tim Murray4284f9f2015-11-10 14:31:09 -0800325 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700326 default:
Todd Kjosba8a4752015-10-26 16:22:11 -0700327 boost_fd = fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700328 break;
329 }
330
331 if (add_tid_to_cgroup(tid, fd) != 0) {
332 if (errno != ESRCH && errno != ENOENT)
333 return -errno;
334 }
335
Isaac Chen795267d2017-02-16 11:47:33 +0800336 if (schedboost_enabled()) {
337 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
338 if (errno != ESRCH && errno != ENOENT)
339 return -errno;
340 }
Todd Kjosba8a4752015-10-26 16:22:11 -0700341 }
342
Tim Murray99910262015-06-22 14:00:56 -0700343 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700344}
345
John Stultz2f13f0a2016-07-01 17:45:06 -0700346static void set_timerslack_ns(int tid, unsigned long long slack) {
Elliott Hughesd7967c12016-08-03 15:11:01 -0700347 // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
348 // TODO: once we've backported this, log if the open(2) fails.
Erik Staatsd32331f2017-04-26 15:15:55 -0700349 if (__sys_supports_timerslack) {
350 char buf[64];
351 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
352 int fd = open(buf, O_WRONLY | O_CLOEXEC);
353 if (fd != -1) {
354 int len = snprintf(buf, sizeof(buf), "%llu", slack);
355 if (write(fd, buf, len) != len) {
356 SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
357 }
358 close(fd);
359 return;
John Stultz2f13f0a2016-07-01 17:45:06 -0700360 }
Erik Staatsd32331f2017-04-26 15:15:55 -0700361 }
362
363 // TODO: Remove when /proc/<tid>/timerslack_ns interface is backported.
364 if ((tid == 0) || (tid == gettid())) {
365 if (prctl(PR_SET_TIMERSLACK, slack) == -1) {
366 SLOGE("set_timerslack_ns prctl failed: %s\n", strerror(errno));
367 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700368 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700369}
370
San Mehatc0dfca72009-10-27 11:52:55 -0700371int set_sched_policy(int tid, SchedPolicy policy)
372{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700373 if (tid == 0) {
374 tid = gettid();
375 }
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700376 policy = _policy(policy);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700377 pthread_once(&the_once, __initialize);
San Mehat493dad92009-09-12 10:06:57 -0700378
San Mehatd2e4e462009-10-29 11:48:00 -0700379#if POLICY_DEBUG
380 char statfile[64];
381 char statline[1024];
382 char thread_name[255];
San Mehatd2e4e462009-10-29 11:48:00 -0700383
Raja Ma2f37e42016-04-19 23:55:14 +0530384 snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
San Mehatd2e4e462009-10-29 11:48:00 -0700385 memset(thread_name, 0, sizeof(thread_name));
386
John Stultz2f13f0a2016-07-01 17:45:06 -0700387 int fd = open(statfile, O_RDONLY | O_CLOEXEC);
San Mehatd2e4e462009-10-29 11:48:00 -0700388 if (fd >= 0) {
389 int rc = read(fd, statline, 1023);
390 close(fd);
391 statline[rc] = 0;
392 char *p = statline;
393 char *q;
394
395 for (p = statline; *p != '('; p++);
396 p++;
397 for (q = p; *q != ')'; q++);
398
399 strncpy(thread_name, p, (q-p));
400 }
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700401 switch (policy) {
402 case SP_BACKGROUND:
San Mehat7e8529a2010-03-25 09:31:42 -0700403 SLOGD("vvv tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700404 break;
405 case SP_FOREGROUND:
Dima Zavin29319a62012-06-04 13:14:36 -0700406 case SP_AUDIO_APP:
407 case SP_AUDIO_SYS:
Tim Murray6647bb52016-01-11 16:16:35 -0800408 case SP_TOP_APP:
San Mehat7e8529a2010-03-25 09:31:42 -0700409 SLOGD("^^^ tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700410 break;
411 case SP_SYSTEM:
412 SLOGD("/// tid %d (%s)", tid, thread_name);
413 break;
Joel Fernandes88ef9f02017-03-25 22:46:10 -0700414 case SP_RT_APP:
415 SLOGD("RT tid %d (%s)", tid, thread_name);
416 break;
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700417 default:
San Mehat7e8529a2010-03-25 09:31:42 -0700418 SLOGD("??? tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700419 break;
San Mehatd2e4e462009-10-29 11:48:00 -0700420 }
421#endif
422
Wei Wang40267982017-03-25 09:53:31 -0700423 if (schedboost_enabled()) {
Tim Murrayaa45cb82016-07-08 15:47:11 -0700424 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700425 switch (policy) {
426 case SP_BACKGROUND:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700427 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700428 break;
429 case SP_FOREGROUND:
430 case SP_AUDIO_APP:
431 case SP_AUDIO_SYS:
Tim Murray955694b2016-07-11 11:40:15 -0700432 boost_fd = fg_schedboost_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700433 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800434 case SP_TOP_APP:
Tim Murray955694b2016-07-11 11:40:15 -0700435 boost_fd = ta_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700436 break;
Joel Fernandes88ef9f02017-03-25 22:46:10 -0700437 case SP_RT_APP:
438 boost_fd = rt_schedboost_fd;
439 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700440 default:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700441 boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700442 break;
443 }
444
Wei Wang40267982017-03-25 09:53:31 -0700445 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
San Mehat493dad92009-09-12 10:06:57 -0700446 if (errno != ESRCH && errno != ENOENT)
447 return -errno;
448 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700449
San Mehat493dad92009-09-12 10:06:57 -0700450 }
451
Erik Staatsd32331f2017-04-26 15:15:55 -0700452 set_timerslack_ns(tid, policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG);
Ruchi Kandoi422852e2014-04-22 18:55:08 -0700453
San Mehat493dad92009-09-12 10:06:57 -0700454 return 0;
455}
Raphael0384a982009-09-15 17:10:17 -0700456
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700457#else
458
459/* Stubs for non-Android targets. */
460
Mark Salyzyn12717162014-04-29 15:49:14 -0700461int set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700462{
463 return 0;
464}
465
Mark Salyzyn12717162014-04-29 15:49:14 -0700466int get_sched_policy(int tid UNUSED, SchedPolicy *policy)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700467{
468 *policy = SP_SYSTEM_DEFAULT;
469 return 0;
470}
471
472#endif
473
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800474const char *get_sched_policy_name(SchedPolicy policy)
475{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700476 policy = _policy(policy);
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800477 static const char * const strings[SP_CNT] = {
478 [SP_BACKGROUND] = "bg",
479 [SP_FOREGROUND] = "fg",
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700480 [SP_SYSTEM] = " ",
481 [SP_AUDIO_APP] = "aa",
482 [SP_AUDIO_SYS] = "as",
Tim Murray6647bb52016-01-11 16:16:35 -0800483 [SP_TOP_APP] = "ta",
Joel Fernandes88ef9f02017-03-25 22:46:10 -0700484 [SP_RT_APP] = "rt",
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800485 };
486 if ((policy < SP_CNT) && (strings[policy] != NULL))
487 return strings[policy];
488 else
489 return "error";
490}