sched_policy.cpp revision 88ef9f062950e6f38efae82fd2527cda2c8883f4
112717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn/*
2493dad966305a7fb555addd367532dd2af275a27San Mehat** Copyright 2007, The Android Open Source Project
3493dad966305a7fb555addd367532dd2af275a27San Mehat**
4b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray** Licensed under the Apache License, Version 2.0 (the "License");
5b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray** you may not use this file except in compliance with the License.
6b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray** You may obtain a copy of the License at
7493dad966305a7fb555addd367532dd2af275a27San Mehat**
8b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray**     http://www.apache.org/licenses/LICENSE-2.0
9493dad966305a7fb555addd367532dd2af275a27San Mehat**
10b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray** Unless required by applicable law or agreed to in writing, software
11b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray** distributed under the License is distributed on an "AS IS" BASIS,
12b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray** See the License for the specific language governing permissions and
14493dad966305a7fb555addd367532dd2af275a27San Mehat** limitations under the License.
15493dad966305a7fb555addd367532dd2af275a27San Mehat*/
16493dad966305a7fb555addd367532dd2af275a27San Mehat
17bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#define LOG_TAG "SchedPolicy"
18bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
1912717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn#include <errno.h>
2012717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn#include <fcntl.h>
21493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdio.h>
22493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdlib.h>
23493dad966305a7fb555addd367532dd2af275a27San Mehat#include <string.h>
2412717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn#include <unistd.h>
2512717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn
26cfd5b080af8de527d768f0ff7902c26af8d49307Mark Salyzyn#include <log/log.h>
27bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#include <cutils/sched_policy.h>
2812717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn
2912717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn#define UNUSED __attribute__((__unused__))
300384a98d6f61fa47ffde01c15e552f738e88fb94Raphael
31d73be1b96beab812b86f8174e7fc928291f0cb44Steven Moreland#ifndef SLOGE
32d73be1b96beab812b86f8174e7fc928291f0cb44Steven Moreland#define SLOGE ALOGE
33d73be1b96beab812b86f8174e7fc928291f0cb44Steven Moreland#endif
34d73be1b96beab812b86f8174e7fc928291f0cb44Steven Moreland#ifndef SLOGW
35d73be1b96beab812b86f8174e7fc928291f0cb44Steven Moreland#define SLOGW ALOGW
36d73be1b96beab812b86f8174e7fc928291f0cb44Steven Moreland#endif
37d73be1b96beab812b86f8174e7fc928291f0cb44Steven Moreland
38bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Re-map SP_DEFAULT to the system default policy, and leave other values unchanged.
39bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Call this any place a SchedPolicy is used as an input parameter.
40bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Returns the possibly re-mapped policy.
41bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown */
42bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brownstatic inline SchedPolicy _policy(SchedPolicy p)
43bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
44bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown   return p == SP_DEFAULT ? SP_SYSTEM_DEFAULT : p;
45bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
46d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
479b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__)
480384a98d6f61fa47ffde01c15e552f738e88fb94Raphael
4986b121523d7d3634bf5ac07b6e238b36b3e75f0aBrad Fitzpatrick#include <pthread.h>
50e07d77e422b328f0b7e8a542e99989dab8c95dacElliott Hughes#include <sched.h>
51e07d77e422b328f0b7e8a542e99989dab8c95dacElliott Hughes#include <sys/prctl.h>
523cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat
53805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat#define POLICY_DEBUG 0
54d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
55422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi// timer slack value in nS enforced when the thread moves to background
56422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi#define TIMER_SLACK_BG 40000000
574cdce427f9ba0339ac7c58fdb4f56ac3630abf34Todd Kjos#define TIMER_SLACK_FG 50000
58422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi
59e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic pthread_once_t the_once = PTHREAD_ONCE_INIT;
60e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick
612e336b1da1ed66e943089c812f7697f5de450936John Reckstatic int __sys_supports_timerslack = -1;
62c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
63b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray// File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
644284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murraystatic int system_bg_cpuset_fd = -1;
65b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int bg_cpuset_fd = -1;
66b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int fg_cpuset_fd = -1;
676647bb51301ea101b73e7431888f70bb35a4fabbTim Murraystatic int ta_cpuset_fd = -1; // special cpuset for top app
68aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray
69aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray// File descriptors open to /dev/stune/../tasks, setup by initialize, or -1 on error
70ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjosstatic int bg_schedboost_fd = -1;
71ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjosstatic int fg_schedboost_fd = -1;
72955694b657012c50312de99e6f78084beae52d60Tim Murraystatic int ta_schedboost_fd = -1;
7388ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandesstatic int rt_schedboost_fd = -1;
74b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
75e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick/* Add tid to the scheduling group defined by the policy */
76b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int add_tid_to_cgroup(int tid, int fd)
77493dad966305a7fb555addd367532dd2af275a27San Mehat{
78e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    if (fd < 0) {
79b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd);
80b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        errno = EINVAL;
81493dad966305a7fb555addd367532dd2af275a27San Mehat        return -1;
82805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat    }
83493dad966305a7fb555addd367532dd2af275a27San Mehat
84253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    // specialized itoa -- works for tid > 0
85253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char text[22];
86253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char *end = text + sizeof(text) - 1;
87253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char *ptr = end;
88253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    *ptr = '\0';
89253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    while (tid > 0) {
90253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick        *--ptr = '0' + (tid % 10);
91253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick        tid = tid / 10;
92253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    }
93253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick
94253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    if (write(fd, ptr, end - ptr) < 0) {
95e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        /*
96e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         * If the thread is in the process of exiting,
97e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         * don't flag an error
98e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         */
99e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        if (errno == ESRCH)
100e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick                return 0;
101b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n",
102b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray              ptr, strerror(errno), fd);
103b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        errno = EINVAL;
104493dad966305a7fb555addd367532dd2af275a27San Mehat        return -1;
105493dad966305a7fb555addd367532dd2af275a27San Mehat    }
106493dad966305a7fb555addd367532dd2af275a27San Mehat
107493dad966305a7fb555addd367532dd2af275a27San Mehat    return 0;
108493dad966305a7fb555addd367532dd2af275a27San Mehat}
109493dad966305a7fb555addd367532dd2af275a27San Mehat
110795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen/*
111795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under
112795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    /dev/cpuset mounted in init.rc; otherwise, that file does not exist
113795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    even though the directory, /dev/cpuset, is still created (by init.rc).
114795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
115795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    A couple of other candidates (under cpuset mount directory):
116795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        notify_on_release
117795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        release_agent
118795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
119795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Yet another way to decide if cpuset is enabled is to parse
120795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    /proc/self/status and search for lines begin with "Mems_allowed".
121795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
122795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can
123795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency
124795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    on where init.rc mounts cpuset. That's why we'd better require this
125795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    configuration be set if CONFIG_CPUSETS is set.
126795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
127795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    With runtime check using the following function, build time
128795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    variables like ENABLE_CPUSETS (used in Android.mk) or cpusets (used
129795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    in Android.bp) are not needed.
130795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen */
131795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
132795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenbool cpusets_enabled() {
133795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0);
134795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
135795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    return enabled;
136795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen}
137795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
138795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen/*
139795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Similar to CONFIG_CPUSETS above, but with a different configuration
140795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    CONFIG_SCHEDTUNE that's in Android common Linux kernel and Linaro
141795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Stable Kernel (LSK), but not in mainline Linux as of v4.9.
142795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
143795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    With runtime check using the following function, build time
144795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    variables like ENABLE_SCHEDBOOST (used in Android.mk) or schedboost
145795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    (used in Android.bp) are not needed.
146795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
147795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen */
148795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
149795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenbool schedboost_enabled() {
150795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    static bool enabled = (access("/dev/stune/tasks", F_OK) == 0);
151795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
152795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    return enabled;
153795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen}
154795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
155795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenstatic void __initialize() {
156795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    const char* filename;
157b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
158795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (cpusets_enabled()) {
159795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        if (!access("/dev/cpuset/tasks", W_OK)) {
160795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
161795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/foreground/tasks";
162795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
163795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/background/tasks";
164795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
165795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/system-background/tasks";
166795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
167795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/top-app/tasks";
168795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
169795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
170795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (schedboost_enabled()) {
171795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/top-app/tasks";
172795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
173795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/foreground/tasks";
174795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
175795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/background/tasks";
176795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
17788ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes                filename = "/dev/stune/rt/tasks";
17888ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes                rt_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
179795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            }
180795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        }
181b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
1822e336b1da1ed66e943089c812f7697f5de450936John Reck
1832e336b1da1ed66e943089c812f7697f5de450936John Reck    char buf[64];
1842e336b1da1ed66e943089c812f7697f5de450936John Reck    snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
1852e336b1da1ed66e943089c812f7697f5de450936John Reck    __sys_supports_timerslack = !access(buf, W_OK);
186c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
187c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
188c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat/*
1897b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen * Returns the path under the requested cgroup subsystem (if it exists)
190c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *
191503df2075991cd03ddf43d14e05768a2138b9028San Mehat * The data from /proc/<pid>/cgroup looks (something) like:
192c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *  2:cpu:/bg_non_interactive
193503df2075991cd03ddf43d14e05768a2138b9028San Mehat *  1:cpuacct:/
194c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *
195c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * We return the part after the "/", which will be an empty string for
196c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * the default cgroup.  If the string is longer than "bufLen", the string
197c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * will be truncated.
198c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat */
1997b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenenstatic int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
200c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
2019b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__)
202c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    char pathBuf[32];
203503df2075991cd03ddf43d14e05768a2138b9028San Mehat    char lineBuf[256];
204503df2075991cd03ddf43d14e05768a2138b9028San Mehat    FILE *fp;
205c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
206c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
2072f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    if (!(fp = fopen(pathBuf, "re"))) {
208c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        return -1;
209c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
210c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
211503df2075991cd03ddf43d14e05768a2138b9028San Mehat    while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
212503df2075991cd03ddf43d14e05768a2138b9028San Mehat        char *next = lineBuf;
2137b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        char *found_subsys;
214503df2075991cd03ddf43d14e05768a2138b9028San Mehat        char *grp;
215503df2075991cd03ddf43d14e05768a2138b9028San Mehat        size_t len;
216c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
217503df2075991cd03ddf43d14e05768a2138b9028San Mehat        /* Junk the first field */
218503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (!strsep(&next, ":")) {
219503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
220503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
221c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
2227b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        if (!(found_subsys = strsep(&next, ":"))) {
223503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
224503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
225503df2075991cd03ddf43d14e05768a2138b9028San Mehat
2267b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        if (strcmp(found_subsys, subsys)) {
227503df2075991cd03ddf43d14e05768a2138b9028San Mehat            /* Not the subsys we're looking for */
228503df2075991cd03ddf43d14e05768a2138b9028San Mehat            continue;
229503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
230503df2075991cd03ddf43d14e05768a2138b9028San Mehat
231503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (!(grp = strsep(&next, ":"))) {
232503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
233503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
234503df2075991cd03ddf43d14e05768a2138b9028San Mehat        grp++; /* Drop the leading '/' */
235503df2075991cd03ddf43d14e05768a2138b9028San Mehat        len = strlen(grp);
236503df2075991cd03ddf43d14e05768a2138b9028San Mehat        grp[len-1] = '\0'; /* Drop the trailing '\n' */
237503df2075991cd03ddf43d14e05768a2138b9028San Mehat
238503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (bufLen <= len) {
239503df2075991cd03ddf43d14e05768a2138b9028San Mehat            len = bufLen - 1;
240503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
241503df2075991cd03ddf43d14e05768a2138b9028San Mehat        strncpy(buf, grp, len);
242503df2075991cd03ddf43d14e05768a2138b9028San Mehat        buf[len] = '\0';
243503df2075991cd03ddf43d14e05768a2138b9028San Mehat        fclose(fp);
244503df2075991cd03ddf43d14e05768a2138b9028San Mehat        return 0;
245c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
246c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
2477b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen    SLOGE("Failed to find subsys %s", subsys);
248503df2075991cd03ddf43d14e05768a2138b9028San Mehat    fclose(fp);
249503df2075991cd03ddf43d14e05768a2138b9028San Mehat    return -1;
250503df2075991cd03ddf43d14e05768a2138b9028San Mehat out_bad_data:
2517e8529a8b528fd30586aa037f15a31b29582c537San Mehat    SLOGE("Bad cgroup data {%s}", lineBuf);
252503df2075991cd03ddf43d14e05768a2138b9028San Mehat    fclose(fp);
253503df2075991cd03ddf43d14e05768a2138b9028San Mehat    return -1;
254c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#else
255c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    errno = ENOSYS;
256c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    return -1;
257c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#endif
258c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
259c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
260c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint get_sched_policy(int tid, SchedPolicy *policy)
261c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
26269bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    if (tid == 0) {
26369bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten        tid = gettid();
26469bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    }
265e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    pthread_once(&the_once, __initialize);
266c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
26740267986dab665b206773f834153783898e50294Wei Wang    char grpBuf[32];
26840267986dab665b206773f834153783898e50294Wei Wang
269b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    grpBuf[0] = '\0';
270b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    if (schedboost_enabled()) {
271b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        if (getCGroupSubsys(tid, "schedtune", grpBuf, sizeof(grpBuf)) < 0) return -1;
272b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    }
273b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    if ((grpBuf[0] == '\0') && cpusets_enabled()) {
27440267986dab665b206773f834153783898e50294Wei Wang        if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0) return -1;
275b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    }
276b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    if (grpBuf[0] == '\0') {
277b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        *policy = SP_FOREGROUND;
278b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else if (!strcmp(grpBuf, "foreground")) {
279a8d59faa753c027e7375067f96a30e6429178105Wei Wang        *policy = SP_FOREGROUND;
280b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else if (!strcmp(grpBuf, "system-background")) {
281b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        *policy = SP_SYSTEM;
282b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else if (!strcmp(grpBuf, "background")) {
283b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        *policy = SP_BACKGROUND;
284b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else if (!strcmp(grpBuf, "top-app")) {
285b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        *policy = SP_TOP_APP;
286b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else {
287b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        errno = ERANGE;
288b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        return -1;
289c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
290c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    return 0;
291c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
292c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
293b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murrayint set_cpuset_policy(int tid, SchedPolicy policy)
294b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray{
295b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    // in the absence of cpusets, use the old sched policy
296795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (!cpusets_enabled()) {
297795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        return set_sched_policy(tid, policy);
298795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    }
299795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
300b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    if (tid == 0) {
301b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        tid = gettid();
302b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
303b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    policy = _policy(policy);
304b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    pthread_once(&the_once, __initialize);
305b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
306b43225eefb0e60858755d72103f9f9b53785b5d9Tim Murray    int fd = -1;
307b43225eefb0e60858755d72103f9f9b53785b5d9Tim Murray    int boost_fd = -1;
308b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    switch (policy) {
309b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_BACKGROUND:
310b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        fd = bg_cpuset_fd;
311ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos        boost_fd = bg_schedboost_fd;
312b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
313b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_FOREGROUND:
314b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_AUDIO_APP:
315b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_AUDIO_SYS:
316b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        fd = fg_cpuset_fd;
317955694b657012c50312de99e6f78084beae52d60Tim Murray        boost_fd = fg_schedboost_fd;
3184284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray        break;
3196647bb51301ea101b73e7431888f70bb35a4fabbTim Murray    case SP_TOP_APP :
3206647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        fd = ta_cpuset_fd;
321955694b657012c50312de99e6f78084beae52d60Tim Murray        boost_fd = ta_schedboost_fd;
3226647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        break;
3234284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray    case SP_SYSTEM:
3244284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray        fd = system_bg_cpuset_fd;
325b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
326b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    default:
327ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos        boost_fd = fd = -1;
328b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
329b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
330b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
331b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    if (add_tid_to_cgroup(tid, fd) != 0) {
332b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        if (errno != ESRCH && errno != ENOENT)
333b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            return -errno;
334b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
335b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
336795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (schedboost_enabled()) {
337795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
338795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (errno != ESRCH && errno != ENOENT)
339795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                return -errno;
340795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        }
341ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos    }
342ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos
343999102664c4aa752d7e90c7c5ec5da9e1d648ac9Tim Murray    return 0;
344b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray}
345b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
3462f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultzstatic void set_timerslack_ns(int tid, unsigned long long slack) {
347d7967c1347cf83b7ff621629aeb69f5fb57d9976Elliott Hughes    // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
348d7967c1347cf83b7ff621629aeb69f5fb57d9976Elliott Hughes    // TODO: once we've backported this, log if the open(2) fails.
349d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    if (__sys_supports_timerslack) {
350d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        char buf[64];
351d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
352d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        int fd = open(buf, O_WRONLY | O_CLOEXEC);
353d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        if (fd != -1) {
354d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            int len = snprintf(buf, sizeof(buf), "%llu", slack);
355d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            if (write(fd, buf, len) != len) {
356d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats                SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
357d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            }
358d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            close(fd);
359d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            return;
360d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        }
361d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    }
362d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats
363d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    // TODO: Remove when /proc/<tid>/timerslack_ns interface is backported.
364d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    if ((tid == 0) || (tid == gettid())) {
365d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        if (prctl(PR_SET_TIMERSLACK, slack) == -1) {
366d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            SLOGE("set_timerslack_ns prctl failed: %s\n", strerror(errno));
3672f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz        }
3682f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    }
3692f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz}
3702f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz
371c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint set_sched_policy(int tid, SchedPolicy policy)
372c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
37369bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    if (tid == 0) {
37469bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten        tid = gettid();
37569bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    }
37669bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    policy = _policy(policy);
377e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    pthread_once(&the_once, __initialize);
378493dad966305a7fb555addd367532dd2af275a27San Mehat
379d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#if POLICY_DEBUG
380d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char statfile[64];
381d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char statline[1024];
382d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char thread_name[255];
383d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
384a2f37e4fd719722064438d5ca34f88a7fa9a5886Raja M    snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
385d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    memset(thread_name, 0, sizeof(thread_name));
386d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
3872f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    int fd = open(statfile, O_RDONLY | O_CLOEXEC);
388d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    if (fd >= 0) {
389d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        int rc = read(fd, statline, 1023);
390d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        close(fd);
391d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        statline[rc] = 0;
392d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        char *p = statline;
393d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        char *q;
394d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
395d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        for (p = statline; *p != '('; p++);
396d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        p++;
397d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        for (q = p; *q != ')'; q++);
398d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
399d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        strncpy(thread_name, p, (q-p));
400d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    }
40110ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    switch (policy) {
40210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_BACKGROUND:
4037e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("vvv tid %d (%s)", tid, thread_name);
40410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
40510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_FOREGROUND:
40629319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin    case SP_AUDIO_APP:
40729319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin    case SP_AUDIO_SYS:
4086647bb51301ea101b73e7431888f70bb35a4fabbTim Murray    case SP_TOP_APP:
4097e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("^^^ tid %d (%s)", tid, thread_name);
41010ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
41110ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_SYSTEM:
41210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        SLOGD("/// tid %d (%s)", tid, thread_name);
41310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
41488ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes    case SP_RT_APP:
41588ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes	SLOGD("RT  tid %d (%s)", tid, thread_name);
41688ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes	break;
41710ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    default:
4187e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("??? tid %d (%s)", tid, thread_name);
41910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
420d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    }
421d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#endif
422d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
42340267986dab665b206773f834153783898e50294Wei Wang    if (schedboost_enabled()) {
424aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray        int boost_fd = -1;
425b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        switch (policy) {
426b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_BACKGROUND:
427aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            boost_fd = bg_schedboost_fd;
428b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
429b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_FOREGROUND:
430b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_AUDIO_APP:
431b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_AUDIO_SYS:
432955694b657012c50312de99e6f78084beae52d60Tim Murray            boost_fd = fg_schedboost_fd;
433aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            break;
4346647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        case SP_TOP_APP:
435955694b657012c50312de99e6f78084beae52d60Tim Murray            boost_fd = ta_schedboost_fd;
436b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
43788ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes        case SP_RT_APP:
43888ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes	    boost_fd = rt_schedboost_fd;
43988ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes	    break;
440b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        default:
441aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            boost_fd = -1;
442b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
443b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        }
444b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
44540267986dab665b206773f834153783898e50294Wei Wang        if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
446493dad966305a7fb555addd367532dd2af275a27San Mehat            if (errno != ESRCH && errno != ENOENT)
447493dad966305a7fb555addd367532dd2af275a27San Mehat                return -errno;
448493dad966305a7fb555addd367532dd2af275a27San Mehat        }
449aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray
450493dad966305a7fb555addd367532dd2af275a27San Mehat    }
451493dad966305a7fb555addd367532dd2af275a27San Mehat
452d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    set_timerslack_ns(tid, policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG);
453422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi
454493dad966305a7fb555addd367532dd2af275a27San Mehat    return 0;
455493dad966305a7fb555addd367532dd2af275a27San Mehat}
4560384a98d6f61fa47ffde01c15e552f738e88fb94Raphael
457bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#else
458bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
459bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Stubs for non-Android targets. */
460bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
46112717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzynint set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
462bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
463bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    return 0;
464bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
465bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
46612717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzynint get_sched_policy(int tid UNUSED, SchedPolicy *policy)
467bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
468bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    *policy = SP_SYSTEM_DEFAULT;
469bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    return 0;
470bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
471bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
472bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#endif
473bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
47486c7cc81891a69ace7044de667b0624c284ee82bGlenn Kastenconst char *get_sched_policy_name(SchedPolicy policy)
47586c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten{
47669bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    policy = _policy(policy);
47786c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    static const char * const strings[SP_CNT] = {
47886c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten       [SP_BACKGROUND] = "bg",
47986c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten       [SP_FOREGROUND] = "fg",
48010ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_SYSTEM]     = "  ",
48110ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_AUDIO_APP]  = "aa",
48210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_AUDIO_SYS]  = "as",
4836647bb51301ea101b73e7431888f70bb35a4fabbTim Murray       [SP_TOP_APP]    = "ta",
48488ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes       [SP_RT_APP]    = "rt",
48586c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    };
48686c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    if ((policy < SP_CNT) && (strings[policy] != NULL))
48786c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten        return strings[policy];
48886c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    else
48986c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten        return "error";
49086c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten}
491