blob: 0d459cce183bf3f70dd9e9aec71e0d64c8cf60f9 [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 {
274 int rc = sched_getscheduler(tid);
275 if (rc < 0)
276 return -1;
277 else if (rc == SCHED_NORMAL)
278 *policy = SP_FOREGROUND;
279 else if (rc == SCHED_BATCH)
280 *policy = SP_BACKGROUND;
281 else {
282 errno = ERANGE;
283 return -1;
284 }
285 }
286 return 0;
287}
288
Tim Murrayb769c8d2015-06-08 14:56:29 -0700289int set_cpuset_policy(int tid, SchedPolicy policy)
290{
291 // in the absence of cpusets, use the old sched policy
Isaac Chen795267d2017-02-16 11:47:33 +0800292 if (!cpusets_enabled()) {
293 return set_sched_policy(tid, policy);
294 }
295
Tim Murrayb769c8d2015-06-08 14:56:29 -0700296 if (tid == 0) {
297 tid = gettid();
298 }
299 policy = _policy(policy);
300 pthread_once(&the_once, __initialize);
301
Tim Murrayb43225e2015-11-18 16:42:44 -0800302 int fd = -1;
303 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700304 switch (policy) {
305 case SP_BACKGROUND:
306 fd = bg_cpuset_fd;
Todd Kjosba8a4752015-10-26 16:22:11 -0700307 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700308 break;
309 case SP_FOREGROUND:
310 case SP_AUDIO_APP:
311 case SP_AUDIO_SYS:
312 fd = fg_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700313 boost_fd = fg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700314 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800315 case SP_TOP_APP :
316 fd = ta_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700317 boost_fd = ta_schedboost_fd;
Tim Murray6647bb52016-01-11 16:16:35 -0800318 break;
Tim Murray4284f9f2015-11-10 14:31:09 -0800319 case SP_SYSTEM:
320 fd = system_bg_cpuset_fd;
Tim Murray4284f9f2015-11-10 14:31:09 -0800321 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700322 default:
Todd Kjosba8a4752015-10-26 16:22:11 -0700323 boost_fd = fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700324 break;
325 }
326
327 if (add_tid_to_cgroup(tid, fd) != 0) {
328 if (errno != ESRCH && errno != ENOENT)
329 return -errno;
330 }
331
Isaac Chen795267d2017-02-16 11:47:33 +0800332 if (schedboost_enabled()) {
333 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
334 if (errno != ESRCH && errno != ENOENT)
335 return -errno;
336 }
Todd Kjosba8a4752015-10-26 16:22:11 -0700337 }
338
Tim Murray99910262015-06-22 14:00:56 -0700339 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700340}
341
John Stultz2f13f0a2016-07-01 17:45:06 -0700342static void set_timerslack_ns(int tid, unsigned long long slack) {
Elliott Hughesd7967c12016-08-03 15:11:01 -0700343 // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
344 // TODO: once we've backported this, log if the open(2) fails.
John Stultz2f13f0a2016-07-01 17:45:06 -0700345 char buf[64];
John Stultz2f13f0a2016-07-01 17:45:06 -0700346 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
347 int fd = open(buf, O_WRONLY | O_CLOEXEC);
348 if (fd != -1) {
349 int len = snprintf(buf, sizeof(buf), "%llu", slack);
350 if (write(fd, buf, len) != len) {
351 SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
352 }
353 close(fd);
354 return;
355 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700356}
357
San Mehatc0dfca72009-10-27 11:52:55 -0700358int set_sched_policy(int tid, SchedPolicy policy)
359{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700360 if (tid == 0) {
361 tid = gettid();
362 }
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700363 policy = _policy(policy);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700364 pthread_once(&the_once, __initialize);
San Mehat493dad92009-09-12 10:06:57 -0700365
San Mehatd2e4e462009-10-29 11:48:00 -0700366#if POLICY_DEBUG
367 char statfile[64];
368 char statline[1024];
369 char thread_name[255];
San Mehatd2e4e462009-10-29 11:48:00 -0700370
Raja Ma2f37e42016-04-19 23:55:14 +0530371 snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
San Mehatd2e4e462009-10-29 11:48:00 -0700372 memset(thread_name, 0, sizeof(thread_name));
373
John Stultz2f13f0a2016-07-01 17:45:06 -0700374 int fd = open(statfile, O_RDONLY | O_CLOEXEC);
San Mehatd2e4e462009-10-29 11:48:00 -0700375 if (fd >= 0) {
376 int rc = read(fd, statline, 1023);
377 close(fd);
378 statline[rc] = 0;
379 char *p = statline;
380 char *q;
381
382 for (p = statline; *p != '('; p++);
383 p++;
384 for (q = p; *q != ')'; q++);
385
386 strncpy(thread_name, p, (q-p));
387 }
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700388 switch (policy) {
389 case SP_BACKGROUND:
San Mehat7e8529a2010-03-25 09:31:42 -0700390 SLOGD("vvv tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700391 break;
392 case SP_FOREGROUND:
Dima Zavin29319a62012-06-04 13:14:36 -0700393 case SP_AUDIO_APP:
394 case SP_AUDIO_SYS:
Tim Murray6647bb52016-01-11 16:16:35 -0800395 case SP_TOP_APP:
San Mehat7e8529a2010-03-25 09:31:42 -0700396 SLOGD("^^^ tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700397 break;
398 case SP_SYSTEM:
399 SLOGD("/// tid %d (%s)", tid, thread_name);
400 break;
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700401 default:
San Mehat7e8529a2010-03-25 09:31:42 -0700402 SLOGD("??? tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700403 break;
San Mehatd2e4e462009-10-29 11:48:00 -0700404 }
405#endif
406
Wei Wang40267982017-03-25 09:53:31 -0700407 if (schedboost_enabled()) {
Tim Murrayaa45cb82016-07-08 15:47:11 -0700408 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700409 switch (policy) {
410 case SP_BACKGROUND:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700411 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700412 break;
413 case SP_FOREGROUND:
414 case SP_AUDIO_APP:
415 case SP_AUDIO_SYS:
Tim Murray955694b2016-07-11 11:40:15 -0700416 boost_fd = fg_schedboost_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700417 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800418 case SP_TOP_APP:
Tim Murray955694b2016-07-11 11:40:15 -0700419 boost_fd = ta_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700420 break;
421 default:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700422 boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700423 break;
424 }
425
Wei Wang40267982017-03-25 09:53:31 -0700426 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
San Mehat493dad92009-09-12 10:06:57 -0700427 if (errno != ESRCH && errno != ENOENT)
428 return -errno;
429 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700430
San Mehat493dad92009-09-12 10:06:57 -0700431 } else {
432 struct sched_param param;
433
434 param.sched_priority = 0;
435 sched_setscheduler(tid,
436 (policy == SP_BACKGROUND) ?
Tim Murrayb769c8d2015-06-08 14:56:29 -0700437 SCHED_BATCH : SCHED_NORMAL,
San Mehat493dad92009-09-12 10:06:57 -0700438 &param);
439 }
440
John Reck2e336b12016-08-26 13:43:19 -0700441 if (__sys_supports_timerslack) {
442 set_timerslack_ns(tid, policy == SP_BACKGROUND ?
John Stultz2f13f0a2016-07-01 17:45:06 -0700443 TIMER_SLACK_BG : TIMER_SLACK_FG);
John Reck2e336b12016-08-26 13:43:19 -0700444 }
Ruchi Kandoi422852e2014-04-22 18:55:08 -0700445
San Mehat493dad92009-09-12 10:06:57 -0700446 return 0;
447}
Raphael0384a982009-09-15 17:10:17 -0700448
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700449#else
450
451/* Stubs for non-Android targets. */
452
Mark Salyzyn12717162014-04-29 15:49:14 -0700453int set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700454{
455 return 0;
456}
457
Mark Salyzyn12717162014-04-29 15:49:14 -0700458int get_sched_policy(int tid UNUSED, SchedPolicy *policy)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700459{
460 *policy = SP_SYSTEM_DEFAULT;
461 return 0;
462}
463
464#endif
465
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800466const char *get_sched_policy_name(SchedPolicy policy)
467{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700468 policy = _policy(policy);
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800469 static const char * const strings[SP_CNT] = {
470 [SP_BACKGROUND] = "bg",
471 [SP_FOREGROUND] = "fg",
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700472 [SP_SYSTEM] = " ",
473 [SP_AUDIO_APP] = "aa",
474 [SP_AUDIO_SYS] = "as",
Tim Murray6647bb52016-01-11 16:16:35 -0800475 [SP_TOP_APP] = "ta",
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800476 };
477 if ((policy < SP_CNT) && (strings[policy] != NULL))
478 return strings[policy];
479 else
480 return "error";
481}