blob: 4c303e6b1b7900fa767142860211555d8b159500 [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;
Tim Murrayb769c8d2015-06-08 14:56:29 -070073
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070074/* Add tid to the scheduling group defined by the policy */
Tim Murrayb769c8d2015-06-08 14:56:29 -070075static int add_tid_to_cgroup(int tid, int fd)
San Mehat493dad92009-09-12 10:06:57 -070076{
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070077 if (fd < 0) {
Tim Murrayb769c8d2015-06-08 14:56:29 -070078 SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd);
79 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -070080 return -1;
San Mehat805d67a2009-10-29 13:56:26 -070081 }
San Mehat493dad92009-09-12 10:06:57 -070082
Brad Fitzpatrick253e27a2010-05-06 10:00:37 -070083 // specialized itoa -- works for tid > 0
84 char text[22];
85 char *end = text + sizeof(text) - 1;
86 char *ptr = end;
87 *ptr = '\0';
88 while (tid > 0) {
89 *--ptr = '0' + (tid % 10);
90 tid = tid / 10;
91 }
92
93 if (write(fd, ptr, end - ptr) < 0) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070094 /*
95 * If the thread is in the process of exiting,
96 * don't flag an error
97 */
98 if (errno == ESRCH)
99 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700100 SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n",
101 ptr, strerror(errno), fd);
102 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -0700103 return -1;
104 }
105
San Mehat493dad92009-09-12 10:06:57 -0700106 return 0;
107}
108
Isaac Chen795267d2017-02-16 11:47:33 +0800109/*
110 If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under
111 /dev/cpuset mounted in init.rc; otherwise, that file does not exist
112 even though the directory, /dev/cpuset, is still created (by init.rc).
113
114 A couple of other candidates (under cpuset mount directory):
115 notify_on_release
116 release_agent
117
118 Yet another way to decide if cpuset is enabled is to parse
119 /proc/self/status and search for lines begin with "Mems_allowed".
120
121 If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can
122 be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency
123 on where init.rc mounts cpuset. That's why we'd better require this
124 configuration be set if CONFIG_CPUSETS is set.
125
126 With runtime check using the following function, build time
127 variables like ENABLE_CPUSETS (used in Android.mk) or cpusets (used
128 in Android.bp) are not needed.
129 */
130
131bool cpusets_enabled() {
132 static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0);
133
134 return enabled;
135}
136
137/*
138 Similar to CONFIG_CPUSETS above, but with a different configuration
Alex Naidis2d998ea2017-06-10 22:34:23 +0200139 CONFIG_CGROUP_SCHEDTUNE that's in Android common Linux kernel and Linaro
Isaac Chen795267d2017-02-16 11:47:33 +0800140 Stable Kernel (LSK), but not in mainline Linux as of v4.9.
141
142 With runtime check using the following function, build time
143 variables like ENABLE_SCHEDBOOST (used in Android.mk) or schedboost
144 (used in Android.bp) are not needed.
145
146 */
147
148bool schedboost_enabled() {
149 static bool enabled = (access("/dev/stune/tasks", F_OK) == 0);
150
151 return enabled;
152}
153
154static void __initialize() {
155 const char* filename;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700156
Isaac Chen795267d2017-02-16 11:47:33 +0800157 if (cpusets_enabled()) {
158 if (!access("/dev/cpuset/tasks", W_OK)) {
Tim Murrayb769c8d2015-06-08 14:56:29 -0700159
Isaac Chen795267d2017-02-16 11:47:33 +0800160 filename = "/dev/cpuset/foreground/tasks";
161 fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
162 filename = "/dev/cpuset/background/tasks";
163 bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
164 filename = "/dev/cpuset/system-background/tasks";
165 system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
166 filename = "/dev/cpuset/top-app/tasks";
167 ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray4284f9f2015-11-10 14:31:09 -0800168
Isaac Chen795267d2017-02-16 11:47:33 +0800169 if (schedboost_enabled()) {
170 filename = "/dev/stune/top-app/tasks";
171 ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
172 filename = "/dev/stune/foreground/tasks";
173 fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
174 filename = "/dev/stune/background/tasks";
175 bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
176 }
177 }
Tim Murrayb769c8d2015-06-08 14:56:29 -0700178 }
John Reck2e336b12016-08-26 13:43:19 -0700179
180 char buf[64];
181 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
182 __sys_supports_timerslack = !access(buf, W_OK);
San Mehatc0dfca72009-10-27 11:52:55 -0700183}
184
185/*
Martijn Coenen7b173a12016-04-04 17:11:56 +0200186 * Returns the path under the requested cgroup subsystem (if it exists)
San Mehatc0dfca72009-10-27 11:52:55 -0700187 *
San Mehat503df202010-03-02 17:09:56 -0800188 * The data from /proc/<pid>/cgroup looks (something) like:
San Mehatc0dfca72009-10-27 11:52:55 -0700189 * 2:cpu:/bg_non_interactive
San Mehat503df202010-03-02 17:09:56 -0800190 * 1:cpuacct:/
San Mehatc0dfca72009-10-27 11:52:55 -0700191 *
192 * We return the part after the "/", which will be an empty string for
193 * the default cgroup. If the string is longer than "bufLen", the string
194 * will be truncated.
195 */
Martijn Coenen7b173a12016-04-04 17:11:56 +0200196static int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
San Mehatc0dfca72009-10-27 11:52:55 -0700197{
Elliott Hughes9b828ad2015-07-30 08:47:35 -0700198#if defined(__ANDROID__)
San Mehatc0dfca72009-10-27 11:52:55 -0700199 char pathBuf[32];
San Mehat503df202010-03-02 17:09:56 -0800200 char lineBuf[256];
201 FILE *fp;
San Mehatc0dfca72009-10-27 11:52:55 -0700202
203 snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
John Stultz2f13f0a2016-07-01 17:45:06 -0700204 if (!(fp = fopen(pathBuf, "re"))) {
San Mehatc0dfca72009-10-27 11:52:55 -0700205 return -1;
206 }
207
San Mehat503df202010-03-02 17:09:56 -0800208 while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
209 char *next = lineBuf;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200210 char *found_subsys;
San Mehat503df202010-03-02 17:09:56 -0800211 char *grp;
212 size_t len;
San Mehatc0dfca72009-10-27 11:52:55 -0700213
San Mehat503df202010-03-02 17:09:56 -0800214 /* Junk the first field */
215 if (!strsep(&next, ":")) {
216 goto out_bad_data;
217 }
San Mehatc0dfca72009-10-27 11:52:55 -0700218
Martijn Coenen7b173a12016-04-04 17:11:56 +0200219 if (!(found_subsys = strsep(&next, ":"))) {
San Mehat503df202010-03-02 17:09:56 -0800220 goto out_bad_data;
221 }
222
Martijn Coenen7b173a12016-04-04 17:11:56 +0200223 if (strcmp(found_subsys, subsys)) {
San Mehat503df202010-03-02 17:09:56 -0800224 /* Not the subsys we're looking for */
225 continue;
226 }
227
228 if (!(grp = strsep(&next, ":"))) {
229 goto out_bad_data;
230 }
231 grp++; /* Drop the leading '/' */
232 len = strlen(grp);
233 grp[len-1] = '\0'; /* Drop the trailing '\n' */
234
235 if (bufLen <= len) {
236 len = bufLen - 1;
237 }
238 strncpy(buf, grp, len);
239 buf[len] = '\0';
240 fclose(fp);
241 return 0;
San Mehatc0dfca72009-10-27 11:52:55 -0700242 }
243
Martijn Coenen7b173a12016-04-04 17:11:56 +0200244 SLOGE("Failed to find subsys %s", subsys);
San Mehat503df202010-03-02 17:09:56 -0800245 fclose(fp);
246 return -1;
247 out_bad_data:
San Mehat7e8529a2010-03-25 09:31:42 -0700248 SLOGE("Bad cgroup data {%s}", lineBuf);
San Mehat503df202010-03-02 17:09:56 -0800249 fclose(fp);
250 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700251#else
252 errno = ENOSYS;
253 return -1;
254#endif
255}
256
257int get_sched_policy(int tid, SchedPolicy *policy)
258{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700259 if (tid == 0) {
260 tid = gettid();
261 }
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700262 pthread_once(&the_once, __initialize);
San Mehatc0dfca72009-10-27 11:52:55 -0700263
Wei Wang40267982017-03-25 09:53:31 -0700264 char grpBuf[32];
Isaac Chen795267d2017-02-16 11:47:33 +0800265
Erik Staatsb4c46542017-04-24 14:49:28 -0700266 grpBuf[0] = '\0';
267 if (schedboost_enabled()) {
268 if (getCGroupSubsys(tid, "schedtune", grpBuf, sizeof(grpBuf)) < 0) return -1;
269 }
270 if ((grpBuf[0] == '\0') && cpusets_enabled()) {
Wei Wang40267982017-03-25 09:53:31 -0700271 if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0) return -1;
Erik Staatsb4c46542017-04-24 14:49:28 -0700272 }
273 if (grpBuf[0] == '\0') {
Wei Wanga8d59fa2017-03-28 11:13:51 -0700274 *policy = SP_FOREGROUND;
Erik Staatsb4c46542017-04-24 14:49:28 -0700275 } else if (!strcmp(grpBuf, "foreground")) {
276 *policy = SP_FOREGROUND;
277 } else if (!strcmp(grpBuf, "system-background")) {
278 *policy = SP_SYSTEM;
279 } else if (!strcmp(grpBuf, "background")) {
280 *policy = SP_BACKGROUND;
281 } else if (!strcmp(grpBuf, "top-app")) {
282 *policy = SP_TOP_APP;
283 } else {
284 errno = ERANGE;
285 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700286 }
287 return 0;
288}
289
Tim Murrayb769c8d2015-06-08 14:56:29 -0700290int set_cpuset_policy(int tid, SchedPolicy policy)
291{
292 // in the absence of cpusets, use the old sched policy
Isaac Chen795267d2017-02-16 11:47:33 +0800293 if (!cpusets_enabled()) {
294 return set_sched_policy(tid, policy);
295 }
296
Tim Murrayb769c8d2015-06-08 14:56:29 -0700297 if (tid == 0) {
298 tid = gettid();
299 }
300 policy = _policy(policy);
301 pthread_once(&the_once, __initialize);
302
Tim Murrayb43225e2015-11-18 16:42:44 -0800303 int fd = -1;
304 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700305 switch (policy) {
306 case SP_BACKGROUND:
307 fd = bg_cpuset_fd;
Todd Kjosba8a4752015-10-26 16:22:11 -0700308 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700309 break;
310 case SP_FOREGROUND:
311 case SP_AUDIO_APP:
312 case SP_AUDIO_SYS:
313 fd = fg_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700314 boost_fd = fg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700315 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800316 case SP_TOP_APP :
317 fd = ta_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700318 boost_fd = ta_schedboost_fd;
Tim Murray6647bb52016-01-11 16:16:35 -0800319 break;
Tim Murray4284f9f2015-11-10 14:31:09 -0800320 case SP_SYSTEM:
321 fd = system_bg_cpuset_fd;
Tim Murray4284f9f2015-11-10 14:31:09 -0800322 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700323 default:
Todd Kjosba8a4752015-10-26 16:22:11 -0700324 boost_fd = fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700325 break;
326 }
327
328 if (add_tid_to_cgroup(tid, fd) != 0) {
329 if (errno != ESRCH && errno != ENOENT)
330 return -errno;
331 }
332
Isaac Chen795267d2017-02-16 11:47:33 +0800333 if (schedboost_enabled()) {
334 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
335 if (errno != ESRCH && errno != ENOENT)
336 return -errno;
337 }
Todd Kjosba8a4752015-10-26 16:22:11 -0700338 }
339
Tim Murray99910262015-06-22 14:00:56 -0700340 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700341}
342
Stephen Cranef5b8e342017-06-06 15:35:51 -0700343static void set_timerslack_ns(int tid, unsigned long slack) {
Elliott Hughesd7967c12016-08-03 15:11:01 -0700344 // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
345 // TODO: once we've backported this, log if the open(2) fails.
Erik Staatsd32331f2017-04-26 15:15:55 -0700346 if (__sys_supports_timerslack) {
347 char buf[64];
348 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
349 int fd = open(buf, O_WRONLY | O_CLOEXEC);
350 if (fd != -1) {
Stephen Cranef5b8e342017-06-06 15:35:51 -0700351 int len = snprintf(buf, sizeof(buf), "%lu", slack);
Erik Staatsd32331f2017-04-26 15:15:55 -0700352 if (write(fd, buf, len) != len) {
353 SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
354 }
355 close(fd);
356 return;
John Stultz2f13f0a2016-07-01 17:45:06 -0700357 }
Erik Staatsd32331f2017-04-26 15:15:55 -0700358 }
359
360 // TODO: Remove when /proc/<tid>/timerslack_ns interface is backported.
361 if ((tid == 0) || (tid == gettid())) {
362 if (prctl(PR_SET_TIMERSLACK, slack) == -1) {
363 SLOGE("set_timerslack_ns prctl failed: %s\n", strerror(errno));
364 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700365 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700366}
367
San Mehatc0dfca72009-10-27 11:52:55 -0700368int set_sched_policy(int tid, SchedPolicy policy)
369{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700370 if (tid == 0) {
371 tid = gettid();
372 }
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700373 policy = _policy(policy);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700374 pthread_once(&the_once, __initialize);
San Mehat493dad92009-09-12 10:06:57 -0700375
San Mehatd2e4e462009-10-29 11:48:00 -0700376#if POLICY_DEBUG
377 char statfile[64];
378 char statline[1024];
379 char thread_name[255];
San Mehatd2e4e462009-10-29 11:48:00 -0700380
Raja Ma2f37e42016-04-19 23:55:14 +0530381 snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
San Mehatd2e4e462009-10-29 11:48:00 -0700382 memset(thread_name, 0, sizeof(thread_name));
383
John Stultz2f13f0a2016-07-01 17:45:06 -0700384 int fd = open(statfile, O_RDONLY | O_CLOEXEC);
San Mehatd2e4e462009-10-29 11:48:00 -0700385 if (fd >= 0) {
386 int rc = read(fd, statline, 1023);
387 close(fd);
388 statline[rc] = 0;
389 char *p = statline;
390 char *q;
391
392 for (p = statline; *p != '('; p++);
393 p++;
394 for (q = p; *q != ')'; q++);
395
396 strncpy(thread_name, p, (q-p));
397 }
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700398 switch (policy) {
399 case SP_BACKGROUND:
San Mehat7e8529a2010-03-25 09:31:42 -0700400 SLOGD("vvv tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700401 break;
402 case SP_FOREGROUND:
Dima Zavin29319a62012-06-04 13:14:36 -0700403 case SP_AUDIO_APP:
404 case SP_AUDIO_SYS:
Tim Murray6647bb52016-01-11 16:16:35 -0800405 case SP_TOP_APP:
San Mehat7e8529a2010-03-25 09:31:42 -0700406 SLOGD("^^^ tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700407 break;
408 case SP_SYSTEM:
409 SLOGD("/// tid %d (%s)", tid, thread_name);
410 break;
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700411 default:
San Mehat7e8529a2010-03-25 09:31:42 -0700412 SLOGD("??? tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700413 break;
San Mehatd2e4e462009-10-29 11:48:00 -0700414 }
415#endif
416
Wei Wang40267982017-03-25 09:53:31 -0700417 if (schedboost_enabled()) {
Tim Murrayaa45cb82016-07-08 15:47:11 -0700418 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700419 switch (policy) {
420 case SP_BACKGROUND:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700421 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700422 break;
423 case SP_FOREGROUND:
424 case SP_AUDIO_APP:
425 case SP_AUDIO_SYS:
Tim Murray955694b2016-07-11 11:40:15 -0700426 boost_fd = fg_schedboost_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700427 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800428 case SP_TOP_APP:
Tim Murray955694b2016-07-11 11:40:15 -0700429 boost_fd = ta_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700430 break;
431 default:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700432 boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700433 break;
434 }
435
Wei Wang40267982017-03-25 09:53:31 -0700436 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
San Mehat493dad92009-09-12 10:06:57 -0700437 if (errno != ESRCH && errno != ENOENT)
438 return -errno;
439 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700440
San Mehat493dad92009-09-12 10:06:57 -0700441 }
442
Erik Staatsd32331f2017-04-26 15:15:55 -0700443 set_timerslack_ns(tid, policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG);
Ruchi Kandoi422852e2014-04-22 18:55:08 -0700444
San Mehat493dad92009-09-12 10:06:57 -0700445 return 0;
446}
Raphael0384a982009-09-15 17:10:17 -0700447
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700448#else
449
450/* Stubs for non-Android targets. */
451
Mark Salyzyn12717162014-04-29 15:49:14 -0700452int set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700453{
454 return 0;
455}
456
Mark Salyzyn12717162014-04-29 15:49:14 -0700457int get_sched_policy(int tid UNUSED, SchedPolicy *policy)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700458{
459 *policy = SP_SYSTEM_DEFAULT;
460 return 0;
461}
462
463#endif
464
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800465const char *get_sched_policy_name(SchedPolicy policy)
466{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700467 policy = _policy(policy);
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800468 static const char * const strings[SP_CNT] = {
469 [SP_BACKGROUND] = "bg",
470 [SP_FOREGROUND] = "fg",
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700471 [SP_SYSTEM] = " ",
472 [SP_AUDIO_APP] = "aa",
473 [SP_AUDIO_SYS] = "as",
Tim Murray6647bb52016-01-11 16:16:35 -0800474 [SP_TOP_APP] = "ta",
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800475 };
476 if ((policy < SP_CNT) && (strings[policy] != NULL))
477 return strings[policy];
478 else
479 return "error";
480}