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 30bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Re-map SP_DEFAULT to the system default policy, and leave other values unchanged. 31bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Call this any place a SchedPolicy is used as an input parameter. 32bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown * Returns the possibly re-mapped policy. 33bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown */ 34bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brownstatic inline SchedPolicy _policy(SchedPolicy p) 35bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{ 36bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown return p == SP_DEFAULT ? SP_SYSTEM_DEFAULT : p; 37bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown} 38d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 399b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__) 400384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 4186b121523d7d3634bf5ac07b6e238b36b3e75f0aBrad Fitzpatrick#include <pthread.h> 42e07d77e422b328f0b7e8a542e99989dab8c95dacElliott Hughes#include <sched.h> 43e07d77e422b328f0b7e8a542e99989dab8c95dacElliott Hughes#include <sys/prctl.h> 443cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 45805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat#define POLICY_DEBUG 0 46d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 47422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi// timer slack value in nS enforced when the thread moves to background 48422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi#define TIMER_SLACK_BG 40000000 494cdce427f9ba0339ac7c58fdb4f56ac3630abf34Todd Kjos#define TIMER_SLACK_FG 50000 50422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi 51e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic pthread_once_t the_once = PTHREAD_ONCE_INIT; 52e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick 532e336b1da1ed66e943089c812f7697f5de450936John Reckstatic int __sys_supports_timerslack = -1; 54c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 55b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray// File descriptors open to /dev/cpuset/../tasks, setup by initialize, or -1 on error 564284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murraystatic int system_bg_cpuset_fd = -1; 57b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int bg_cpuset_fd = -1; 58b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int fg_cpuset_fd = -1; 596647bb51301ea101b73e7431888f70bb35a4fabbTim Murraystatic int ta_cpuset_fd = -1; // special cpuset for top app 60658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murraystatic int rs_cpuset_fd = -1; // special cpuset for screen off restrictions 61aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray 62aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray// File descriptors open to /dev/stune/../tasks, setup by initialize, or -1 on error 63ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjosstatic int bg_schedboost_fd = -1; 64ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjosstatic int fg_schedboost_fd = -1; 65955694b657012c50312de99e6f78084beae52d60Tim Murraystatic int ta_schedboost_fd = -1; 6688ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandesstatic int rt_schedboost_fd = -1; 67b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray 68e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick/* Add tid to the scheduling group defined by the policy */ 69b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murraystatic int add_tid_to_cgroup(int tid, int fd) 70493dad966305a7fb555addd367532dd2af275a27San Mehat{ 71e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick if (fd < 0) { 72b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray SLOGE("add_tid_to_cgroup failed; fd=%d\n", fd); 73b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray errno = EINVAL; 74493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 75805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat } 76493dad966305a7fb555addd367532dd2af275a27San Mehat 77253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick // specialized itoa -- works for tid > 0 78253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char text[22]; 79253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char *end = text + sizeof(text) - 1; 80253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char *ptr = end; 81253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick *ptr = '\0'; 82253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick while (tid > 0) { 83253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick *--ptr = '0' + (tid % 10); 84253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick tid = tid / 10; 85253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick } 86253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick 87253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick if (write(fd, ptr, end - ptr) < 0) { 88e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick /* 89e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick * If the thread is in the process of exiting, 90e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick * don't flag an error 91e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick */ 92e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick if (errno == ESRCH) 93e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick return 0; 94b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray SLOGW("add_tid_to_cgroup failed to write '%s' (%s); fd=%d\n", 95b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray ptr, strerror(errno), fd); 96b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray errno = EINVAL; 97493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 98493dad966305a7fb555addd367532dd2af275a27San Mehat } 99493dad966305a7fb555addd367532dd2af275a27San Mehat 100493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 101493dad966305a7fb555addd367532dd2af275a27San Mehat} 102493dad966305a7fb555addd367532dd2af275a27San Mehat 103795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen/* 104795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen If CONFIG_CPUSETS for Linux kernel is set, "tasks" can be found under 105795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen /dev/cpuset mounted in init.rc; otherwise, that file does not exist 106795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen even though the directory, /dev/cpuset, is still created (by init.rc). 107795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 108795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen A couple of other candidates (under cpuset mount directory): 109795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen notify_on_release 110795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen release_agent 111795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 112795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen Yet another way to decide if cpuset is enabled is to parse 113795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen /proc/self/status and search for lines begin with "Mems_allowed". 114795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 115795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen If CONFIG_PROC_PID_CPUSET is set, the existence "/proc/self/cpuset" can 116795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen be used to decide if CONFIG_CPUSETS is set, so we don't have a dependency 117795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen on where init.rc mounts cpuset. That's why we'd better require this 118795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen configuration be set if CONFIG_CPUSETS is set. 119795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 12076a934a459138ddfe8e0985e7cc2d0aba6749c42Elliott Hughes In older releases, this was controlled by build-time configuration. 121795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen */ 122795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenbool cpusets_enabled() { 123795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen static bool enabled = (access("/dev/cpuset/tasks", F_OK) == 0); 124795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 125795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen return enabled; 126795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen} 127795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 128795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen/* 129795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen Similar to CONFIG_CPUSETS above, but with a different configuration 1302d998ea99bd650aafc270f5d0599fc0b8d2c0ce7Alex Naidis CONFIG_CGROUP_SCHEDTUNE that's in Android common Linux kernel and Linaro 131795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen Stable Kernel (LSK), but not in mainline Linux as of v4.9. 132795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 1335dc7736f601849fb76e00edadeb6b6a142b7a322Elliott Hughes In older releases, this was controlled by build-time configuration. 134795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen */ 135795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenbool schedboost_enabled() { 136795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen static bool enabled = (access("/dev/stune/tasks", F_OK) == 0); 137795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 138795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen return enabled; 139795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen} 140795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 141795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chenstatic void __initialize() { 142795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen const char* filename; 143b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray 144795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen if (cpusets_enabled()) { 145795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen if (!access("/dev/cpuset/tasks", W_OK)) { 146795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 147795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen filename = "/dev/cpuset/foreground/tasks"; 148795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC); 149795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen filename = "/dev/cpuset/background/tasks"; 150795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC); 151795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen filename = "/dev/cpuset/system-background/tasks"; 152795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC); 153795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen filename = "/dev/cpuset/top-app/tasks"; 154795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC); 155658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray filename = "/dev/cpuset/restricted/tasks"; 156658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray rs_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC); 157795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 158795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen if (schedboost_enabled()) { 159795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen filename = "/dev/stune/top-app/tasks"; 160795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen ta_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC); 161795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen filename = "/dev/stune/foreground/tasks"; 162795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen fg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC); 163795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen filename = "/dev/stune/background/tasks"; 164795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen bg_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC); 16588ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes filename = "/dev/stune/rt/tasks"; 16688ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes rt_schedboost_fd = open(filename, O_WRONLY | O_CLOEXEC); 167795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen } 168795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen } 169b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray } 1702e336b1da1ed66e943089c812f7697f5de450936John Reck 1712e336b1da1ed66e943089c812f7697f5de450936John Reck char buf[64]; 1722e336b1da1ed66e943089c812f7697f5de450936John Reck snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid()); 1732e336b1da1ed66e943089c812f7697f5de450936John Reck __sys_supports_timerslack = !access(buf, W_OK); 174c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 175c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 176c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat/* 1777b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen * Returns the path under the requested cgroup subsystem (if it exists) 178c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 179503df2075991cd03ddf43d14e05768a2138b9028San Mehat * The data from /proc/<pid>/cgroup looks (something) like: 180c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 2:cpu:/bg_non_interactive 181503df2075991cd03ddf43d14e05768a2138b9028San Mehat * 1:cpuacct:/ 182c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 183c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * We return the part after the "/", which will be an empty string for 184c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * the default cgroup. If the string is longer than "bufLen", the string 185c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * will be truncated. 186c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat */ 1877b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenenstatic int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen) 188c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 1899b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__) 190c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat char pathBuf[32]; 191503df2075991cd03ddf43d14e05768a2138b9028San Mehat char lineBuf[256]; 192503df2075991cd03ddf43d14e05768a2138b9028San Mehat FILE *fp; 193c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 194c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid); 1952f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz if (!(fp = fopen(pathBuf, "re"))) { 196c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 197c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 198c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 199503df2075991cd03ddf43d14e05768a2138b9028San Mehat while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) { 200503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *next = lineBuf; 2017b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen char *found_subsys; 202503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *grp; 203503df2075991cd03ddf43d14e05768a2138b9028San Mehat size_t len; 204c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 205503df2075991cd03ddf43d14e05768a2138b9028San Mehat /* Junk the first field */ 206503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!strsep(&next, ":")) { 207503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 208503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 209c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 2107b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen if (!(found_subsys = strsep(&next, ":"))) { 211503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 212503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 213503df2075991cd03ddf43d14e05768a2138b9028San Mehat 2147b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen if (strcmp(found_subsys, subsys)) { 215503df2075991cd03ddf43d14e05768a2138b9028San Mehat /* Not the subsys we're looking for */ 216503df2075991cd03ddf43d14e05768a2138b9028San Mehat continue; 217503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 218503df2075991cd03ddf43d14e05768a2138b9028San Mehat 219503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(grp = strsep(&next, ":"))) { 220503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 221503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 222503df2075991cd03ddf43d14e05768a2138b9028San Mehat grp++; /* Drop the leading '/' */ 223503df2075991cd03ddf43d14e05768a2138b9028San Mehat len = strlen(grp); 224503df2075991cd03ddf43d14e05768a2138b9028San Mehat grp[len-1] = '\0'; /* Drop the trailing '\n' */ 225503df2075991cd03ddf43d14e05768a2138b9028San Mehat 226503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (bufLen <= len) { 227503df2075991cd03ddf43d14e05768a2138b9028San Mehat len = bufLen - 1; 228503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 229503df2075991cd03ddf43d14e05768a2138b9028San Mehat strncpy(buf, grp, len); 230503df2075991cd03ddf43d14e05768a2138b9028San Mehat buf[len] = '\0'; 231503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 232503df2075991cd03ddf43d14e05768a2138b9028San Mehat return 0; 233c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 234c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 2357b173a148befe5fdc6ce7485238ff2f51d1995a2Martijn Coenen SLOGE("Failed to find subsys %s", subsys); 236503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 237503df2075991cd03ddf43d14e05768a2138b9028San Mehat return -1; 238503df2075991cd03ddf43d14e05768a2138b9028San Mehat out_bad_data: 2397e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGE("Bad cgroup data {%s}", lineBuf); 240503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 241503df2075991cd03ddf43d14e05768a2138b9028San Mehat return -1; 242c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#else 243c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ENOSYS; 244c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 245c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#endif 246c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 247c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 248c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint get_sched_policy(int tid, SchedPolicy *policy) 249c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 25069bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten if (tid == 0) { 25169bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten tid = gettid(); 25269bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten } 253e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick pthread_once(&the_once, __initialize); 254c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 25540267986dab665b206773f834153783898e50294Wei Wang char grpBuf[32]; 25640267986dab665b206773f834153783898e50294Wei Wang 257b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats grpBuf[0] = '\0'; 258b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats if (schedboost_enabled()) { 259b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats if (getCGroupSubsys(tid, "schedtune", grpBuf, sizeof(grpBuf)) < 0) return -1; 260b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats } 261b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats if ((grpBuf[0] == '\0') && cpusets_enabled()) { 26240267986dab665b206773f834153783898e50294Wei Wang if (getCGroupSubsys(tid, "cpuset", grpBuf, sizeof(grpBuf)) < 0) return -1; 263b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats } 264b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats if (grpBuf[0] == '\0') { 265b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats *policy = SP_FOREGROUND; 266b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats } else if (!strcmp(grpBuf, "foreground")) { 267a8d59faa753c027e7375067f96a30e6429178105Wei Wang *policy = SP_FOREGROUND; 268b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats } else if (!strcmp(grpBuf, "system-background")) { 269b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats *policy = SP_SYSTEM; 270b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats } else if (!strcmp(grpBuf, "background")) { 271b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats *policy = SP_BACKGROUND; 272b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats } else if (!strcmp(grpBuf, "top-app")) { 273b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats *policy = SP_TOP_APP; 274b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats } else { 275b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats errno = ERANGE; 276b4c4654c7ca829865c8ecfe74d1a15de11375926Erik Staats return -1; 277c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 278c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return 0; 279c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 280c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 281b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murrayint set_cpuset_policy(int tid, SchedPolicy policy) 282b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray{ 283b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray // in the absence of cpusets, use the old sched policy 284795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen if (!cpusets_enabled()) { 285795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen return set_sched_policy(tid, policy); 286795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen } 287795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen 288b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray if (tid == 0) { 289b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray tid = gettid(); 290b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray } 291b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray policy = _policy(policy); 292b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray pthread_once(&the_once, __initialize); 293b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray 294b43225eefb0e60858755d72103f9f9b53785b5d9Tim Murray int fd = -1; 295b43225eefb0e60858755d72103f9f9b53785b5d9Tim Murray int boost_fd = -1; 296b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray switch (policy) { 297b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray case SP_BACKGROUND: 298b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray fd = bg_cpuset_fd; 299ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos boost_fd = bg_schedboost_fd; 300b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray break; 301b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray case SP_FOREGROUND: 302b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray case SP_AUDIO_APP: 303b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray case SP_AUDIO_SYS: 304b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray fd = fg_cpuset_fd; 305955694b657012c50312de99e6f78084beae52d60Tim Murray boost_fd = fg_schedboost_fd; 3064284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray break; 3076647bb51301ea101b73e7431888f70bb35a4fabbTim Murray case SP_TOP_APP : 3086647bb51301ea101b73e7431888f70bb35a4fabbTim Murray fd = ta_cpuset_fd; 309955694b657012c50312de99e6f78084beae52d60Tim Murray boost_fd = ta_schedboost_fd; 3106647bb51301ea101b73e7431888f70bb35a4fabbTim Murray break; 3114284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray case SP_SYSTEM: 3124284f9f3a3d471208d7a9341056e4d7af886dab3Tim Murray fd = system_bg_cpuset_fd; 313b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray break; 314658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray case SP_RESTRICTED: 315658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray fd = rs_cpuset_fd; 316658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray break; 317b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray default: 318ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos boost_fd = fd = -1; 319b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray break; 320b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray } 321b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray 322b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray if (add_tid_to_cgroup(tid, fd) != 0) { 323b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray if (errno != ESRCH && errno != ENOENT) 324b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray return -errno; 325b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray } 326b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray 327795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen if (schedboost_enabled()) { 328795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) { 329795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen if (errno != ESRCH && errno != ENOENT) 330795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen return -errno; 331795267d4c74821cce884c6f1e1082f00e8e12c4aIsaac Chen } 332ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos } 333ba8a47531c5ebc5e1322088354d2114f6892f3fdTodd Kjos 334999102664c4aa752d7e90c7c5ec5da9e1d648ac9Tim Murray return 0; 335b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray} 336b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray 337f5b8e3466055952449a499c6b0634018980d759bStephen Cranestatic void set_timerslack_ns(int tid, unsigned long slack) { 338d7967c1347cf83b7ff621629aeb69f5fb57d9976Elliott Hughes // v4.6+ kernels support the /proc/<tid>/timerslack_ns interface. 339d7967c1347cf83b7ff621629aeb69f5fb57d9976Elliott Hughes // TODO: once we've backported this, log if the open(2) fails. 340d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats if (__sys_supports_timerslack) { 341d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats char buf[64]; 342d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid); 343d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats int fd = open(buf, O_WRONLY | O_CLOEXEC); 344d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats if (fd != -1) { 345f5b8e3466055952449a499c6b0634018980d759bStephen Crane int len = snprintf(buf, sizeof(buf), "%lu", slack); 346d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats if (write(fd, buf, len) != len) { 347d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno)); 348d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats } 349d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats close(fd); 350d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats return; 351d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats } 352d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats } 353d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats 354d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats // TODO: Remove when /proc/<tid>/timerslack_ns interface is backported. 355d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats if ((tid == 0) || (tid == gettid())) { 356d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats if (prctl(PR_SET_TIMERSLACK, slack) == -1) { 357d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats SLOGE("set_timerslack_ns prctl failed: %s\n", strerror(errno)); 3582f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz } 3592f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz } 3602f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz} 3612f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz 362c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint set_sched_policy(int tid, SchedPolicy policy) 363c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 36469bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten if (tid == 0) { 36569bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten tid = gettid(); 36669bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten } 36769bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten policy = _policy(policy); 368e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick pthread_once(&the_once, __initialize); 369493dad966305a7fb555addd367532dd2af275a27San Mehat 370d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#if POLICY_DEBUG 371d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char statfile[64]; 372d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char statline[1024]; 373d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char thread_name[255]; 374d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 375a2f37e4fd719722064438d5ca34f88a7fa9a5886Raja M snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid); 376d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat memset(thread_name, 0, sizeof(thread_name)); 377d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 3782f13f0a48a6fded990e68b03ab1e44edf8c58164John Stultz int fd = open(statfile, O_RDONLY | O_CLOEXEC); 379d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat if (fd >= 0) { 380d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat int rc = read(fd, statline, 1023); 381d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat close(fd); 382d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat statline[rc] = 0; 383d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char *p = statline; 384d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char *q; 385d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 386d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat for (p = statline; *p != '('; p++); 387d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat p++; 388d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat for (q = p; *q != ')'; q++); 389d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 390d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat strncpy(thread_name, p, (q-p)); 391d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } 39210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten switch (policy) { 39310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_BACKGROUND: 3947e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("vvv tid %d (%s)", tid, thread_name); 39510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 39610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_FOREGROUND: 39729319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin case SP_AUDIO_APP: 39829319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin case SP_AUDIO_SYS: 3996647bb51301ea101b73e7431888f70bb35a4fabbTim Murray case SP_TOP_APP: 4007e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("^^^ tid %d (%s)", tid, thread_name); 40110ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 40210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_SYSTEM: 40310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten SLOGD("/// tid %d (%s)", tid, thread_name); 40410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 40588ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes case SP_RT_APP: 40688ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes SLOGD("RT tid %d (%s)", tid, thread_name); 40788ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes break; 40810ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten default: 4097e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("??? tid %d (%s)", tid, thread_name); 41010ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 411d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } 412d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#endif 413d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 41440267986dab665b206773f834153783898e50294Wei Wang if (schedboost_enabled()) { 415aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray int boost_fd = -1; 416b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray switch (policy) { 417b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray case SP_BACKGROUND: 418aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray boost_fd = bg_schedboost_fd; 419b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray break; 420b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray case SP_FOREGROUND: 421b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray case SP_AUDIO_APP: 422b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray case SP_AUDIO_SYS: 423955694b657012c50312de99e6f78084beae52d60Tim Murray boost_fd = fg_schedboost_fd; 424aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray break; 4256647bb51301ea101b73e7431888f70bb35a4fabbTim Murray case SP_TOP_APP: 426955694b657012c50312de99e6f78084beae52d60Tim Murray boost_fd = ta_schedboost_fd; 427b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray break; 42888ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes case SP_RT_APP: 42988ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes boost_fd = rt_schedboost_fd; 43088ef9f062950e6f38efae82fd2527cda2c8883f4Joel Fernandes break; 431b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray default: 432aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray boost_fd = -1; 433b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray break; 434b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray } 435b769c8d24fd7be96f8968aa4c80b669525b930d3Tim Murray 43640267986dab665b206773f834153783898e50294Wei Wang if (boost_fd > 0 && add_tid_to_cgroup(tid, boost_fd) != 0) { 437493dad966305a7fb555addd367532dd2af275a27San Mehat if (errno != ESRCH && errno != ENOENT) 438493dad966305a7fb555addd367532dd2af275a27San Mehat return -errno; 439493dad966305a7fb555addd367532dd2af275a27San Mehat } 440aa45cb85e3d5d7f717feab6fe421ef377301c559Tim Murray 441493dad966305a7fb555addd367532dd2af275a27San Mehat } 442493dad966305a7fb555addd367532dd2af275a27San Mehat 443d32331fb272048eeb55184bee15071fb95b6a6c2Erik Staats set_timerslack_ns(tid, policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG); 444422852ef5c0c2b0b5e031f80f480486df3d185a0Ruchi Kandoi 445493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 446493dad966305a7fb555addd367532dd2af275a27San Mehat} 4470384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 448bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#else 449bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 450bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Stubs for non-Android targets. */ 451bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 45238d2567c9ffa089661e784b63a5448f8a16572c8Elliott Hughesint set_sched_policy(int /*tid*/, SchedPolicy /*policy*/) { 453bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown return 0; 454bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown} 455bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 45638d2567c9ffa089661e784b63a5448f8a16572c8Elliott Hughesint get_sched_policy(int /*tid*/, SchedPolicy* policy) { 457bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown *policy = SP_SYSTEM_DEFAULT; 458bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown return 0; 459bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown} 460bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 461bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#endif 462bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 46386c7cc81891a69ace7044de667b0624c284ee82bGlenn Kastenconst char *get_sched_policy_name(SchedPolicy policy) 46486c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten{ 46569bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten policy = _policy(policy); 466658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray static const char* const strings[SP_CNT] = { 467658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray [SP_BACKGROUND] = "bg", [SP_FOREGROUND] = "fg", [SP_SYSTEM] = " ", 468658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray [SP_AUDIO_APP] = "aa", [SP_AUDIO_SYS] = "as", [SP_TOP_APP] = "ta", 469658ae90f699bd21ec8d79b18a34765ed5993c828Tim Murray [SP_RT_APP] = "rt", [SP_RESTRICTED] = "rs", 47086c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten }; 47186c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten if ((policy < SP_CNT) && (strings[policy] != NULL)) 47286c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten return strings[policy]; 47386c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten else 47486c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten return "error"; 47586c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten} 476