blob: 7e3ad593ec250ecd43991f7300e6156a12e1e8f3 [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
Tim Murrayb769c8d2015-06-08 14:56:29 -070061// File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
Tim Murray4284f9f2015-11-10 14:31:09 -080062static int system_bg_cpuset_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -070063static int bg_cpuset_fd = -1;
64static int fg_cpuset_fd = -1;
Tim Murray6647bb52016-01-11 16:16:35 -080065static int ta_cpuset_fd = -1; // special cpuset for top app
Tim Murrayaa45cb82016-07-08 15:47:11 -070066
67// File descriptors open to /dev/stune/../tasks, setup by initialize, or -1 on error
Todd Kjosba8a4752015-10-26 16:22:11 -070068static int bg_schedboost_fd = -1;
69static int fg_schedboost_fd = -1;
Tim Murray955694b2016-07-11 11:40:15 -070070static int ta_schedboost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -070071
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070072/* Add tid to the scheduling group defined by the policy */
Tim Murrayb769c8d2015-06-08 14:56:29 -070073static int add_tid_to_cgroup(int tid, int fd)
San Mehat493dad92009-09-12 10:06:57 -070074{
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070075 if (fd < 0) {
Tim Murrayb769c8d2015-06-08 14:56:29 -070076 SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd);
77 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -070078 return -1;
San Mehat805d67a2009-10-29 13:56:26 -070079 }
San Mehat493dad92009-09-12 10:06:57 -070080
Brad Fitzpatrick253e27a2010-05-06 10:00:37 -070081 // specialized itoa -- works for tid > 0
82 char text[22];
83 char *end = text + sizeof(text) - 1;
84 char *ptr = end;
85 *ptr = '\0';
86 while (tid > 0) {
87 *--ptr = '0' + (tid % 10);
88 tid = tid / 10;
89 }
90
91 if (write(fd, ptr, end - ptr) < 0) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -070092 /*
93 * If the thread is in the process of exiting,
94 * don't flag an error
95 */
96 if (errno == ESRCH)
97 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -070098 SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n",
99 ptr, strerror(errno), fd);
100 errno = EINVAL;
San Mehat493dad92009-09-12 10:06:57 -0700101 return -1;
102 }
103
San Mehat493dad92009-09-12 10:06:57 -0700104 return 0;
105}
106
Isaac Chen795267d2017-02-16 11:47:33 +0800107/*
108 If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under
109 /dev/cpuset mounted in init.rc; otherwise, that file does not exist
110 even though the directory, /dev/cpuset, is still created (by init.rc).
111
112 A couple of other candidates (under cpuset mount directory):
113 notify_on_release
114 release_agent
115
116 Yet another way to decide if cpuset is enabled is to parse
117 /proc/self/status and search for lines begin with "Mems_allowed".
118
119 If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can
120 be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency
121 on where init.rc mounts cpuset. That's why we'd better require this
122 configuration be set if CONFIG_CPUSETS is set.
123
124 With runtime check using the following function, build time
125 variables like ENABLE_CPUSETS (used in Android.mk) or cpusets (used
126 in Android.bp) are not needed.
127 */
128
129bool cpusets_enabled() {
130 static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0);
131
132 return enabled;
133}
134
135/*
136 Similar to CONFIG_CPUSETS above, but with a different configuration
137 CONFIG_SCHEDTUNE that's in Android common Linux kernel and Linaro
138 Stable Kernel (LSK), but not in mainline Linux as of v4.9.
139
140 With runtime check using the following function, build time
141 variables like ENABLE_SCHEDBOOST (used in Android.mk) or schedboost
142 (used in Android.bp) are not needed.
143
144 */
145
146bool schedboost_enabled() {
147 static bool enabled = (access("/dev/stune/tasks", F_OK) == 0);
148
149 return enabled;
150}
151
152static void __initialize() {
153 const char* filename;
John Reck2e336b12016-08-26 13:43:19 -0700154 if (!access("/dev/cpuctl/tasks", W_OK)) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700155 __sys_supports_schedgroups = 1;
156
157 filename = "/dev/cpuctl/tasks";
Jeff Brown5b878d22012-05-08 15:07:58 -0700158 fg_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700159 if (fg_cgroup_fd < 0) {
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700160 SLOGE("open of %s failed: %s\n", filename, strerror(errno));
San Mehat493dad92009-09-12 10:06:57 -0700161 }
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700162
Riley Andrews522d72b2014-10-03 17:02:53 -0700163 filename = "/dev/cpuctl/bg_non_interactive/tasks";
Jeff Brown5b878d22012-05-08 15:07:58 -0700164 bg_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700165 if (bg_cgroup_fd < 0) {
166 SLOGE("open of %s failed: %s\n", filename, strerror(errno));
167 }
168 } else {
169 __sys_supports_schedgroups = 0;
San Mehat493dad92009-09-12 10:06:57 -0700170 }
Tim Murrayb769c8d2015-06-08 14:56:29 -0700171
Isaac Chen795267d2017-02-16 11:47:33 +0800172 if (cpusets_enabled()) {
173 if (!access("/dev/cpuset/tasks", W_OK)) {
Tim Murrayb769c8d2015-06-08 14:56:29 -0700174
Isaac Chen795267d2017-02-16 11:47:33 +0800175 filename = "/dev/cpuset/foreground/tasks";
176 fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
177 filename = "/dev/cpuset/background/tasks";
178 bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
179 filename = "/dev/cpuset/system-background/tasks";
180 system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
181 filename = "/dev/cpuset/top-app/tasks";
182 ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
Tim Murray4284f9f2015-11-10 14:31:09 -0800183
Isaac Chen795267d2017-02-16 11:47:33 +0800184 if (schedboost_enabled()) {
185 filename = "/dev/stune/top-app/tasks";
186 ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
187 filename = "/dev/stune/foreground/tasks";
188 fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
189 filename = "/dev/stune/background/tasks";
190 bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
191 }
192 }
Tim Murrayb769c8d2015-06-08 14:56:29 -0700193 }
John Reck2e336b12016-08-26 13:43:19 -0700194
195 char buf[64];
196 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
197 __sys_supports_timerslack = !access(buf, W_OK);
San Mehatc0dfca72009-10-27 11:52:55 -0700198}
199
200/*
Martijn Coenen7b173a12016-04-04 17:11:56 +0200201 * Returns the path under the requested cgroup subsystem (if it exists)
San Mehatc0dfca72009-10-27 11:52:55 -0700202 *
San Mehat503df202010-03-02 17:09:56 -0800203 * The data from /proc/<pid>/cgroup looks (something) like:
San Mehatc0dfca72009-10-27 11:52:55 -0700204 * 2:cpu:/bg_non_interactive
San Mehat503df202010-03-02 17:09:56 -0800205 * 1:cpuacct:/
San Mehatc0dfca72009-10-27 11:52:55 -0700206 *
207 * We return the part after the "/", which will be an empty string for
208 * the default cgroup. If the string is longer than "bufLen", the string
209 * will be truncated.
210 */
Martijn Coenen7b173a12016-04-04 17:11:56 +0200211static int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
San Mehatc0dfca72009-10-27 11:52:55 -0700212{
Elliott Hughes9b828ad2015-07-30 08:47:35 -0700213#if defined(__ANDROID__)
San Mehatc0dfca72009-10-27 11:52:55 -0700214 char pathBuf[32];
San Mehat503df202010-03-02 17:09:56 -0800215 char lineBuf[256];
216 FILE *fp;
San Mehatc0dfca72009-10-27 11:52:55 -0700217
218 snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
John Stultz2f13f0a2016-07-01 17:45:06 -0700219 if (!(fp = fopen(pathBuf, "re"))) {
San Mehatc0dfca72009-10-27 11:52:55 -0700220 return -1;
221 }
222
San Mehat503df202010-03-02 17:09:56 -0800223 while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
224 char *next = lineBuf;
Martijn Coenen7b173a12016-04-04 17:11:56 +0200225 char *found_subsys;
San Mehat503df202010-03-02 17:09:56 -0800226 char *grp;
227 size_t len;
San Mehatc0dfca72009-10-27 11:52:55 -0700228
San Mehat503df202010-03-02 17:09:56 -0800229 /* Junk the first field */
230 if (!strsep(&next, ":")) {
231 goto out_bad_data;
232 }
San Mehatc0dfca72009-10-27 11:52:55 -0700233
Martijn Coenen7b173a12016-04-04 17:11:56 +0200234 if (!(found_subsys = strsep(&next, ":"))) {
San Mehat503df202010-03-02 17:09:56 -0800235 goto out_bad_data;
236 }
237
Martijn Coenen7b173a12016-04-04 17:11:56 +0200238 if (strcmp(found_subsys, subsys)) {
San Mehat503df202010-03-02 17:09:56 -0800239 /* Not the subsys we're looking for */
240 continue;
241 }
242
243 if (!(grp = strsep(&next, ":"))) {
244 goto out_bad_data;
245 }
246 grp++; /* Drop the leading '/' */
247 len = strlen(grp);
248 grp[len-1] = '\0'; /* Drop the trailing '\n' */
249
250 if (bufLen <= len) {
251 len = bufLen - 1;
252 }
253 strncpy(buf, grp, len);
254 buf[len] = '\0';
255 fclose(fp);
256 return 0;
San Mehatc0dfca72009-10-27 11:52:55 -0700257 }
258
Martijn Coenen7b173a12016-04-04 17:11:56 +0200259 SLOGE("Failed to find subsys %s", subsys);
San Mehat503df202010-03-02 17:09:56 -0800260 fclose(fp);
261 return -1;
262 out_bad_data:
San Mehat7e8529a2010-03-25 09:31:42 -0700263 SLOGE("Bad cgroup data {%s}", lineBuf);
San Mehat503df202010-03-02 17:09:56 -0800264 fclose(fp);
265 return -1;
San Mehatc0dfca72009-10-27 11:52:55 -0700266#else
267 errno = ENOSYS;
268 return -1;
269#endif
270}
271
272int get_sched_policy(int tid, SchedPolicy *policy)
273{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700274 if (tid == 0) {
275 tid = gettid();
276 }
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700277 pthread_once(&the_once, __initialize);
San Mehatc0dfca72009-10-27 11:52:55 -0700278
279 if (__sys_supports_schedgroups) {
280 char grpBuf[32];
Isaac Chen795267d2017-02-16 11:47:33 +0800281
282 if (cpusets_enabled()) {
283 if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0)
284 return -1;
285 if (grpBuf[0] == '\0') {
286 *policy = SP_FOREGROUND;
287 } else if (!strcmp(grpBuf, "foreground")) {
288 *policy = SP_FOREGROUND;
289 } else if (!strcmp(grpBuf, "background")) {
290 *policy = SP_BACKGROUND;
291 } else if (!strcmp(grpBuf, "top-app")) {
292 *policy = SP_TOP_APP;
293 } else {
294 errno = ERANGE;
295 return -1;
296 }
Martijn Coenen7b173a12016-04-04 17:11:56 +0200297 } else {
Isaac Chen795267d2017-02-16 11:47:33 +0800298 if (getCGroupSubsys(tid, "cpu", grpBuf, sizeof(grpBuf)) < 0)
299 return -1;
300 if (grpBuf[0] == '\0') {
301 *policy = SP_FOREGROUND;
302 } else if (!strcmp(grpBuf, "bg_non_interactive")) {
303 *policy = SP_BACKGROUND;
304 } else {
305 errno = ERANGE;
306 return -1;
307 }
Martijn Coenen7b173a12016-04-04 17:11:56 +0200308 }
San Mehatc0dfca72009-10-27 11:52:55 -0700309 } else {
310 int rc = sched_getscheduler(tid);
311 if (rc < 0)
312 return -1;
313 else if (rc == SCHED_NORMAL)
314 *policy = SP_FOREGROUND;
315 else if (rc == SCHED_BATCH)
316 *policy = SP_BACKGROUND;
317 else {
318 errno = ERANGE;
319 return -1;
320 }
321 }
322 return 0;
323}
324
Tim Murrayb769c8d2015-06-08 14:56:29 -0700325int set_cpuset_policy(int tid, SchedPolicy policy)
326{
327 // in the absence of cpusets, use the old sched policy
Isaac Chen795267d2017-02-16 11:47:33 +0800328 if (!cpusets_enabled()) {
329 return set_sched_policy(tid, policy);
330 }
331
Tim Murrayb769c8d2015-06-08 14:56:29 -0700332 if (tid == 0) {
333 tid = gettid();
334 }
335 policy = _policy(policy);
336 pthread_once(&the_once, __initialize);
337
Tim Murrayb43225e2015-11-18 16:42:44 -0800338 int fd = -1;
339 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700340 switch (policy) {
341 case SP_BACKGROUND:
342 fd = bg_cpuset_fd;
Todd Kjosba8a4752015-10-26 16:22:11 -0700343 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700344 break;
345 case SP_FOREGROUND:
346 case SP_AUDIO_APP:
347 case SP_AUDIO_SYS:
348 fd = fg_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700349 boost_fd = fg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700350 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800351 case SP_TOP_APP :
352 fd = ta_cpuset_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700353 boost_fd = ta_schedboost_fd;
Tim Murray6647bb52016-01-11 16:16:35 -0800354 break;
Tim Murray4284f9f2015-11-10 14:31:09 -0800355 case SP_SYSTEM:
356 fd = system_bg_cpuset_fd;
Tim Murray4284f9f2015-11-10 14:31:09 -0800357 break;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700358 default:
Todd Kjosba8a4752015-10-26 16:22:11 -0700359 boost_fd = fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700360 break;
361 }
362
363 if (add_tid_to_cgroup(tid, fd) != 0) {
364 if (errno != ESRCH && errno != ENOENT)
365 return -errno;
366 }
367
Isaac Chen795267d2017-02-16 11:47:33 +0800368 if (schedboost_enabled()) {
369 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
370 if (errno != ESRCH && errno != ENOENT)
371 return -errno;
372 }
Todd Kjosba8a4752015-10-26 16:22:11 -0700373 }
374
Tim Murray99910262015-06-22 14:00:56 -0700375 return 0;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700376}
377
John Stultz2f13f0a2016-07-01 17:45:06 -0700378static void set_timerslack_ns(int tid, unsigned long long slack) {
Elliott Hughesd7967c12016-08-03 15:11:01 -0700379 // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
380 // TODO: once we've backported this, log if the open(2) fails.
John Stultz2f13f0a2016-07-01 17:45:06 -0700381 char buf[64];
John Stultz2f13f0a2016-07-01 17:45:06 -0700382 snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
383 int fd = open(buf, O_WRONLY | O_CLOEXEC);
384 if (fd != -1) {
385 int len = snprintf(buf, sizeof(buf), "%llu", slack);
386 if (write(fd, buf, len) != len) {
387 SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
388 }
389 close(fd);
390 return;
391 }
John Stultz2f13f0a2016-07-01 17:45:06 -0700392}
393
San Mehatc0dfca72009-10-27 11:52:55 -0700394int set_sched_policy(int tid, SchedPolicy policy)
395{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700396 if (tid == 0) {
397 tid = gettid();
398 }
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700399 policy = _policy(policy);
Brad Fitzpatricke43c2482010-05-07 12:06:05 -0700400 pthread_once(&the_once, __initialize);
San Mehat493dad92009-09-12 10:06:57 -0700401
San Mehatd2e4e462009-10-29 11:48:00 -0700402#if POLICY_DEBUG
403 char statfile[64];
404 char statline[1024];
405 char thread_name[255];
San Mehatd2e4e462009-10-29 11:48:00 -0700406
Raja Ma2f37e42016-04-19 23:55:14 +0530407 snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
San Mehatd2e4e462009-10-29 11:48:00 -0700408 memset(thread_name, 0, sizeof(thread_name));
409
John Stultz2f13f0a2016-07-01 17:45:06 -0700410 int fd = open(statfile, O_RDONLY | O_CLOEXEC);
San Mehatd2e4e462009-10-29 11:48:00 -0700411 if (fd >= 0) {
412 int rc = read(fd, statline, 1023);
413 close(fd);
414 statline[rc] = 0;
415 char *p = statline;
416 char *q;
417
418 for (p = statline; *p != '('; p++);
419 p++;
420 for (q = p; *q != ')'; q++);
421
422 strncpy(thread_name, p, (q-p));
423 }
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700424 switch (policy) {
425 case SP_BACKGROUND:
San Mehat7e8529a2010-03-25 09:31:42 -0700426 SLOGD("vvv tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700427 break;
428 case SP_FOREGROUND:
Dima Zavin29319a62012-06-04 13:14:36 -0700429 case SP_AUDIO_APP:
430 case SP_AUDIO_SYS:
Tim Murray6647bb52016-01-11 16:16:35 -0800431 case SP_TOP_APP:
San Mehat7e8529a2010-03-25 09:31:42 -0700432 SLOGD("^^^ tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700433 break;
434 case SP_SYSTEM:
435 SLOGD("/// tid %d (%s)", tid, thread_name);
436 break;
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700437 default:
San Mehat7e8529a2010-03-25 09:31:42 -0700438 SLOGD("??? tid %d (%s)", tid, thread_name);
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700439 break;
San Mehatd2e4e462009-10-29 11:48:00 -0700440 }
441#endif
442
San Mehat493dad92009-09-12 10:06:57 -0700443 if (__sys_supports_schedgroups) {
Tim Murrayaa45cb82016-07-08 15:47:11 -0700444 int fd = -1;
445 int boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700446 switch (policy) {
447 case SP_BACKGROUND:
448 fd = bg_cgroup_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700449 boost_fd = bg_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700450 break;
451 case SP_FOREGROUND:
452 case SP_AUDIO_APP:
453 case SP_AUDIO_SYS:
Tim Murrayaa45cb82016-07-08 15:47:11 -0700454 fd = fg_cgroup_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700455 boost_fd = fg_schedboost_fd;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700456 break;
Tim Murray6647bb52016-01-11 16:16:35 -0800457 case SP_TOP_APP:
Tim Murrayb769c8d2015-06-08 14:56:29 -0700458 fd = fg_cgroup_fd;
Tim Murray955694b2016-07-11 11:40:15 -0700459 boost_fd = ta_schedboost_fd;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700460 break;
461 default:
462 fd = -1;
Tim Murrayaa45cb82016-07-08 15:47:11 -0700463 boost_fd = -1;
Tim Murrayb769c8d2015-06-08 14:56:29 -0700464 break;
465 }
466
Tim Murrayb769c8d2015-06-08 14:56:29 -0700467 if (add_tid_to_cgroup(tid, fd) != 0) {
San Mehat493dad92009-09-12 10:06:57 -0700468 if (errno != ESRCH && errno != ENOENT)
469 return -errno;
470 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700471
Isaac Chen795267d2017-02-16 11:47:33 +0800472 if (schedboost_enabled()) {
473 if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
474 if (errno != ESRCH && errno != ENOENT)
475 return -errno;
476 }
Tim Murrayaa45cb82016-07-08 15:47:11 -0700477 }
San Mehat493dad92009-09-12 10:06:57 -0700478 } else {
479 struct sched_param param;
480
481 param.sched_priority = 0;
482 sched_setscheduler(tid,
483 (policy == SP_BACKGROUND) ?
Tim Murrayb769c8d2015-06-08 14:56:29 -0700484 SCHED_BATCH : SCHED_NORMAL,
San Mehat493dad92009-09-12 10:06:57 -0700485 &param);
486 }
487
John Reck2e336b12016-08-26 13:43:19 -0700488 if (__sys_supports_timerslack) {
489 set_timerslack_ns(tid, policy == SP_BACKGROUND ?
John Stultz2f13f0a2016-07-01 17:45:06 -0700490 TIMER_SLACK_BG : TIMER_SLACK_FG);
John Reck2e336b12016-08-26 13:43:19 -0700491 }
Ruchi Kandoi422852e2014-04-22 18:55:08 -0700492
San Mehat493dad92009-09-12 10:06:57 -0700493 return 0;
494}
Raphael0384a982009-09-15 17:10:17 -0700495
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700496#else
497
498/* Stubs for non-Android targets. */
499
Mark Salyzyn12717162014-04-29 15:49:14 -0700500int set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700501{
502 return 0;
503}
504
Mark Salyzyn12717162014-04-29 15:49:14 -0700505int get_sched_policy(int tid UNUSED, SchedPolicy *policy)
Jeff Brownbff8f3f2012-05-08 15:05:42 -0700506{
507 *policy = SP_SYSTEM_DEFAULT;
508 return 0;
509}
510
511#endif
512
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800513const char *get_sched_policy_name(SchedPolicy policy)
514{
Glenn Kasten69bfb1f2012-03-16 09:43:19 -0700515 policy = _policy(policy);
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800516 static const char * const strings[SP_CNT] = {
517 [SP_BACKGROUND] = "bg",
518 [SP_FOREGROUND] = "fg",
Glenn Kasten10ec3c72012-04-19 15:25:58 -0700519 [SP_SYSTEM] = " ",
520 [SP_AUDIO_APP] = "aa",
521 [SP_AUDIO_SYS] = "as",
Tim Murray6647bb52016-01-11 16:16:35 -0800522 [SP_TOP_APP] = "ta",
Glenn Kasten86c7cc82012-03-05 16:14:39 -0800523 };
524 if ((policy < SP_CNT) && (strings[policy] != NULL))
525 return strings[policy];
526 else
527 return "error";
528}