blob: 7e385355fcc675ca2bca791805fc7e26a767baa6 [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
139 CONFIG_SCHEDTUNE that's in Android common Linux kernel and Linaro
140 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}