blob: a9c061efb005703f341071de116b4b55e118fdd3 [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;
Tim Murrayb769c8d2015-06-08 14:56:29 -070066
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070067/* Add tid to the scheduling group defined by the policy */
Tim Murrayb769c8d2015-06-08 14:56:29 -070068static int add_tid_to_cgroup(int tid, int fd)
San Mehat493dad92009-09-12 10:06:57 -070069{
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070070 if (fd < 0) {
Tim Murrayb769c8d2015-06-08 14:56:29 -070071 SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd);
72 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -070073 return -1;
San Mehat805d67a2009-10-29 13:56:26 -070074 }
San Mehat493dad92009-09-12 10:06:57 -070075
Brad Fitzpatrick253e27a2010-05-06 10:00:37 -070076 // specialized itoa -- works for tid > 0
77 char text[22];
78 char *end = text + sizeof(text) - 1;
79 char *ptr = end;
80 *ptr = '\0';
81 while (tid > 0) {
82 *--ptr = '0' + (tid % 10);
83 tid = tid / 10;
84 }
85
86 if (write(fd, ptr, end - ptr) < 0) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070087 /*
88 * If the thread is in the process of exiting,
89 * don't flag an error
90 */
91 if (errno == ESRCH)
92 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -070093 SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n",
94 ptr, strerror(errno), fd);
95 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -070096 return -1;
97 }
98
San Mehat493dad92009-09-12 10:06:57 -070099 return 0;
100}
101
Isaac Chen795267d2017-02-16 11:47:33 +0800102/*
103 If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under
104 /dev/cpuset mounted in init.rc; otherwise, that file does not exist
105 even though the directory, /dev/cpuset, is still created (by init.rc).
106
107 A couple of other candidates (under cpuset mount directory):
108 notify_on_release
109 release_agent
110
111 Yet another way to decide if cpuset is enabled is to parse
112 /proc/self/status and search for lines begin with "Mems_allowed".
113
114 If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can
115 be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency
116 on where init.rc mounts cpuset. That's why we'd better require this
117 configuration be set if CONFIG_CPUSETS is set.
118
119 With runtime check using the following function, build time
120 variables like ENABLE_CPUSETS (used in Android.mk) or cpusets (used
121 in Android.bp) are not needed.
122 */
123
124bool cpusets_enabled() {
125 static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0);
126
127 return enabled;
128}
129
130/*
131 Similar to CONFIG_CPUSETS above, but with a different configuration
132 CONFIG_SCHEDTUNE that's in Android common Linux kernel and Linaro
133 Stable Kernel (LSK), but not in mainline Linux as of v4.9.
134
135 With runtime check using the following function, build time
136 variables like ENABLE_SCHEDBOOST (used in Android.mk) or schedboost
137 (used in Android.bp) are not needed.
138
139 */
140
141bool schedboost_enabled() {
142 static bool enabled = (access("/dev/stune/tasks", F_OK) == 0);
143
144 return enabled;
145}
146
147static void __initialize() {
148 const char* filename;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700149
Isaac Chen795267d2017-02-16 11:47:33 +0800150 if (cpusets_enabled()) {
151 if (!access("/dev/cpuset/tasks", W_OK)) {
Tim Murrayb769c8d2015-06-08 14:56:29 -0700152
Isaac Chen795267d2017-02-16 11:47:33 +0800153 filename = "/dev/cpuset/foreground/tasks";
154 fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
155 filename = "/dev/cpuset/background/tasks";
156 bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
157 filename = "/dev/cpuset/system-background/tasks";
158 system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
159 filename = "/dev/cpuset/top-app/tasks";
160 ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray4284f9f2015-11-10 14:31:09 -0800161
Isaac Chen795267d2017-02-16 11:47:33 +0800162 if (schedboost_enabled()) {
163 filename = "/dev/stune/top-app/tasks";
164 ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
165 filename = "/dev/stune/foreground/tasks";
166 fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
167 filename = "/dev/stune/background/tasks";
168 bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
169 }
170 }
Tim Murrayb769c8d2015-06-08 14:56:29 -0700171 }
John Reck2e336b12016-08-26 13:43:19 -0700172
173 char buf[64];
174 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
175 __sys_supports_timerslack = !access(buf, W_OK);
San Mehatc0dfca72009-10-27 11:52:55 -0700176}
177
178/*
Martijn Coenen7b173a12016-04-04 17:11:56 +0200179 * Returns the path under the requested cgroup subsystem (if it exists)
San Mehatc0dfca72009-10-27 11:52:55 -0700180 *
San Mehat503df202010-03-02 17:09:56 -0800181 * The data from /proc/<pid>/cgroup looks (something) like:
San Mehatc0dfca72009-10-27 11:52:55 -0700182 * 2:cpu:/bg_non_interactive
San Mehat503df202010-03-02 17:09:56 -0800183 * 1:cpuacct:/
San Mehatc0dfca72009-10-27 11:52:55 -0700184 *
185 * We return the part after the "/", which will be an empty string for
186 * the default cgroup. If the string is longer than "bufLen", the string
187 * will be truncated.
188 */
Martijn Coenen7b173a12016-04-04 17:11:56 +0200189static int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
San Mehatc0dfca72009-10-27 11:52:55 -0700190{
Elliott Hughes9b828ad2015-07-30 08:47:35 -0700191#if defined(__ANDROID__)
San Mehatc0dfca72009-10-27 11:52:55 -0700192 char pathBuf[32];
San Mehat503df202010-03-02 17:09:56 -0800193 char lineBuf[256];
194 FILE *fp;
San Mehatc0dfca72009-10-27 11:52:55 -0700195
196 snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
John Stultz2f13f0a2016-07-01 17:45:06 -0700197 if (!(fp = fopen(pathBuf, "re"))) {
San Mehatc0dfca72009-10-27 11:52:55 -0700198 return -1;
199 }
200
San Mehat503df202010-03-02 17:09:56 -0800201 while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
202 char *next = lineBuf;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200203 char *found_subsys;
San Mehat503df202010-03-02 17:09:56 -0800204 char *grp;
205 size_t len;
San Mehatc0dfca72009-10-27 11:52:55 -0700206
San Mehat503df202010-03-02 17:09:56 -0800207 /* Junk the first field */
208 if (!strsep(&next, ":")) {
209 goto out_bad_data;
210 }
San Mehatc0dfca72009-10-27 11:52:55 -0700211
Martijn Coenen7b173a12016-04-04 17:11:56 +0200212 if (!(found_subsys = strsep(&next, ":"))) {
San Mehat503df202010-03-02 17:09:56 -0800213 goto out_bad_data;
214 }
215
Martijn Coenen7b173a12016-04-04 17:11:56 +0200216 if (strcmp(found_subsys, subsys)) {
San Mehat503df202010-03-02 17:09:56 -0800217 /* Not the subsys we're looking for */
218 continue;
219 }
220
221 if (!(grp = strsep(&next, ":"))) {
222 goto out_bad_data;
223 }
224 grp++; /* Drop the leading '/' */
225 len = strlen(grp);
226 grp[len-1] = '\0'; /* Drop the trailing '\n' */
227
228 if (bufLen <= len) {
229 len = bufLen - 1;
230 }
231 strncpy(buf, grp, len);
232 buf[len] = '\0';
233 fclose(fp);
234 return 0;
San Mehatc0dfca72009-10-27 11:52:55 -0700235 }
236
Martijn Coenen7b173a12016-04-04 17:11:56 +0200237 SLOGE("Failed to find subsys %s", subsys);
San Mehat503df202010-03-02 17:09:56 -0800238 fclose(fp);
239 return -1;
240 out_bad_data:
San Mehat7e8529a2010-03-25 09:31:42 -0700241 SLOGE("Bad cgroup data {%s}", lineBuf);
San Mehat503df202010-03-02 17:09:56 -0800242 fclose(fp);
243 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700244#else
245 errno = ENOSYS;
246 return -1;
247#endif
248}
249
250int get_sched_policy(int tid, SchedPolicy *policy)
251{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700252 if (tid == 0) {
253 tid = gettid();
254 }
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700255 pthread_once(&the_once, __initialize);
San Mehatc0dfca72009-10-27 11:52:55 -0700256
Wei Wang40267982017-03-25 09:53:31 -0700257 char grpBuf[32];
Isaac Chen795267d2017-02-16 11:47:33 +0800258
Wei Wang40267982017-03-25 09:53:31 -0700259 if (cpusets_enabled()) {
260 if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0) return -1;
261 if (grpBuf[0] == '\0') {
262 *policy = SP_FOREGROUND;
263 } else if (!strcmp(grpBuf, "foreground")) {
264 *policy = SP_FOREGROUND;
Ganesh Mahendran6748f242017-04-12 16:25:25 +0800265 } else if (!strcmp(grpBuf, "system-background")) {
266 *policy = SP_SYSTEM;
Wei Wang40267982017-03-25 09:53:31 -0700267 } else if (!strcmp(grpBuf, "background")) {
268 *policy = SP_BACKGROUND;
269 } else if (!strcmp(grpBuf, "top-app")) {
270 *policy = SP_TOP_APP;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200271 } else {
Wei Wang40267982017-03-25 09:53:31 -0700272 errno = ERANGE;
273 return -1;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200274 }
San Mehatc0dfca72009-10-27 11:52:55 -0700275 } else {
Wei Wanga8d59fa2017-03-28 11:13:51 -0700276 // In b/34193533, we removed bg_non_interactive cgroup, so now
277 // all threads are in FOREGROUND cgroup
278 *policy = SP_FOREGROUND;
San Mehatc0dfca72009-10-27 11:52:55 -0700279 }
280 return 0;
281}
282
Tim Murrayb769c8d2015-06-08 14:56:29 -0700283int set_cpuset_policy(int tid, SchedPolicy policy)
284{
285 // in the absence of cpusets, use the old sched policy
Isaac Chen795267d2017-02-16 11:47:33 +0800286 if (!cpusets_enabled()) {
287 return set_sched_policy(tid, policy);
288 }
289
Tim Murrayb769c8d2015-06-08 14:56:29 -0700290 if (tid == 0) {
291 tid = gettid();
292 }
293 policy = _policy(policy);
294 pthread_once(&the_once, __initialize);
295
Tim Murrayb43225e2015-11-18 16:42:44 -0800296 int fd = -1;
297 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700298 switch (policy) {
299 case SP_BACKGROUND:
300 fd = bg_cpuset_fd;
Todd Kjosba8a4752015-10-26 16:22:11 -0700301 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700302 break;
303 case SP_FOREGROUND:
304 case SP_AUDIO_APP:
305 case SP_AUDIO_SYS:
306 fd = fg_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700307 boost_fd = fg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700308 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800309 case SP_TOP_APP :
310 fd = ta_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700311 boost_fd = ta_schedboost_fd;
Tim Murray6647bb52016-01-11 16:16:35 -0800312 break;
Tim Murray4284f9f2015-11-10 14:31:09 -0800313 case SP_SYSTEM:
314 fd = system_bg_cpuset_fd;
Tim Murray4284f9f2015-11-10 14:31:09 -0800315 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700316 default:
Todd Kjosba8a4752015-10-26 16:22:11 -0700317 boost_fd = fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700318 break;
319 }
320
321 if (add_tid_to_cgroup(tid, fd) != 0) {
322 if (errno != ESRCH && errno != ENOENT)
323 return -errno;
324 }
325
Isaac Chen795267d2017-02-16 11:47:33 +0800326 if (schedboost_enabled()) {
327 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
328 if (errno != ESRCH && errno != ENOENT)
329 return -errno;
330 }
Todd Kjosba8a4752015-10-26 16:22:11 -0700331 }
332
Tim Murray99910262015-06-22 14:00:56 -0700333 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700334}
335
John Stultz2f13f0a2016-07-01 17:45:06 -0700336static void set_timerslack_ns(int tid, unsigned long long slack) {
Elliott Hughesd7967c12016-08-03 15:11:01 -0700337 // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
338 // TODO: once we've backported this, log if the open(2) fails.
John Stultz2f13f0a2016-07-01 17:45:06 -0700339 char buf[64];
John Stultz2f13f0a2016-07-01 17:45:06 -0700340 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
341 int fd = open(buf, O_WRONLY | O_CLOEXEC);
342 if (fd != -1) {
343 int len = snprintf(buf, sizeof(buf), "%llu", slack);
344 if (write(fd, buf, len) != len) {
345 SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
346 }
347 close(fd);
348 return;
349 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700350}
351
San Mehatc0dfca72009-10-27 11:52:55 -0700352int set_sched_policy(int tid, SchedPolicy policy)
353{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700354 if (tid == 0) {
355 tid = gettid();
356 }
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700357 policy = _policy(policy);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700358 pthread_once(&the_once, __initialize);
San Mehat493dad92009-09-12 10:06:57 -0700359
San Mehatd2e4e462009-10-29 11:48:00 -0700360#if POLICY_DEBUG
361 char statfile[64];
362 char statline[1024];
363 char thread_name[255];
San Mehatd2e4e462009-10-29 11:48:00 -0700364
Raja Ma2f37e42016-04-19 23:55:14 +0530365 snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
San Mehatd2e4e462009-10-29 11:48:00 -0700366 memset(thread_name, 0, sizeof(thread_name));
367
John Stultz2f13f0a2016-07-01 17:45:06 -0700368 int fd = open(statfile, O_RDONLY | O_CLOEXEC);
San Mehatd2e4e462009-10-29 11:48:00 -0700369 if (fd >= 0) {
370 int rc = read(fd, statline, 1023);
371 close(fd);
372 statline[rc] = 0;
373 char *p = statline;
374 char *q;
375
376 for (p = statline; *p != '('; p++);
377 p++;
378 for (q = p; *q != ')'; q++);
379
380 strncpy(thread_name, p, (q-p));
381 }
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700382 switch (policy) {
383 case SP_BACKGROUND:
San Mehat7e8529a2010-03-25 09:31:42 -0700384 SLOGD("vvv tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700385 break;
386 case SP_FOREGROUND:
Dima Zavin29319a62012-06-04 13:14:36 -0700387 case SP_AUDIO_APP:
388 case SP_AUDIO_SYS:
Tim Murray6647bb52016-01-11 16:16:35 -0800389 case SP_TOP_APP:
San Mehat7e8529a2010-03-25 09:31:42 -0700390 SLOGD("^^^ tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700391 break;
392 case SP_SYSTEM:
393 SLOGD("/// tid %d (%s)", tid, thread_name);
394 break;
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700395 default:
San Mehat7e8529a2010-03-25 09:31:42 -0700396 SLOGD("??? tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700397 break;
San Mehatd2e4e462009-10-29 11:48:00 -0700398 }
399#endif
400
Wei Wang40267982017-03-25 09:53:31 -0700401 if (schedboost_enabled()) {
Tim Murrayaa45cb82016-07-08 15:47:11 -0700402 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700403 switch (policy) {
404 case SP_BACKGROUND:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700405 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700406 break;
407 case SP_FOREGROUND:
408 case SP_AUDIO_APP:
409 case SP_AUDIO_SYS:
Tim Murray955694b2016-07-11 11:40:15 -0700410 boost_fd = fg_schedboost_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700411 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800412 case SP_TOP_APP:
Tim Murray955694b2016-07-11 11:40:15 -0700413 boost_fd = ta_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700414 break;
415 default:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700416 boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700417 break;
418 }
419
Wei Wang40267982017-03-25 09:53:31 -0700420 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
San Mehat493dad92009-09-12 10:06:57 -0700421 if (errno != ESRCH && errno != ENOENT)
422 return -errno;
423 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700424
San Mehat493dad92009-09-12 10:06:57 -0700425 }
426
John Reck2e336b12016-08-26 13:43:19 -0700427 if (__sys_supports_timerslack) {
428 set_timerslack_ns(tid, policy == SP_BACKGROUND ?
John Stultz2f13f0a2016-07-01 17:45:06 -0700429 TIMER_SLACK_BG : TIMER_SLACK_FG);
John Reck2e336b12016-08-26 13:43:19 -0700430 }
Ruchi Kandoi422852e2014-04-22 18:55:08 -0700431
San Mehat493dad92009-09-12 10:06:57 -0700432 return 0;
433}
Raphael0384a982009-09-15 17:10:17 -0700434
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700435#else
436
437/* Stubs for non-Android targets. */
438
Mark Salyzyn12717162014-04-29 15:49:14 -0700439int set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700440{
441 return 0;
442}
443
Mark Salyzyn12717162014-04-29 15:49:14 -0700444int get_sched_policy(int tid UNUSED, SchedPolicy *policy)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700445{
446 *policy = SP_SYSTEM_DEFAULT;
447 return 0;
448}
449
450#endif
451
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800452const char *get_sched_policy_name(SchedPolicy policy)
453{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700454 policy = _policy(policy);
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800455 static const char * const strings[SP_CNT] = {
456 [SP_BACKGROUND] = "bg",
457 [SP_FOREGROUND] = "fg",
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700458 [SP_SYSTEM] = " ",
459 [SP_AUDIO_APP] = "aa",
460 [SP_AUDIO_SYS] = "as",
Tim Murray6647bb52016-01-11 16:16:35 -0800461 [SP_TOP_APP] = "ta",
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800462 };
463 if ((policy < SP_CNT) && (strings[policy] != NULL))
464 return strings[policy];
465 else
466 return "error";
467}