sched_policy.cpp revision 795267d4c74821cce884c6f1e1082f00e8e12c4a
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
31bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Re-map SP_DEFAULT to the system default policy, and leave other values unchanged.
32bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Call this any place a SchedPolicy is used as an input parameter.
33bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Returns the possibly re-mapped policy.
34bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown */
35bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brownstatic inline SchedPolicy _policy(SchedPolicy p)
36bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
37bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown   return p == SP_DEFAULT ? SP_SYSTEM_DEFAULT : p;
38bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
39d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
409b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__)
410384a98d6f61fa47ffde01c15e552f738e88fb94Raphael
4286b121523d7d3634bf5ac07b6e238b36b3e75f0aBrad Fitzpatrick#include <pthread.h>
43e07d77e422b328f0b7e8a542e99989dab8c95dacElliott Hughes#include <sched.h>
44e07d77e422b328f0b7e8a542e99989dab8c95dacElliott Hughes#include <sys/prctl.h>
453cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat
46805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat#define POLICY_DEBUG 0
47d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
48422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi// timer slack value in nS enforced when the thread moves to background
49422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi#define TIMER_SLACK_BG 40000000
504cdce427f9ba0339ac7c58fdb4f56ac3630abf34Todd Kjos#define TIMER_SLACK_FG 50000
51422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi
52e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic pthread_once_t the_once = PTHREAD_ONCE_INIT;
53e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick
54c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic int __sys_supports_schedgroups = -1;
552e336b1da1ed66e943089c812f7697f5de450936John Reckstatic int __sys_supports_timerslack = -1;
56c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
57e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick// File descriptors open to /dev/cpuctl/../tasks, setup by initialize, or -1 on error.
58e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic int bg_cgroup_fd = -1;
5910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kastenstatic int fg_cgroup_fd = -1;
60e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick
61b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray// File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error
624284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murraystatic int system_bg_cpuset_fd = -1;
63b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int bg_cpuset_fd = -1;
64b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int fg_cpuset_fd = -1;
656647bb51301ea101b73e7431888f70bb35a4fabbTim Murraystatic int ta_cpuset_fd = -1; // special cpuset for top app
66aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray
67aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray// File descriptors open to /dev/stune/../tasks, setup by initialize, or -1 on error
68ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjosstatic int bg_schedboost_fd = -1;
69ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjosstatic int fg_schedboost_fd = -1;
70955694b657012c50312de99e6f78084beae52d60Tim Murraystatic int ta_schedboost_fd = -1;
71b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
72e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick/* Add tid to the scheduling group defined by the policy */
73b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int add_tid_to_cgroup(int tid, int fd)
74493dad966305a7fb555addd367532dd2af275a27San Mehat{
75e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    if (fd < 0) {
76b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd);
77b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        errno = EINVAL;
78493dad966305a7fb555addd367532dd2af275a27San Mehat        return -1;
79805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat    }
80493dad966305a7fb555addd367532dd2af275a27San Mehat
81253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    // specialized itoa -- works for tid > 0
82253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char text[22];
83253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char *end = text + sizeof(text) - 1;
84253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    char *ptr = end;
85253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    *ptr = '\0';
86253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    while (tid > 0) {
87253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick        *--ptr = '0' + (tid % 10);
88253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick        tid = tid / 10;
89253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    }
90253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick
91253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick    if (write(fd, ptr, end - ptr) < 0) {
92e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        /*
93e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         * If the thread is in the process of exiting,
94e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         * don't flag an error
95e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick         */
96e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        if (errno == ESRCH)
97e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick                return 0;
98b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n",
99b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray              ptr, strerror(errno), fd);
100b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        errno = EINVAL;
101493dad966305a7fb555addd367532dd2af275a27San Mehat        return -1;
102493dad966305a7fb555addd367532dd2af275a27San Mehat    }
103493dad966305a7fb555addd367532dd2af275a27San Mehat
104493dad966305a7fb555addd367532dd2af275a27San Mehat    return 0;
105493dad966305a7fb555addd367532dd2af275a27San Mehat}
106493dad966305a7fb555addd367532dd2af275a27San Mehat
107795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen/*
108795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under
109795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    /dev/cpuset mounted in init.rc; otherwise, that file does not exist
110795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    even though the directory, /dev/cpuset, is still created (by init.rc).
111795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
112795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    A couple of other candidates (under cpuset mount directory):
113795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        notify_on_release
114795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        release_agent
115795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
116795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Yet another way to decide if cpuset is enabled is to parse
117795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    /proc/self/status and search for lines begin with "Mems_allowed".
118795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
119795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can
120795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency
121795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    on where init.rc mounts cpuset. That's why we'd better require this
122795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    configuration be set if CONFIG_CPUSETS is set.
123795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
124795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    With runtime check using the following function, build time
125795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    variables like ENABLE_CPUSETS (used in Android.mk) or cpusets (used
126795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    in Android.bp) are not needed.
127795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen */
128795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
129795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenbool cpusets_enabled() {
130795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0);
131795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
132795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    return enabled;
133795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen}
134795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
135795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen/*
136795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Similar to CONFIG_CPUSETS above, but with a different configuration
137795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    CONFIG_SCHEDTUNE that's in Android common Linux kernel and Linaro
138795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    Stable Kernel (LSK), but not in mainline Linux as of v4.9.
139795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
140795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    With runtime check using the following function, build time
141795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    variables like ENABLE_SCHEDBOOST (used in Android.mk) or schedboost
142795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    (used in Android.bp) are not needed.
143795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
144795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen */
145795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
146795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenbool schedboost_enabled() {
147795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    static bool enabled = (access("/dev/stune/tasks", F_OK) == 0);
148795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
149795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    return enabled;
150795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen}
151795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
152795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenstatic void __initialize() {
153795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    const char* filename;
1542e336b1da1ed66e943089c812f7697f5de450936John Reck    if (!access("/dev/cpuctl/tasks", W_OK)) {
155e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        __sys_supports_schedgroups = 1;
156e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick
157e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        filename = "/dev/cpuctl/tasks";
1585b878d24c1f01a5f131d470280b51bcfb5638600Jeff Brown        fg_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC);
15910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        if (fg_cgroup_fd < 0) {
160e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick            SLOGE("open of %s failed: %s\n", filename, strerror(errno));
161e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        }
162e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick
163522d72b7020a7d2f975531c7214ff34225391abaRiley Andrews        filename = "/dev/cpuctl/bg_non_interactive/tasks";
1645b878d24c1f01a5f131d470280b51bcfb5638600Jeff Brown        bg_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC);
165e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        if (bg_cgroup_fd < 0) {
166e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick            SLOGE("open of %s failed: %s\n", filename, strerror(errno));
167493dad966305a7fb555addd367532dd2af275a27San Mehat        }
168e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    } else {
169e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick        __sys_supports_schedgroups = 0;
170493dad966305a7fb555addd367532dd2af275a27San Mehat    }
171b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
172795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (cpusets_enabled()) {
173795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        if (!access("/dev/cpuset/tasks", W_OK)) {
174795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
175795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/foreground/tasks";
176795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
177795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/background/tasks";
178795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
179795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/system-background/tasks";
180795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
181795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            filename = "/dev/cpuset/top-app/tasks";
182795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
183795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
184795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (schedboost_enabled()) {
185795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/top-app/tasks";
186795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
187795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/foreground/tasks";
188795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
189795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                filename = "/dev/stune/background/tasks";
190795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC);
191795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            }
192795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        }
193b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
1942e336b1da1ed66e943089c812f7697f5de450936John Reck
1952e336b1da1ed66e943089c812f7697f5de450936John Reck    char buf[64];
1962e336b1da1ed66e943089c812f7697f5de450936John Reck    snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid());
1972e336b1da1ed66e943089c812f7697f5de450936John Reck    __sys_supports_timerslack = !access(buf, W_OK);
198c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
199c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
200c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat/*
2017b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen * Returns the path under the requested cgroup subsystem (if it exists)
202c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *
203503df2075991cd03ddf43d14e05768a2138b9028San Mehat * The data from /proc/<pid>/cgroup looks (something) like:
204c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *  2:cpu:/bg_non_interactive
205503df2075991cd03ddf43d14e05768a2138b9028San Mehat *  1:cpuacct:/
206c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *
207c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * We return the part after the "/", which will be an empty string for
208c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * the default cgroup.  If the string is longer than "bufLen", the string
209c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * will be truncated.
210c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat */
2117b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenenstatic int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen)
212c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
2139b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__)
214c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    char pathBuf[32];
215503df2075991cd03ddf43d14e05768a2138b9028San Mehat    char lineBuf[256];
216503df2075991cd03ddf43d14e05768a2138b9028San Mehat    FILE *fp;
217c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
218c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
2192f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    if (!(fp = fopen(pathBuf, "re"))) {
220c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        return -1;
221c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
222c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
223503df2075991cd03ddf43d14e05768a2138b9028San Mehat    while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) {
224503df2075991cd03ddf43d14e05768a2138b9028San Mehat        char *next = lineBuf;
2257b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        char *found_subsys;
226503df2075991cd03ddf43d14e05768a2138b9028San Mehat        char *grp;
227503df2075991cd03ddf43d14e05768a2138b9028San Mehat        size_t len;
228c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
229503df2075991cd03ddf43d14e05768a2138b9028San Mehat        /* Junk the first field */
230503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (!strsep(&next, ":")) {
231503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
232503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
233c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
2347b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        if (!(found_subsys = strsep(&next, ":"))) {
235503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
236503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
237503df2075991cd03ddf43d14e05768a2138b9028San Mehat
2387b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen        if (strcmp(found_subsys, subsys)) {
239503df2075991cd03ddf43d14e05768a2138b9028San Mehat            /* Not the subsys we're looking for */
240503df2075991cd03ddf43d14e05768a2138b9028San Mehat            continue;
241503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
242503df2075991cd03ddf43d14e05768a2138b9028San Mehat
243503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (!(grp = strsep(&next, ":"))) {
244503df2075991cd03ddf43d14e05768a2138b9028San Mehat            goto out_bad_data;
245503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
246503df2075991cd03ddf43d14e05768a2138b9028San Mehat        grp++; /* Drop the leading '/' */
247503df2075991cd03ddf43d14e05768a2138b9028San Mehat        len = strlen(grp);
248503df2075991cd03ddf43d14e05768a2138b9028San Mehat        grp[len-1] = '\0'; /* Drop the trailing '\n' */
249503df2075991cd03ddf43d14e05768a2138b9028San Mehat
250503df2075991cd03ddf43d14e05768a2138b9028San Mehat        if (bufLen <= len) {
251503df2075991cd03ddf43d14e05768a2138b9028San Mehat            len = bufLen - 1;
252503df2075991cd03ddf43d14e05768a2138b9028San Mehat        }
253503df2075991cd03ddf43d14e05768a2138b9028San Mehat        strncpy(buf, grp, len);
254503df2075991cd03ddf43d14e05768a2138b9028San Mehat        buf[len] = '\0';
255503df2075991cd03ddf43d14e05768a2138b9028San Mehat        fclose(fp);
256503df2075991cd03ddf43d14e05768a2138b9028San Mehat        return 0;
257c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
258c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
2597b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen    SLOGE("Failed to find subsys %s", subsys);
260503df2075991cd03ddf43d14e05768a2138b9028San Mehat    fclose(fp);
261503df2075991cd03ddf43d14e05768a2138b9028San Mehat    return -1;
262503df2075991cd03ddf43d14e05768a2138b9028San Mehat out_bad_data:
2637e8529a8b528fd30586aa037f15a31b29582c537San Mehat    SLOGE("Bad cgroup data {%s}", lineBuf);
264503df2075991cd03ddf43d14e05768a2138b9028San Mehat    fclose(fp);
265503df2075991cd03ddf43d14e05768a2138b9028San Mehat    return -1;
266c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#else
267c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    errno = ENOSYS;
268c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    return -1;
269c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#endif
270c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
271c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
272c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint get_sched_policy(int tid, SchedPolicy *policy)
273c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
27469bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    if (tid == 0) {
27569bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten        tid = gettid();
27669bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    }
277e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    pthread_once(&the_once, __initialize);
278c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
279c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    if (__sys_supports_schedgroups) {
280c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        char grpBuf[32];
281795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
282795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        if (cpusets_enabled()) {
283795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0)
284795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                return -1;
285795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (grpBuf[0] == '\0') {
286795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                *policy = SP_FOREGROUND;
287795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            } else if (!strcmp(grpBuf, "foreground")) {
288795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                *policy = SP_FOREGROUND;
289795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            } else if (!strcmp(grpBuf, "background")) {
290795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                *policy = SP_BACKGROUND;
291795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            } else if (!strcmp(grpBuf, "top-app")) {
292795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                *policy = SP_TOP_APP;
293795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            } else {
294795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                errno = ERANGE;
295795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                return -1;
296795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            }
297c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        } else {
298795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (getCGroupSubsys(tid, "cpu", grpBuf, sizeof(grpBuf)) < 0)
299795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                return -1;
300795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (grpBuf[0] == '\0') {
301795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                *policy = SP_FOREGROUND;
302795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            } else if (!strcmp(grpBuf, "bg_non_interactive")) {
303795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                *policy = SP_BACKGROUND;
304795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            } else {
305795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                errno = ERANGE;
306795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                return -1;
307795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            }
308c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        }
309c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    } else {
310c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        int rc = sched_getscheduler(tid);
311c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        if (rc < 0)
312c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat            return -1;
313c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        else if (rc == SCHED_NORMAL)
314c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat            *policy = SP_FOREGROUND;
315c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        else if (rc == SCHED_BATCH)
316c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat            *policy = SP_BACKGROUND;
317c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        else {
318c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat            errno = ERANGE;
319c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat            return -1;
320c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat        }
321c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    }
322c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat    return 0;
323c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat}
324c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat
325b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murrayint set_cpuset_policy(int tid, SchedPolicy policy)
326b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray{
327b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    // in the absence of cpusets, use the old sched policy
328795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (!cpusets_enabled()) {
329795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        return set_sched_policy(tid, policy);
330795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    }
331795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen
332b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    if (tid == 0) {
333b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        tid = gettid();
334b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
335b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    policy = _policy(policy);
336b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    pthread_once(&the_once, __initialize);
337b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
338b43225eefb0e60858755d72103f9f9b53785b5d9Tim Murray    int fd = -1;
339b43225eefb0e60858755d72103f9f9b53785b5d9Tim Murray    int boost_fd = -1;
340b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    switch (policy) {
341b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_BACKGROUND:
342b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        fd = bg_cpuset_fd;
343ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos        boost_fd = bg_schedboost_fd;
344b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
345b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_FOREGROUND:
346b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_AUDIO_APP:
347b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    case SP_AUDIO_SYS:
348b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        fd = fg_cpuset_fd;
349955694b657012c50312de99e6f78084beae52d60Tim Murray        boost_fd = fg_schedboost_fd;
3504284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray        break;
3516647bb51301ea101b73e7431888f70bb35a4fabbTim Murray    case SP_TOP_APP :
3526647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        fd = ta_cpuset_fd;
353955694b657012c50312de99e6f78084beae52d60Tim Murray        boost_fd = ta_schedboost_fd;
3546647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        break;
3554284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray    case SP_SYSTEM:
3564284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray        fd = system_bg_cpuset_fd;
357b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
358b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    default:
359ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos        boost_fd = fd = -1;
360b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        break;
361b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
362b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
363b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    if (add_tid_to_cgroup(tid, fd) != 0) {
364b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        if (errno != ESRCH && errno != ENOENT)
365b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            return -errno;
366b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray    }
367b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
368795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen    if (schedboost_enabled()) {
369795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
370795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (errno != ESRCH && errno != ENOENT)
371795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                return -errno;
372795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        }
373ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos    }
374ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos
375999102664c4aa752d7e90c7c5ec5da9e1d648ac9Tim Murray    return 0;
376b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray}
377b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
3782f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultzstatic void set_timerslack_ns(int tid, unsigned long long slack) {
379d7967c1347cf83b7ff621629aeb69f5fb57d9976Elliott Hughes    // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface.
380d7967c1347cf83b7ff621629aeb69f5fb57d9976Elliott Hughes    // TODO: once we've backported this, log if the open(2) fails.
3812f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    char buf[64];
3822f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
3832f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    int fd = open(buf, O_WRONLY | O_CLOEXEC);
3842f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    if (fd != -1) {
3852f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz        int len = snprintf(buf, sizeof(buf), "%llu", slack);
3862f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz        if (write(fd, buf, len) != len) {
3872f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz            SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
3882f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz        }
3892f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz        close(fd);
3902f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz        return;
3912f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    }
3922f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz}
3932f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz
394c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint set_sched_policy(int tid, SchedPolicy policy)
395c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{
39669bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    if (tid == 0) {
39769bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten        tid = gettid();
39869bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    }
39969bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    policy = _policy(policy);
400e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick    pthread_once(&the_once, __initialize);
401493dad966305a7fb555addd367532dd2af275a27San Mehat
402d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#if POLICY_DEBUG
403d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char statfile[64];
404d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char statline[1024];
405d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    char thread_name[255];
406d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
407a2f37e4fd719722064438d5ca34f88a7fa9a5886Raja M    snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
408d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    memset(thread_name, 0, sizeof(thread_name));
409d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
4102f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz    int fd = open(statfile, O_RDONLY | O_CLOEXEC);
411d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    if (fd >= 0) {
412d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        int rc = read(fd, statline, 1023);
413d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        close(fd);
414d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        statline[rc] = 0;
415d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        char *p = statline;
416d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        char *q;
417d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
418d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        for (p = statline; *p != '('; p++);
419d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        p++;
420d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        for (q = p; *q != ')'; q++);
421d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
422d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat        strncpy(thread_name, p, (q-p));
423d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    }
42410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    switch (policy) {
42510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_BACKGROUND:
4267e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("vvv tid %d (%s)", tid, thread_name);
42710ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
42810ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_FOREGROUND:
42929319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin    case SP_AUDIO_APP:
43029319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin    case SP_AUDIO_SYS:
4316647bb51301ea101b73e7431888f70bb35a4fabbTim Murray    case SP_TOP_APP:
4327e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("^^^ tid %d (%s)", tid, thread_name);
43310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
43410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    case SP_SYSTEM:
43510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        SLOGD("/// tid %d (%s)", tid, thread_name);
43610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
43710ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten    default:
4387e8529a8b528fd30586aa037f15a31b29582c537San Mehat        SLOGD("??? tid %d (%s)", tid, thread_name);
43910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten        break;
440d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat    }
441d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#endif
442d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat
443493dad966305a7fb555addd367532dd2af275a27San Mehat    if (__sys_supports_schedgroups) {
444aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray        int fd = -1;
445aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray        int boost_fd = -1;
446b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        switch (policy) {
447b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_BACKGROUND:
448b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            fd = bg_cgroup_fd;
449aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            boost_fd = bg_schedboost_fd;
450b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
451b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_FOREGROUND:
452b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_AUDIO_APP:
453b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        case SP_AUDIO_SYS:
454aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            fd = fg_cgroup_fd;
455955694b657012c50312de99e6f78084beae52d60Tim Murray            boost_fd = fg_schedboost_fd;
456aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            break;
4576647bb51301ea101b73e7431888f70bb35a4fabbTim Murray        case SP_TOP_APP:
458b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            fd = fg_cgroup_fd;
459955694b657012c50312de99e6f78084beae52d60Tim Murray            boost_fd = ta_schedboost_fd;
460b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
461b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        default:
462b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            fd = -1;
463aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray            boost_fd = -1;
464b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray            break;
465b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        }
466b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray
467b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray        if (add_tid_to_cgroup(tid, fd) != 0) {
468493dad966305a7fb555addd367532dd2af275a27San Mehat            if (errno != ESRCH && errno != ENOENT)
469493dad966305a7fb555addd367532dd2af275a27San Mehat                return -errno;
470493dad966305a7fb555addd367532dd2af275a27San Mehat        }
471aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray
472795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen        if (schedboost_enabled()) {
473795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) {
474795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                if (errno != ESRCH && errno != ENOENT)
475795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen                    return -errno;
476795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen            }
477aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray        }
478493dad966305a7fb555addd367532dd2af275a27San Mehat    } else {
479493dad966305a7fb555addd367532dd2af275a27San Mehat        struct sched_param param;
480493dad966305a7fb555addd367532dd2af275a27San Mehat
481493dad966305a7fb555addd367532dd2af275a27San Mehat        param.sched_priority = 0;
482493dad966305a7fb555addd367532dd2af275a27San Mehat        sched_setscheduler(tid,
483493dad966305a7fb555addd367532dd2af275a27San Mehat                           (policy == SP_BACKGROUND) ?
484b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray                           SCHED_BATCH : SCHED_NORMAL,
485493dad966305a7fb555addd367532dd2af275a27San Mehat                           &param);
486493dad966305a7fb555addd367532dd2af275a27San Mehat    }
487493dad966305a7fb555addd367532dd2af275a27San Mehat
4882e336b1da1ed66e943089c812f7697f5de450936John Reck    if (__sys_supports_timerslack) {
4892e336b1da1ed66e943089c812f7697f5de450936John Reck        set_timerslack_ns(tid, policy == SP_BACKGROUND ?
4902f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz                               TIMER_SLACK_BG : TIMER_SLACK_FG);
4912e336b1da1ed66e943089c812f7697f5de450936John Reck    }
492422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi
493493dad966305a7fb555addd367532dd2af275a27San Mehat    return 0;
494493dad966305a7fb555addd367532dd2af275a27San Mehat}
4950384a98d6f61fa47ffde01c15e552f738e88fb94Raphael
496bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#else
497bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
498bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Stubs for non-Android targets. */
499bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
50012717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzynint set_sched_policy(int tid UNUSED, SchedPolicy policy UNUSED)
501bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
502bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    return 0;
503bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
504bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
50512717169a51335f4b20b7c78a63b9ab66a81a366Mark Salyzynint get_sched_policy(int tid UNUSED, SchedPolicy *policy)
506bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{
507bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    *policy = SP_SYSTEM_DEFAULT;
508bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown    return 0;
509bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown}
510bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
511bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#endif
512bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown
51386c7cc81891a69ace7044de667b0624c284ee82bGlenn Kastenconst char *get_sched_policy_name(SchedPolicy policy)
51486c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten{
51569bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten    policy = _policy(policy);
51686c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    static const char * const strings[SP_CNT] = {
51786c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten       [SP_BACKGROUND] = "bg",
51886c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten       [SP_FOREGROUND] = "fg",
51910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_SYSTEM]     = "  ",
52010ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_AUDIO_APP]  = "aa",
52110ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten       [SP_AUDIO_SYS]  = "as",
5226647bb51301ea101b73e7431888f70bb35a4fabbTim Murray       [SP_TOP_APP]    = "ta",
52386c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    };
52486c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    if ((policy < SP_CNT) && (strings[policy] != NULL))
52586c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten        return strings[policy];
52686c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten    else
52786c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten        return "error";
52886c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten}
529