blob: 73ca5180ee4834ae00b3964def1299a1f72f5604 [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;
265 } else if (!strcmp(grpBuf, "background")) {
266 *policy = SP_BACKGROUND;
267 } else if (!strcmp(grpBuf, "top-app")) {
268 *policy = SP_TOP_APP;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200269 } else {
Wei Wang40267982017-03-25 09:53:31 -0700270 errno = ERANGE;
271 return -1;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200272 }
San Mehatc0dfca72009-10-27 11:52:55 -0700273 } else {
Wei Wanga8d59fa2017-03-28 11:13:51 -0700274 // In b/34193533, we removed bg_non_interactive cgroup, so now
275 // all threads are in FOREGROUND cgroup
276 *policy = SP_FOREGROUND;
San Mehatc0dfca72009-10-27 11:52:55 -0700277 }
278 return 0;
279}
280
Tim Murrayb769c8d2015-06-08 14:56:29 -0700281int set_cpuset_policy(int tid, SchedPolicy policy)
282{
283 // in the absence of cpusets, use the old sched policy
Isaac Chen795267d2017-02-16 11:47:33 +0800284 if (!cpusets_enabled()) {
285 return set_sched_policy(tid, policy);
286 }
287
Tim Murrayb769c8d2015-06-08 14:56:29 -0700288 if (tid == 0) {
289 tid = gettid();
290 }
291 policy = _policy(policy);
292 pthread_once(&the_once, __initialize);
293
Tim Murrayb43225e2015-11-18 16:42:44 -0800294 int fd = -1;
295 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700296 switch (policy) {
297 case SP_BACKGROUND:
298 fd = bg_cpuset_fd;
Todd Kjosba8a4752015-10-26 16:22:11 -0700299 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700300 break;
301 case SP_FOREGROUND:
302 case SP_AUDIO_APP:
303 case SP_AUDIO_SYS:
304 fd = fg_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700305 boost_fd = fg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700306 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800307 case SP_TOP_APP :
308 fd = ta_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700309 boost_fd = ta_schedboost_fd;
Tim Murray6647bb52016-01-11 16:16:35 -0800310 break;
Tim Murray4284f9f2015-11-10 14:31:09 -0800311 case SP_SYSTEM:
312 fd = system_bg_cpuset_fd;
Tim Murray4284f9f2015-11-10 14:31:09 -0800313 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700314 default:
Todd Kjosba8a4752015-10-26 16:22:11 -0700315 boost_fd = fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700316 break;
317 }
318
319 if (add_tid_to_cgroup(tid, fd) != 0) {
320 if (errno != ESRCH && errno != ENOENT)
321 return -errno;
322 }
323
Isaac Chen795267d2017-02-16 11:47:33 +0800324 if (schedboost_enabled()) {
325 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
326 if (errno != ESRCH && errno != ENOENT)
327 return -errno;
328 }
Todd Kjosba8a4752015-10-26 16:22:11 -0700329 }
330
Tim Murray99910262015-06-22 14:00:56 -0700331 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700332}
333
John Stultz2f13f0a2016-07-01 17:45:06 -0700334static void set_timerslack_ns(int tid, unsigned long long slack) {
Elliott Hughesd7967c12016-08-03 15:11:01 -0700335 // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
336 // TODO: once we've backported this, log if the open(2) fails.
John Stultz2f13f0a2016-07-01 17:45:06 -0700337 char buf[64];
John Stultz2f13f0a2016-07-01 17:45:06 -0700338 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
339 int fd = open(buf, O_WRONLY | O_CLOEXEC);
340 if (fd != -1) {
341 int len = snprintf(buf, sizeof(buf), "%llu", slack);
342 if (write(fd, buf, len) != len) {
343 SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
344 }
345 close(fd);
346 return;
347 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700348}
349
San Mehatc0dfca72009-10-27 11:52:55 -0700350int set_sched_policy(int tid, SchedPolicy policy)
351{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700352 if (tid == 0) {
353 tid = gettid();
354 }
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700355 policy = _policy(policy);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700356 pthread_once(&the_once, __initialize);
San Mehat493dad92009-09-12 10:06:57 -0700357
San Mehatd2e4e462009-10-29 11:48:00 -0700358#if POLICY_DEBUG
359 char statfile[64];
360 char statline[1024];
361 char thread_name[255];
San Mehatd2e4e462009-10-29 11:48:00 -0700362
Raja Ma2f37e42016-04-19 23:55:14 +0530363 snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
San Mehatd2e4e462009-10-29 11:48:00 -0700364 memset(thread_name, 0, sizeof(thread_name));
365
John Stultz2f13f0a2016-07-01 17:45:06 -0700366 int fd = open(statfile, O_RDONLY | O_CLOEXEC);
San Mehatd2e4e462009-10-29 11:48:00 -0700367 if (fd >= 0) {
368 int rc = read(fd, statline, 1023);
369 close(fd);
370 statline[rc] = 0;
371 char *p = statline;
372 char *q;
373
374 for (p = statline; *p != '('; p++);
375 p++;
376 for (q = p; *q != ')'; q++);
377
378 strncpy(thread_name, p, (q-p));
379 }
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700380 switch (policy) {
381 case SP_BACKGROUND:
San Mehat7e8529a2010-03-25 09:31:42 -0700382 SLOGD("vvv tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700383 break;
384 case SP_FOREGROUND:
Dima Zavin29319a62012-06-04 13:14:36 -0700385 case SP_AUDIO_APP:
386 case SP_AUDIO_SYS:
Tim Murray6647bb52016-01-11 16:16:35 -0800387 case SP_TOP_APP:
San Mehat7e8529a2010-03-25 09:31:42 -0700388 SLOGD("^^^ tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700389 break;
390 case SP_SYSTEM:
391 SLOGD("/// tid %d (%s)", tid, thread_name);
392 break;
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700393 default:
San Mehat7e8529a2010-03-25 09:31:42 -0700394 SLOGD("??? tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700395 break;
San Mehatd2e4e462009-10-29 11:48:00 -0700396 }
397#endif
398
Wei Wang40267982017-03-25 09:53:31 -0700399 if (schedboost_enabled()) {
Tim Murrayaa45cb82016-07-08 15:47:11 -0700400 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700401 switch (policy) {
402 case SP_BACKGROUND:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700403 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700404 break;
405 case SP_FOREGROUND:
406 case SP_AUDIO_APP:
407 case SP_AUDIO_SYS:
Tim Murray955694b2016-07-11 11:40:15 -0700408 boost_fd = fg_schedboost_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700409 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800410 case SP_TOP_APP:
Tim Murray955694b2016-07-11 11:40:15 -0700411 boost_fd = ta_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700412 break;
413 default:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700414 boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700415 break;
416 }
417
Wei Wang40267982017-03-25 09:53:31 -0700418 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
San Mehat493dad92009-09-12 10:06:57 -0700419 if (errno != ESRCH && errno != ENOENT)
420 return -errno;
421 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700422
San Mehat493dad92009-09-12 10:06:57 -0700423 }
424
John Reck2e336b12016-08-26 13:43:19 -0700425 if (__sys_supports_timerslack) {
426 set_timerslack_ns(tid, policy == SP_BACKGROUND ?
John Stultz2f13f0a2016-07-01 17:45:06 -0700427 TIMER_SLACK_BG : TIMER_SLACK_FG);
John Reck2e336b12016-08-26 13:43:19 -0700428 }
Ruchi Kandoi422852e2014-04-22 18:55:08 -0700429
San Mehat493dad92009-09-12 10:06:57 -0700430 return 0;
431}
Raphael0384a982009-09-15 17:10:17 -0700432
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700433#else
434
435/* Stubs for non-Android targets. */
436
Mark Salyzyn12717162014-04-29 15:49:14 -0700437int set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700438{
439 return 0;
440}
441
Mark Salyzyn12717162014-04-29 15:49:14 -0700442int get_sched_policy(int tid UNUSED, SchedPolicy *policy)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700443{
444 *policy = SP_SYSTEM_DEFAULT;
445 return 0;
446}
447
448#endif
449
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800450const char *get_sched_policy_name(SchedPolicy policy)
451{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700452 policy = _policy(policy);
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800453 static const char * const strings[SP_CNT] = {
454 [SP_BACKGROUND] = "bg",
455 [SP_FOREGROUND] = "fg",
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700456 [SP_SYSTEM] = " ",
457 [SP_AUDIO_APP] = "aa",
458 [SP_AUDIO_SYS] = "as",
Tim Murray6647bb52016-01-11 16:16:35 -0800459 [SP_TOP_APP] = "ta",
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800460 };
461 if ((policy < SP_CNT) && (strings[policy] != NULL))
462 return strings[policy];
463 else
464 return "error";
465}