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 ¶m); 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