sched_policy.cpp revision 8e9aeb9053695a14539653093937158d15385ca6
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
178e9aeb9053695a14539653093937158d15385ca6Elliott Hughes#include <cutils/sched_policy.h>
188e9aeb9053695a14539653093937158d15385ca6Elliott Hughes
19bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#define LOG_TAG "SchedPolicy"
20bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
2112717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn#include <errno.h>
2212717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn#include <fcntl.h>
23493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdio.h>
24493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdlib.h>
25493dad966305a7fb555addd367532dd2af275a27San Mehat#include <string.h>
2612717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn#include <unistd.h>
2712717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn
28cfd5b080af8de527d768f0ff7902c26af8d49307Mark Salyzyn#include <log/log.h>
2912717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn
3012717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzyn#define UNUSED __attribute__((__unused__))
310384a98d6f61fa47ffde01c15e552f738e88fb94Raphael
32bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Re-map SP_DEFAULT to the system default policy, and leave other values unchanged.
33bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Call this any place a SchedPolicy is used as an input parameter.
34bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Returns the possibly re-mapped policy.
35bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown */
36bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brownstatic inline SchedPolicy _policy(SchedPolicy p)
37bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
38bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown   return p == SP_DEFAULT ? SP_SYSTEM_DEFAULT : p;
39bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
40d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
419b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__)
420384a98d6f61fa47ffde01c15e552f738e88fb94Raphael
4386b121523d7d3634bf5ac07b6e238b36b3e75f0aBrad Fitzpatrick#include <pthread.h>
44e07d77e422b328f0b7e8a542e99989dab8c95dacElliott Hughes#include <sched.h>
45e07d77e422b328f0b7e8a542e99989dab8c95dacElliott Hughes#include <sys/prctl.h>
463cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat
47805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat#define POLICY_DEBUG 0
48d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
49422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi// timer slack value in nS enforced when the thread moves to background
50422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi#define TIMER_SLACK_BG 40000000
514cdce427f9ba0339ac7c58fdb4f56ac3630abf34Todd Kjos#define TIMER_SLACK_FG 50000
52422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi
53e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic pthread_once_t the_once = PTHREAD_ONCE_INIT;
54e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick
552e336b1da1ed66e943089c812f7697f5de450936John Reckstatic int __sys_supports_timerslack = -1;
56c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
57b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray// File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
584284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murraystatic int system_bg_cpuset_fd = -1;
59b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int bg_cpuset_fd = -1;
60b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int fg_cpuset_fd = -1;
616647bb51301ea101b73e7431888f70bb35a4fabbTim Murraystatic int ta_cpuset_fd = -1; // special cpuset for top app
62aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray
63aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray// File descriptors open to /dev/stune/../tasks, setup by initialize, or -1 on error
64ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjosstatic int bg_schedboost_fd = -1;
65ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjosstatic int fg_schedboost_fd = -1;
66955694b657012c50312de99e6f78084beae52d60Tim Murraystatic int ta_schedboost_fd = -1;
6788ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandesstatic int rt_schedboost_fd = -1;
68b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
69e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick/* Add tid to the scheduling group defined by the policy */
70b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int add_tid_to_cgroup(int tid, int fd)
71493dad966305a7fb555addd367532dd2af275a27San Mehat{
72e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    if (fd < 0) {
73b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd);
74b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        errno = EINVAL;
75493dad966305a7fb555addd367532dd2af275a27San Mehat        return -1;
76805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat    }
77493dad966305a7fb555addd367532dd2af275a27San Mehat
78253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    // specialized itoa -- works for tid > 0
79253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char text[22];
80253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char *end = text + sizeof(text) - 1;
81253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char *ptr = end;
82253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    *ptr = '\0';
83253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    while (tid > 0) {
84253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick        *--ptr = '0' + (tid % 10);
85253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick        tid = tid / 10;
86253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    }
87253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick
88253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    if (write(fd, ptr, end - ptr) < 0) {
89e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        /*
90e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         * If the thread is in the process of exiting,
91e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         * don't flag an error
92e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         */
93e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        if (errno == ESRCH)
94e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick                return 0;
95b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n",
96b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray              ptr, strerror(errno), fd);
97b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        errno = EINVAL;
98493dad966305a7fb555addd367532dd2af275a27San Mehat        return -1;
99493dad966305a7fb555addd367532dd2af275a27San Mehat    }
100493dad966305a7fb555addd367532dd2af275a27San Mehat
101493dad966305a7fb555addd367532dd2af275a27San Mehat    return 0;
102493dad966305a7fb555addd367532dd2af275a27San Mehat}
103493dad966305a7fb555addd367532dd2af275a27San Mehat
104795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen/*
105795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under
106795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    /dev/cpuset mounted in init.rc; otherwise, that file does not exist
107795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    even though the directory, /dev/cpuset, is still created (by init.rc).
108795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
109795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    A couple of other candidates (under cpuset mount directory):
110795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        notify_on_release
111795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        release_agent
112795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
113795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Yet another way to decide if cpuset is enabled is to parse
114795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    /proc/self/status and search for lines begin with "Mems_allowed".
115795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
116795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can
117795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency
118795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    on where init.rc mounts cpuset. That's why we'd better require this
119795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    configuration be set if CONFIG_CPUSETS is set.
120795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
12176a934a459138ddfe8e0985e7cc2d0aba6749c42Elliott Hughes    In older releases, this was controlled by build-time configuration.
122795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen */
123795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenbool cpusets_enabled() {
124795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0);
125795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
126795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    return enabled;
127795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen}
128795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
129795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen/*
130795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Similar to CONFIG_CPUSETS above, but with a different configuration
1312d998ea99bd650aafc270f5d0599fc0b8d2c0ce7Alex Naidis    CONFIG_CGROUP_SCHEDTUNE that's in Android common Linux kernel and Linaro
132795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Stable Kernel (LSK), but not in mainline Linux as of v4.9.
133795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
1345dc7736f601849fb76e00edadeb6b6a142b7a322Elliott Hughes    In older releases, this was controlled by build-time configuration.
135795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen */
136795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenbool schedboost_enabled() {
137795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    static bool enabled = (access("/dev/stune/tasks", F_OK) == 0);
138795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
139795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    return enabled;
140795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen}
141795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
142795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenstatic void __initialize() {
143795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    const char* filename;
144b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
145795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (cpusets_enabled()) {
146795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        if (!access("/dev/cpuset/tasks", W_OK)) {
147795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
148795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/foreground/tasks";
149795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
150795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/background/tasks";
151795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
152795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/system-background/tasks";
153795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
154795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/top-app/tasks";
155795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
156795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
157795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (schedboost_enabled()) {
158795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/top-app/tasks";
159795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
160795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/foreground/tasks";
161795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
162795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/background/tasks";
163795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
16488ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes                filename = "/dev/stune/rt/tasks";
16588ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes                rt_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
166795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            }
167795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        }
168b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
1692e336b1da1ed66e943089c812f7697f5de450936John Reck
1702e336b1da1ed66e943089c812f7697f5de450936John Reck    char buf[64];
1712e336b1da1ed66e943089c812f7697f5de450936John Reck    snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
1722e336b1da1ed66e943089c812f7697f5de450936John Reck    __sys_supports_timerslack = !access(buf, W_OK);
173c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
174c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
175c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat/*
1767b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen * Returns the path under the requested cgroup subsystem (if it exists)
177c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *
178503df2075991cd03ddf43d14e05768a2138b9028San Mehat * The data from /proc/<pid>/cgroup looks (something) like:
179c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *  2:cpu:/bg_non_interactive
180503df2075991cd03ddf43d14e05768a2138b9028San Mehat *  1:cpuacct:/
181c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *
182c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * We return the part after the "/", which will be an empty string for
183c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * the default cgroup.  If the string is longer than "bufLen", the string
184c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * will be truncated.
185c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat */
1867b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenenstatic int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
187c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
1889b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__)
189c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    char pathBuf[32];
190503df2075991cd03ddf43d14e05768a2138b9028San Mehat    char lineBuf[256];
191503df2075991cd03ddf43d14e05768a2138b9028San Mehat    FILE *fp;
192c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
193c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
1942f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    if (!(fp = fopen(pathBuf, "re"))) {
195c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        return -1;
196c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
197c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
198503df2075991cd03ddf43d14e05768a2138b9028San Mehat    while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
199503df2075991cd03ddf43d14e05768a2138b9028San Mehat        char *next = lineBuf;
2007b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        char *found_subsys;
201503df2075991cd03ddf43d14e05768a2138b9028San Mehat        char *grp;
202503df2075991cd03ddf43d14e05768a2138b9028San Mehat        size_t len;
203c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
204503df2075991cd03ddf43d14e05768a2138b9028San Mehat        /* Junk the first field */
205503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (!strsep(&next, ":")) {
206503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
207503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
208c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
2097b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        if (!(found_subsys = strsep(&next, ":"))) {
210503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
211503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
212503df2075991cd03ddf43d14e05768a2138b9028San Mehat
2137b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        if (strcmp(found_subsys, subsys)) {
214503df2075991cd03ddf43d14e05768a2138b9028San Mehat            /* Not the subsys we're looking for */
215503df2075991cd03ddf43d14e05768a2138b9028San Mehat            continue;
216503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
217503df2075991cd03ddf43d14e05768a2138b9028San Mehat
218503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (!(grp = strsep(&next, ":"))) {
219503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
220503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
221503df2075991cd03ddf43d14e05768a2138b9028San Mehat        grp++; /* Drop the leading '/' */
222503df2075991cd03ddf43d14e05768a2138b9028San Mehat        len = strlen(grp);
223503df2075991cd03ddf43d14e05768a2138b9028San Mehat        grp[len-1] = '\0'; /* Drop the trailing '\n' */
224503df2075991cd03ddf43d14e05768a2138b9028San Mehat
225503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (bufLen <= len) {
226503df2075991cd03ddf43d14e05768a2138b9028San Mehat            len = bufLen - 1;
227503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
228503df2075991cd03ddf43d14e05768a2138b9028San Mehat        strncpy(buf, grp, len);
229503df2075991cd03ddf43d14e05768a2138b9028San Mehat        buf[len] = '\0';
230503df2075991cd03ddf43d14e05768a2138b9028San Mehat        fclose(fp);
231503df2075991cd03ddf43d14e05768a2138b9028San Mehat        return 0;
232c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
233c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
2347b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen    SLOGE("Failed to find subsys %s", subsys);
235503df2075991cd03ddf43d14e05768a2138b9028San Mehat    fclose(fp);
236503df2075991cd03ddf43d14e05768a2138b9028San Mehat    return -1;
237503df2075991cd03ddf43d14e05768a2138b9028San Mehat out_bad_data:
2387e8529a8b528fd30586aa037f15a31b29582c537San Mehat    SLOGE("Bad cgroup data {%s}", lineBuf);
239503df2075991cd03ddf43d14e05768a2138b9028San Mehat    fclose(fp);
240503df2075991cd03ddf43d14e05768a2138b9028San Mehat    return -1;
241c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#else
242c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    errno = ENOSYS;
243c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    return -1;
244c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#endif
245c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
246c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
247c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint get_sched_policy(int tid, SchedPolicy *policy)
248c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
24969bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    if (tid == 0) {
25069bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten        tid = gettid();
25169bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    }
252e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    pthread_once(&the_once, __initialize);
253c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
25440267986dab665b206773f834153783898e50294Wei Wang    char grpBuf[32];
25540267986dab665b206773f834153783898e50294Wei Wang
256b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    grpBuf[0] = '\0';
257b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    if (schedboost_enabled()) {
258b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        if (getCGroupSubsys(tid, "schedtune", grpBuf, sizeof(grpBuf)) < 0) return -1;
259b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    }
260b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    if ((grpBuf[0] == '\0') && cpusets_enabled()) {
26140267986dab665b206773f834153783898e50294Wei Wang        if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0) return -1;
262b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    }
263b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    if (grpBuf[0] == '\0') {
264b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        *policy = SP_FOREGROUND;
265b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else if (!strcmp(grpBuf, "foreground")) {
266a8d59faa753c027e7375067f96a30e6429178105Wei Wang        *policy = SP_FOREGROUND;
267b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else if (!strcmp(grpBuf, "system-background")) {
268b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        *policy = SP_SYSTEM;
269b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else if (!strcmp(grpBuf, "background")) {
270b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        *policy = SP_BACKGROUND;
271b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else if (!strcmp(grpBuf, "top-app")) {
272b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        *policy = SP_TOP_APP;
273b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats    } else {
274b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        errno = ERANGE;
275b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats        return -1;
276c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
277c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    return 0;
278c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
279c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
280b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murrayint set_cpuset_policy(int tid, SchedPolicy policy)
281b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray{
282b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    // in the absence of cpusets, use the old sched policy
283795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (!cpusets_enabled()) {
284795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        return set_sched_policy(tid, policy);
285795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    }
286795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
287b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    if (tid == 0) {
288b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        tid = gettid();
289b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
290b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    policy = _policy(policy);
291b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    pthread_once(&the_once, __initialize);
292b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
293b43225eefb0e60858755d72103f9f9b53785b5d9Tim Murray    int fd = -1;
294b43225eefb0e60858755d72103f9f9b53785b5d9Tim Murray    int boost_fd = -1;
295b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    switch (policy) {
296b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_BACKGROUND:
297b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        fd = bg_cpuset_fd;
298ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos        boost_fd = bg_schedboost_fd;
299b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
300b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_FOREGROUND:
301b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_AUDIO_APP:
302b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_AUDIO_SYS:
303b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        fd = fg_cpuset_fd;
304955694b657012c50312de99e6f78084beae52d60Tim Murray        boost_fd = fg_schedboost_fd;
3054284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray        break;
3066647bb51301ea101b73e7431888f70bb35a4fabbTim Murray    case SP_TOP_APP :
3076647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        fd = ta_cpuset_fd;
308955694b657012c50312de99e6f78084beae52d60Tim Murray        boost_fd = ta_schedboost_fd;
3096647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        break;
3104284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray    case SP_SYSTEM:
3114284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray        fd = system_bg_cpuset_fd;
312b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
313b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    default:
314ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos        boost_fd = fd = -1;
315b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
316b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
317b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
318b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    if (add_tid_to_cgroup(tid, fd) != 0) {
319b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        if (errno != ESRCH && errno != ENOENT)
320b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            return -errno;
321b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
322b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
323795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (schedboost_enabled()) {
324795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
325795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (errno != ESRCH && errno != ENOENT)
326795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                return -errno;
327795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        }
328ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos    }
329ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos
330999102664c4aa752d7e90c7c5ec5da9e1d648ac9Tim Murray    return 0;
331b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray}
332b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
333f5b8e3466055952449a499c6b0634018980d759bStephen Cranestatic void set_timerslack_ns(int tid, unsigned long slack) {
334d7967c1347cf83b7ff621629aeb69f5fb57d9976Elliott Hughes    // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
335d7967c1347cf83b7ff621629aeb69f5fb57d9976Elliott Hughes    // TODO: once we've backported this, log if the open(2) fails.
336d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    if (__sys_supports_timerslack) {
337d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        char buf[64];
338d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
339d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        int fd = open(buf, O_WRONLY | O_CLOEXEC);
340d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        if (fd != -1) {
341f5b8e3466055952449a499c6b0634018980d759bStephen Crane            int len = snprintf(buf, sizeof(buf), "%lu", slack);
342d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            if (write(fd, buf, len) != len) {
343d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats                SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
344d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            }
345d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            close(fd);
346d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            return;
347d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        }
348d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    }
349d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats
350d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    // TODO: Remove when /proc/<tid>/timerslack_ns interface is backported.
351d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    if ((tid == 0) || (tid == gettid())) {
352d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats        if (prctl(PR_SET_TIMERSLACK, slack) == -1) {
353d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats            SLOGE("set_timerslack_ns prctl failed: %s\n", strerror(errno));
3542f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz        }
3552f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    }
3562f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz}
3572f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz
358c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint set_sched_policy(int tid, SchedPolicy policy)
359c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
36069bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    if (tid == 0) {
36169bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten        tid = gettid();
36269bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    }
36369bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    policy = _policy(policy);
364e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    pthread_once(&the_once, __initialize);
365493dad966305a7fb555addd367532dd2af275a27San Mehat
366d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#if POLICY_DEBUG
367d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char statfile[64];
368d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char statline[1024];
369d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char thread_name[255];
370d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
371a2f37e4fd719722064438d5ca34f88a7fa9a5886Raja M    snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
372d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    memset(thread_name, 0, sizeof(thread_name));
373d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
3742f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    int fd = open(statfile, O_RDONLY | O_CLOEXEC);
375d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    if (fd >= 0) {
376d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        int rc = read(fd, statline, 1023);
377d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        close(fd);
378d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        statline[rc] = 0;
379d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        char *p = statline;
380d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        char *q;
381d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
382d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        for (p = statline; *p != '('; p++);
383d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        p++;
384d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        for (q = p; *q != ')'; q++);
385d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
386d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        strncpy(thread_name, p, (q-p));
387d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    }
38810ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    switch (policy) {
38910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_BACKGROUND:
3907e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("vvv tid %d (%s)", tid, thread_name);
39110ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
39210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_FOREGROUND:
39329319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin    case SP_AUDIO_APP:
39429319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin    case SP_AUDIO_SYS:
3956647bb51301ea101b73e7431888f70bb35a4fabbTim Murray    case SP_TOP_APP:
3967e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("^^^ tid %d (%s)", tid, thread_name);
39710ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
39810ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_SYSTEM:
39910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        SLOGD("/// tid %d (%s)", tid, thread_name);
40010ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
40188ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes    case SP_RT_APP:
40288ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes	SLOGD("RT  tid %d (%s)", tid, thread_name);
40388ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes	break;
40410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    default:
4057e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("??? tid %d (%s)", tid, thread_name);
40610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
407d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    }
408d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#endif
409d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
41040267986dab665b206773f834153783898e50294Wei Wang    if (schedboost_enabled()) {
411aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray        int boost_fd = -1;
412b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        switch (policy) {
413b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_BACKGROUND:
414aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            boost_fd = bg_schedboost_fd;
415b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
416b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_FOREGROUND:
417b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_AUDIO_APP:
418b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_AUDIO_SYS:
419955694b657012c50312de99e6f78084beae52d60Tim Murray            boost_fd = fg_schedboost_fd;
420aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            break;
4216647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        case SP_TOP_APP:
422955694b657012c50312de99e6f78084beae52d60Tim Murray            boost_fd = ta_schedboost_fd;
423b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
42488ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes        case SP_RT_APP:
42588ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes	    boost_fd = rt_schedboost_fd;
42688ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes	    break;
427b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        default:
428aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            boost_fd = -1;
429b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
430b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        }
431b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
43240267986dab665b206773f834153783898e50294Wei Wang        if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
433493dad966305a7fb555addd367532dd2af275a27San Mehat            if (errno != ESRCH && errno != ENOENT)
434493dad966305a7fb555addd367532dd2af275a27San Mehat                return -errno;
435493dad966305a7fb555addd367532dd2af275a27San Mehat        }
436aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray
437493dad966305a7fb555addd367532dd2af275a27San Mehat    }
438493dad966305a7fb555addd367532dd2af275a27San Mehat
439d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats    set_timerslack_ns(tid, policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG);
440422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi
441493dad966305a7fb555addd367532dd2af275a27San Mehat    return 0;
442493dad966305a7fb555addd367532dd2af275a27San Mehat}
4430384a98d6f61fa47ffde01c15e552f738e88fb94Raphael
444bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#else
445bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
446bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Stubs for non-Android targets. */
447bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
44812717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzynint set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
449bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
450bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    return 0;
451bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
452bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
45312717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzynint get_sched_policy(int tid UNUSED, SchedPolicy *policy)
454bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
455bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    *policy = SP_SYSTEM_DEFAULT;
456bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    return 0;
457bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
458bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
459bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#endif
460bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
46186c7cc81891a69ace7044de667b0624c284ee82bGlenn Kastenconst char *get_sched_policy_name(SchedPolicy policy)
46286c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten{
46369bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    policy = _policy(policy);
46486c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    static const char * const strings[SP_CNT] = {
46586c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten       [SP_BACKGROUND] = "bg",
46686c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten       [SP_FOREGROUND] = "fg",
46710ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_SYSTEM]     = "  ",
46810ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_AUDIO_APP]  = "aa",
46910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_AUDIO_SYS]  = "as",
4706647bb51301ea101b73e7431888f70bb35a4fabbTim Murray       [SP_TOP_APP]    = "ta",
47188ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes       [SP_RT_APP]    = "rt",
47286c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    };
47386c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    if ((policy < SP_CNT) && (strings[policy] != NULL))
47486c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten        return strings[policy];
47586c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    else
47686c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten        return "error";
47786c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten}
478