blob: 5c5f3a563ec105dd478a9601a1b78aa3bdfefb48 [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
San Mehatc0dfca72009-10-27 11:52:55 -070054static int __sys_supports_schedgroups = -1;
John Reck2e336b12016-08-26 13:43:19 -070055static int __sys_supports_timerslack = -1;
San Mehatc0dfca72009-10-27 11:52:55 -070056
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070057// File descriptors open to /dev/cpuctl/../tasks, setup by initialize, or -1 on error.
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070058static int bg_cgroup_fd = -1;
Glenn Kasten10ec3c72012-04-19 15:25:58 -070059static int fg_cgroup_fd = -1;
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070060
Elliott Hughes919bb662015-07-24 20:28:31 -070061#ifdef USE_CPUSETS
Tim Murrayb769c8d2015-06-08 14:56:29 -070062// File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
Tim Murray4284f9f2015-11-10 14:31:09 -080063static int system_bg_cpuset_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -070064static int bg_cpuset_fd = -1;
65static int fg_cpuset_fd = -1;
Tim Murray6647bb52016-01-11 16:16:35 -080066static int ta_cpuset_fd = -1; // special cpuset for top app
Tim Murrayaa45cb82016-07-08 15:47:11 -070067#endif
68
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
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700109static void __initialize(void) {
110 char* filename;
John Reck2e336b12016-08-26 13:43:19 -0700111 if (!access("/dev/cpuctl/tasks", W_OK)) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700112 __sys_supports_schedgroups = 1;
113
114 filename = "/dev/cpuctl/tasks";
Jeff Brown5b878d22012-05-08 15:07:58 -0700115 fg_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700116 if (fg_cgroup_fd < 0) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700117 SLOGE("open of %s failed: %s\n", filename, strerror(errno));
San Mehat493dad92009-09-12 10:06:57 -0700118 }
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700119
Riley Andrews522d72b2014-10-03 17:02:53 -0700120 filename = "/dev/cpuctl/bg_non_interactive/tasks";
Jeff Brown5b878d22012-05-08 15:07:58 -0700121 bg_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700122 if (bg_cgroup_fd < 0) {
123 SLOGE("open of %s failed: %s\n", filename, strerror(errno));
124 }
125 } else {
126 __sys_supports_schedgroups = 0;
San Mehat493dad92009-09-12 10:06:57 -0700127 }
Tim Murrayb769c8d2015-06-08 14:56:29 -0700128
129#ifdef USE_CPUSETS
John Reck2e336b12016-08-26 13:43:19 -0700130 if (!access("/dev/cpuset/tasks", W_OK)) {
Tim Murrayb769c8d2015-06-08 14:56:29 -0700131
132 filename = "/dev/cpuset/foreground/tasks";
133 fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
134 filename = "/dev/cpuset/background/tasks";
135 bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray4284f9f2015-11-10 14:31:09 -0800136 filename = "/dev/cpuset/system-background/tasks";
137 system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray6647bb52016-01-11 16:16:35 -0800138 filename = "/dev/cpuset/top-app/tasks";
139 ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray4284f9f2015-11-10 14:31:09 -0800140
Todd Kjosba8a4752015-10-26 16:22:11 -0700141#ifdef USE_SCHEDBOOST
Tim Murray955694b2016-07-11 11:40:15 -0700142 filename = "/dev/stune/top-app/tasks";
143 ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
Todd Kjos11cde562016-02-23 09:00:36 -0800144 filename = "/dev/stune/foreground/tasks";
Todd Kjosba8a4752015-10-26 16:22:11 -0700145 fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray5dcff8f2016-07-11 13:57:31 -0700146 filename = "/dev/stune/background/tasks";
Todd Kjosba8a4752015-10-26 16:22:11 -0700147 bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
148#endif
Tim Murrayb769c8d2015-06-08 14:56:29 -0700149 }
150#endif
John Reck2e336b12016-08-26 13:43:19 -0700151
152 char buf[64];
153 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
154 __sys_supports_timerslack = !access(buf, W_OK);
San Mehatc0dfca72009-10-27 11:52:55 -0700155}
156
157/*
Martijn Coenen7b173a12016-04-04 17:11:56 +0200158 * Returns the path under the requested cgroup subsystem (if it exists)
San Mehatc0dfca72009-10-27 11:52:55 -0700159 *
San Mehat503df202010-03-02 17:09:56 -0800160 * The data from /proc/<pid>/cgroup looks (something) like:
San Mehatc0dfca72009-10-27 11:52:55 -0700161 * 2:cpu:/bg_non_interactive
San Mehat503df202010-03-02 17:09:56 -0800162 * 1:cpuacct:/
San Mehatc0dfca72009-10-27 11:52:55 -0700163 *
164 * We return the part after the "/", which will be an empty string for
165 * the default cgroup. If the string is longer than "bufLen", the string
166 * will be truncated.
167 */
Martijn Coenen7b173a12016-04-04 17:11:56 +0200168static int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
San Mehatc0dfca72009-10-27 11:52:55 -0700169{
Elliott Hughes9b828ad2015-07-30 08:47:35 -0700170#if defined(__ANDROID__)
San Mehatc0dfca72009-10-27 11:52:55 -0700171 char pathBuf[32];
San Mehat503df202010-03-02 17:09:56 -0800172 char lineBuf[256];
173 FILE *fp;
San Mehatc0dfca72009-10-27 11:52:55 -0700174
175 snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
John Stultz2f13f0a2016-07-01 17:45:06 -0700176 if (!(fp = fopen(pathBuf, "re"))) {
San Mehatc0dfca72009-10-27 11:52:55 -0700177 return -1;
178 }
179
San Mehat503df202010-03-02 17:09:56 -0800180 while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
181 char *next = lineBuf;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200182 char *found_subsys;
San Mehat503df202010-03-02 17:09:56 -0800183 char *grp;
184 size_t len;
San Mehatc0dfca72009-10-27 11:52:55 -0700185
San Mehat503df202010-03-02 17:09:56 -0800186 /* Junk the first field */
187 if (!strsep(&next, ":")) {
188 goto out_bad_data;
189 }
San Mehatc0dfca72009-10-27 11:52:55 -0700190
Martijn Coenen7b173a12016-04-04 17:11:56 +0200191 if (!(found_subsys = strsep(&next, ":"))) {
San Mehat503df202010-03-02 17:09:56 -0800192 goto out_bad_data;
193 }
194
Martijn Coenen7b173a12016-04-04 17:11:56 +0200195 if (strcmp(found_subsys, subsys)) {
San Mehat503df202010-03-02 17:09:56 -0800196 /* Not the subsys we're looking for */
197 continue;
198 }
199
200 if (!(grp = strsep(&next, ":"))) {
201 goto out_bad_data;
202 }
203 grp++; /* Drop the leading '/' */
204 len = strlen(grp);
205 grp[len-1] = '\0'; /* Drop the trailing '\n' */
206
207 if (bufLen <= len) {
208 len = bufLen - 1;
209 }
210 strncpy(buf, grp, len);
211 buf[len] = '\0';
212 fclose(fp);
213 return 0;
San Mehatc0dfca72009-10-27 11:52:55 -0700214 }
215
Martijn Coenen7b173a12016-04-04 17:11:56 +0200216 SLOGE("Failed to find subsys %s", subsys);
San Mehat503df202010-03-02 17:09:56 -0800217 fclose(fp);
218 return -1;
219 out_bad_data:
San Mehat7e8529a2010-03-25 09:31:42 -0700220 SLOGE("Bad cgroup data {%s}", lineBuf);
San Mehat503df202010-03-02 17:09:56 -0800221 fclose(fp);
222 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700223#else
224 errno = ENOSYS;
225 return -1;
226#endif
227}
228
229int get_sched_policy(int tid, SchedPolicy *policy)
230{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700231 if (tid == 0) {
232 tid = gettid();
233 }
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700234 pthread_once(&the_once, __initialize);
San Mehatc0dfca72009-10-27 11:52:55 -0700235
236 if (__sys_supports_schedgroups) {
237 char grpBuf[32];
Martijn Coenen7b173a12016-04-04 17:11:56 +0200238#ifdef USE_CPUSETS
239 if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0)
240 return -1;
241 if (grpBuf[0] == '\0') {
242 *policy = SP_FOREGROUND;
243 } else if (!strcmp(grpBuf, "foreground")) {
244 *policy = SP_FOREGROUND;
245 } else if (!strcmp(grpBuf, "background")) {
246 *policy = SP_BACKGROUND;
247 } else if (!strcmp(grpBuf, "top-app")) {
248 *policy = SP_TOP_APP;
249 } else {
250 errno = ERANGE;
251 return -1;
252 }
253#else
254 if (getCGroupSubsys(tid, "cpu", grpBuf, sizeof(grpBuf)) < 0)
San Mehatc0dfca72009-10-27 11:52:55 -0700255 return -1;
256 if (grpBuf[0] == '\0') {
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700257 *policy = SP_FOREGROUND;
Riley Andrews522d72b2014-10-03 17:02:53 -0700258 } else if (!strcmp(grpBuf, "bg_non_interactive")) {
259 *policy = SP_BACKGROUND;
San Mehatc0dfca72009-10-27 11:52:55 -0700260 } else {
261 errno = ERANGE;
262 return -1;
263 }
Martijn Coenen7b173a12016-04-04 17:11:56 +0200264#endif
San Mehatc0dfca72009-10-27 11:52:55 -0700265 } else {
266 int rc = sched_getscheduler(tid);
267 if (rc < 0)
268 return -1;
269 else if (rc == SCHED_NORMAL)
270 *policy = SP_FOREGROUND;
271 else if (rc == SCHED_BATCH)
272 *policy = SP_BACKGROUND;
273 else {
274 errno = ERANGE;
275 return -1;
276 }
277 }
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
284#ifndef USE_CPUSETS
285 return set_sched_policy(tid, policy);
286#else
287 if (tid == 0) {
288 tid = gettid();
289 }
290 policy = _policy(policy);
291 pthread_once(&the_once, __initialize);
292
Tim Murrayb43225e2015-11-18 16:42:44 -0800293 int fd = -1;
294 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700295 switch (policy) {
296 case SP_BACKGROUND:
297 fd = bg_cpuset_fd;
Todd Kjosba8a4752015-10-26 16:22:11 -0700298 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700299 break;
300 case SP_FOREGROUND:
301 case SP_AUDIO_APP:
302 case SP_AUDIO_SYS:
303 fd = fg_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700304 boost_fd = fg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700305 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800306 case SP_TOP_APP :
307 fd = ta_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700308 boost_fd = ta_schedboost_fd;
Tim Murray6647bb52016-01-11 16:16:35 -0800309 break;
Tim Murray4284f9f2015-11-10 14:31:09 -0800310 case SP_SYSTEM:
311 fd = system_bg_cpuset_fd;
Tim Murray4284f9f2015-11-10 14:31:09 -0800312 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700313 default:
Todd Kjosba8a4752015-10-26 16:22:11 -0700314 boost_fd = fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700315 break;
316 }
317
318 if (add_tid_to_cgroup(tid, fd) != 0) {
319 if (errno != ESRCH && errno != ENOENT)
320 return -errno;
321 }
322
Tim Murrayaa45cb82016-07-08 15:47:11 -0700323#ifdef USE_SCHEDBOOST
Todd Kjosba8a4752015-10-26 16:22:11 -0700324 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
325 if (errno != ESRCH && errno != ENOENT)
326 return -errno;
327 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700328#endif
Todd Kjosba8a4752015-10-26 16:22:11 -0700329
Tim Murray99910262015-06-22 14:00:56 -0700330 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700331#endif
332}
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
San Mehat493dad92009-09-12 10:06:57 -0700399 if (__sys_supports_schedgroups) {
Tim Murrayaa45cb82016-07-08 15:47:11 -0700400 int fd = -1;
401 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700402 switch (policy) {
403 case SP_BACKGROUND:
404 fd = bg_cgroup_fd;
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 Murrayaa45cb82016-07-08 15:47:11 -0700410 fd = fg_cgroup_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700411 boost_fd = fg_schedboost_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700412 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800413 case SP_TOP_APP:
Tim Murrayb769c8d2015-06-08 14:56:29 -0700414 fd = fg_cgroup_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700415 boost_fd = ta_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700416 break;
417 default:
418 fd = -1;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700419 boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700420 break;
421 }
422
423
424 if (add_tid_to_cgroup(tid, fd) != 0) {
San Mehat493dad92009-09-12 10:06:57 -0700425 if (errno != ESRCH && errno != ENOENT)
426 return -errno;
427 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700428
429#ifdef USE_SCHEDBOOST
430 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
431 if (errno != ESRCH && errno != ENOENT)
432 return -errno;
433 }
434#endif
San Mehat493dad92009-09-12 10:06:57 -0700435 } else {
436 struct sched_param param;
437
438 param.sched_priority = 0;
439 sched_setscheduler(tid,
440 (policy == SP_BACKGROUND) ?
Tim Murrayb769c8d2015-06-08 14:56:29 -0700441 SCHED_BATCH : SCHED_NORMAL,
San Mehat493dad92009-09-12 10:06:57 -0700442 &param);
443 }
444
John Reck2e336b12016-08-26 13:43:19 -0700445 if (__sys_supports_timerslack) {
446 set_timerslack_ns(tid, policy == SP_BACKGROUND ?
John Stultz2f13f0a2016-07-01 17:45:06 -0700447 TIMER_SLACK_BG : TIMER_SLACK_FG);
John Reck2e336b12016-08-26 13:43:19 -0700448 }
Ruchi Kandoi422852e2014-04-22 18:55:08 -0700449
San Mehat493dad92009-09-12 10:06:57 -0700450 return 0;
451}
Raphael0384a982009-09-15 17:10:17 -0700452
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700453#else
454
455/* Stubs for non-Android targets. */
456
Mark Salyzyn12717162014-04-29 15:49:14 -0700457int set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700458{
459 return 0;
460}
461
Mark Salyzyn12717162014-04-29 15:49:14 -0700462int get_sched_policy(int tid UNUSED, SchedPolicy *policy)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700463{
464 *policy = SP_SYSTEM_DEFAULT;
465 return 0;
466}
467
468#endif
469
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800470const char *get_sched_policy_name(SchedPolicy policy)
471{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700472 policy = _policy(policy);
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800473 static const char * const strings[SP_CNT] = {
474 [SP_BACKGROUND] = "bg",
475 [SP_FOREGROUND] = "fg",
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700476 [SP_SYSTEM] = " ",
477 [SP_AUDIO_APP] = "aa",
478 [SP_AUDIO_SYS] = "as",
Tim Murray6647bb52016-01-11 16:16:35 -0800479 [SP_TOP_APP] = "ta",
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800480 };
481 if ((policy < SP_CNT) && (strings[policy] != NULL))
482 return strings[policy];
483 else
484 return "error";
485}