10384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 2493dad966305a7fb555addd367532dd2af275a27San Mehat/* libs/cutils/sched_policy.c 3493dad966305a7fb555addd367532dd2af275a27San Mehat** 4493dad966305a7fb555addd367532dd2af275a27San Mehat** Copyright 2007, The Android Open Source Project 5493dad966305a7fb555addd367532dd2af275a27San Mehat** 6493dad966305a7fb555addd367532dd2af275a27San Mehat** Licensed under the Apache License, Version 2.0 (the "License"); 7493dad966305a7fb555addd367532dd2af275a27San Mehat** you may not use this file except in compliance with the License. 8493dad966305a7fb555addd367532dd2af275a27San Mehat** You may obtain a copy of the License at 9493dad966305a7fb555addd367532dd2af275a27San Mehat** 10493dad966305a7fb555addd367532dd2af275a27San Mehat** http://www.apache.org/licenses/LICENSE-2.0 11493dad966305a7fb555addd367532dd2af275a27San Mehat** 12493dad966305a7fb555addd367532dd2af275a27San Mehat** Unless required by applicable law or agreed to in writing, software 13493dad966305a7fb555addd367532dd2af275a27San Mehat** distributed under the License is distributed on an "AS IS" BASIS, 14493dad966305a7fb555addd367532dd2af275a27San Mehat** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15493dad966305a7fb555addd367532dd2af275a27San Mehat** See the License for the specific language governing permissions and 16493dad966305a7fb555addd367532dd2af275a27San Mehat** limitations under the License. 17493dad966305a7fb555addd367532dd2af275a27San Mehat*/ 18493dad966305a7fb555addd367532dd2af275a27San Mehat 19bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#define LOG_TAG "SchedPolicy" 20bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 21493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdio.h> 22493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdlib.h> 23493dad966305a7fb555addd367532dd2af275a27San Mehat#include <unistd.h> 24493dad966305a7fb555addd367532dd2af275a27San Mehat#include <string.h> 25493dad966305a7fb555addd367532dd2af275a27San Mehat#include <errno.h> 26493dad966305a7fb555addd367532dd2af275a27San Mehat#include <fcntl.h> 27bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#include <cutils/sched_policy.h> 28bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#include <cutils/log.h> 290384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 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 39bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#if defined(HAVE_ANDROID_OS) && defined(HAVE_SCHED_H) && defined(HAVE_PTHREADS) 400384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 41493dad966305a7fb555addd367532dd2af275a27San Mehat#include <sched.h> 4286b121523d7d3634bf5ac07b6e238b36b3e75f0aBrad Fitzpatrick#include <pthread.h> 43493dad966305a7fb555addd367532dd2af275a27San Mehat 443cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#ifndef SCHED_NORMAL 453cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat #define SCHED_NORMAL 0 463cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif 473cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 483cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#ifndef SCHED_BATCH 493cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat #define SCHED_BATCH 3 503cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif 513cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 52805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat#define POLICY_DEBUG 0 53d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 5410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten#define CAN_SET_SP_SYSTEM 0 // non-zero means to implement set_sched_policy(tid, SP_SYSTEM) 5510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten 56e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic pthread_once_t the_once = PTHREAD_ONCE_INIT; 57e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick 58c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic int __sys_supports_schedgroups = -1; 59c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 60e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick// File descriptors open to /dev/cpuctl/../tasks, setup by initialize, or -1 on error. 61e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic int bg_cgroup_fd = -1; 6210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kastenstatic int fg_cgroup_fd = -1; 6310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten#if CAN_SET_SP_SYSTEM 6410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kastenstatic int system_cgroup_fd = -1; 6510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten#endif 66e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick 67e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick/* Add tid to the scheduling group defined by the policy */ 68e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic int add_tid_to_cgroup(int tid, SchedPolicy policy) 69493dad966305a7fb555addd367532dd2af275a27San Mehat{ 70493dad966305a7fb555addd367532dd2af275a27San Mehat int fd; 71e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick 7210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten switch (policy) { 7310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_BACKGROUND: 74e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick fd = bg_cgroup_fd; 7510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 7610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_FOREGROUND: 7729319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin case SP_AUDIO_APP: 7829319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin case SP_AUDIO_SYS: 7910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten fd = fg_cgroup_fd; 8010ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 8110ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten#if CAN_SET_SP_SYSTEM 8210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_SYSTEM: 8310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten fd = system_cgroup_fd; 8410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 8510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten#endif 8610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten default: 8710ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten fd = -1; 8810ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 89e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick } 90e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick 91e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick if (fd < 0) { 9210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten SLOGE("add_tid_to_cgroup failed; policy=%d\n", policy); 93493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 94805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat } 95493dad966305a7fb555addd367532dd2af275a27San Mehat 96253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick // specialized itoa -- works for tid > 0 97253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char text[22]; 98253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char *end = text + sizeof(text) - 1; 99253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char *ptr = end; 100253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick *ptr = '\0'; 101253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick while (tid > 0) { 102253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick *--ptr = '0' + (tid % 10); 103253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick tid = tid / 10; 104253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick } 105253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick 106253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick if (write(fd, ptr, end - ptr) < 0) { 107e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick /* 108e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick * If the thread is in the process of exiting, 109e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick * don't flag an error 110e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick */ 111e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick if (errno == ESRCH) 112e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick return 0; 11310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten SLOGW("add_tid_to_cgroup failed to write '%s' (%s); policy=%d\n", 11410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten ptr, strerror(errno), policy); 115493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 116493dad966305a7fb555addd367532dd2af275a27San Mehat } 117493dad966305a7fb555addd367532dd2af275a27San Mehat 118493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 119493dad966305a7fb555addd367532dd2af275a27San Mehat} 120493dad966305a7fb555addd367532dd2af275a27San Mehat 121e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrickstatic void __initialize(void) { 122e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick char* filename; 123e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick if (!access("/dev/cpuctl/tasks", F_OK)) { 124e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick __sys_supports_schedgroups = 1; 125e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick 12610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten#if CAN_SET_SP_SYSTEM 127e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick filename = "/dev/cpuctl/tasks"; 1285b878d24c1f01a5f131d470280b51bcfb5638600Jeff Brown system_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC); 12910ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten if (system_cgroup_fd < 0) { 13010ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten SLOGV("open of %s failed: %s\n", filename, strerror(errno)); 13110ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten } 13210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten#endif 13310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten 13413ed76bfbce8e96604e781f88808b4d883891ddeDima Zavin filename = "/dev/cpuctl/apps/tasks"; 1355b878d24c1f01a5f131d470280b51bcfb5638600Jeff Brown fg_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC); 13610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten if (fg_cgroup_fd < 0) { 137e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick SLOGE("open of %s failed: %s\n", filename, strerror(errno)); 138e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick } 139e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick 14013ed76bfbce8e96604e781f88808b4d883891ddeDima Zavin filename = "/dev/cpuctl/apps/bg_non_interactive/tasks"; 1415b878d24c1f01a5f131d470280b51bcfb5638600Jeff Brown bg_cgroup_fd = open(filename, O_WRONLY | O_CLOEXEC); 142e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick if (bg_cgroup_fd < 0) { 143e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick SLOGE("open of %s failed: %s\n", filename, strerror(errno)); 144493dad966305a7fb555addd367532dd2af275a27San Mehat } 145e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick } else { 146e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick __sys_supports_schedgroups = 0; 147493dad966305a7fb555addd367532dd2af275a27San Mehat } 148c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 149c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 150c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat/* 151c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * Try to get the scheduler group. 152c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 153503df2075991cd03ddf43d14e05768a2138b9028San Mehat * The data from /proc/<pid>/cgroup looks (something) like: 154c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 2:cpu:/bg_non_interactive 155503df2075991cd03ddf43d14e05768a2138b9028San Mehat * 1:cpuacct:/ 156c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 157c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * We return the part after the "/", which will be an empty string for 158c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * the default cgroup. If the string is longer than "bufLen", the string 159c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * will be truncated. 160c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat */ 161c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic int getSchedulerGroup(int tid, char* buf, size_t bufLen) 162c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 163c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#ifdef HAVE_ANDROID_OS 164c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat char pathBuf[32]; 165503df2075991cd03ddf43d14e05768a2138b9028San Mehat char lineBuf[256]; 166503df2075991cd03ddf43d14e05768a2138b9028San Mehat FILE *fp; 167c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 168c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid); 169503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(fp = fopen(pathBuf, "r"))) { 170c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 171c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 172c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 173503df2075991cd03ddf43d14e05768a2138b9028San Mehat while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) { 174503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *next = lineBuf; 175503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *subsys; 176503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *grp; 177503df2075991cd03ddf43d14e05768a2138b9028San Mehat size_t len; 178c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 179503df2075991cd03ddf43d14e05768a2138b9028San Mehat /* Junk the first field */ 180503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!strsep(&next, ":")) { 181503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 182503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 183c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 184503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(subsys = strsep(&next, ":"))) { 185503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 186503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 187503df2075991cd03ddf43d14e05768a2138b9028San Mehat 188503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (strcmp(subsys, "cpu")) { 189503df2075991cd03ddf43d14e05768a2138b9028San Mehat /* Not the subsys we're looking for */ 190503df2075991cd03ddf43d14e05768a2138b9028San Mehat continue; 191503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 192503df2075991cd03ddf43d14e05768a2138b9028San Mehat 193503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(grp = strsep(&next, ":"))) { 194503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 195503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 196503df2075991cd03ddf43d14e05768a2138b9028San Mehat grp++; /* Drop the leading '/' */ 197503df2075991cd03ddf43d14e05768a2138b9028San Mehat len = strlen(grp); 198503df2075991cd03ddf43d14e05768a2138b9028San Mehat grp[len-1] = '\0'; /* Drop the trailing '\n' */ 199503df2075991cd03ddf43d14e05768a2138b9028San Mehat 200503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (bufLen <= len) { 201503df2075991cd03ddf43d14e05768a2138b9028San Mehat len = bufLen - 1; 202503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 203503df2075991cd03ddf43d14e05768a2138b9028San Mehat strncpy(buf, grp, len); 204503df2075991cd03ddf43d14e05768a2138b9028San Mehat buf[len] = '\0'; 205503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 206503df2075991cd03ddf43d14e05768a2138b9028San Mehat return 0; 207c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 208c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 2097e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGE("Failed to find cpu subsys"); 210503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 211503df2075991cd03ddf43d14e05768a2138b9028San Mehat return -1; 212503df2075991cd03ddf43d14e05768a2138b9028San Mehat out_bad_data: 2137e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGE("Bad cgroup data {%s}", lineBuf); 214503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 215503df2075991cd03ddf43d14e05768a2138b9028San Mehat return -1; 216c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#else 217c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ENOSYS; 218c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 219c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#endif 220c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 221c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 222c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint get_sched_policy(int tid, SchedPolicy *policy) 223c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 22469bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten#ifdef HAVE_GETTID 22569bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten if (tid == 0) { 22669bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten tid = gettid(); 22769bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten } 22869bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten#endif 229e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick pthread_once(&the_once, __initialize); 230c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 231c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (__sys_supports_schedgroups) { 232c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat char grpBuf[32]; 233c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (getSchedulerGroup(tid, grpBuf, sizeof(grpBuf)) < 0) 234c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 235c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (grpBuf[0] == '\0') { 23610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten *policy = SP_SYSTEM; 23713ed76bfbce8e96604e781f88808b4d883891ddeDima Zavin } else if (!strcmp(grpBuf, "apps/bg_non_interactive")) { 238c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_BACKGROUND; 23913ed76bfbce8e96604e781f88808b4d883891ddeDima Zavin } else if (!strcmp(grpBuf, "apps")) { 24010ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten *policy = SP_FOREGROUND; 241c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } else { 242c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ERANGE; 243c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 244c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 245c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } else { 246c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat int rc = sched_getscheduler(tid); 247c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (rc < 0) 248c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 249c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else if (rc == SCHED_NORMAL) 250c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_FOREGROUND; 251c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else if (rc == SCHED_BATCH) 252c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_BACKGROUND; 253c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else { 254c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ERANGE; 255c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 256c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 257c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 258c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return 0; 259c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 260c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 261c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint set_sched_policy(int tid, SchedPolicy policy) 262c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 26369bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten#ifdef HAVE_GETTID 26469bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten if (tid == 0) { 26569bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten tid = gettid(); 26669bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten } 26769bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten#endif 26869bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten policy = _policy(policy); 269e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick pthread_once(&the_once, __initialize); 270493dad966305a7fb555addd367532dd2af275a27San Mehat 271d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#if POLICY_DEBUG 272d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char statfile[64]; 273d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char statline[1024]; 274d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char thread_name[255]; 275d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat int fd; 276d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 277d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat sprintf(statfile, "/proc/%d/stat", tid); 278d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat memset(thread_name, 0, sizeof(thread_name)); 279d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 280d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat fd = open(statfile, O_RDONLY); 281d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat if (fd >= 0) { 282d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat int rc = read(fd, statline, 1023); 283d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat close(fd); 284d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat statline[rc] = 0; 285d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char *p = statline; 286d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char *q; 287d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 288d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat for (p = statline; *p != '('; p++); 289d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat p++; 290d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat for (q = p; *q != ')'; q++); 291d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 292d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat strncpy(thread_name, p, (q-p)); 293d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } 29410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten switch (policy) { 29510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_BACKGROUND: 2967e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("vvv tid %d (%s)", tid, thread_name); 29710ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 29810ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_FOREGROUND: 29929319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin case SP_AUDIO_APP: 30029319a6753569fb3ef160c2de2f1c4d9d1398178Dima Zavin case SP_AUDIO_SYS: 3017e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("^^^ tid %d (%s)", tid, thread_name); 30210ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 30310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten case SP_SYSTEM: 30410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten SLOGD("/// tid %d (%s)", tid, thread_name); 30510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 30610ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten default: 3077e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("??? tid %d (%s)", tid, thread_name); 30810ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten break; 309d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } 310d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#endif 311d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 312493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups) { 313e43c248316d0faa7bdc23de823b068c2aa3520abBrad Fitzpatrick if (add_tid_to_cgroup(tid, policy)) { 314493dad966305a7fb555addd367532dd2af275a27San Mehat if (errno != ESRCH && errno != ENOENT) 315493dad966305a7fb555addd367532dd2af275a27San Mehat return -errno; 316493dad966305a7fb555addd367532dd2af275a27San Mehat } 317493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 318493dad966305a7fb555addd367532dd2af275a27San Mehat struct sched_param param; 319493dad966305a7fb555addd367532dd2af275a27San Mehat 320493dad966305a7fb555addd367532dd2af275a27San Mehat param.sched_priority = 0; 321493dad966305a7fb555addd367532dd2af275a27San Mehat sched_setscheduler(tid, 322493dad966305a7fb555addd367532dd2af275a27San Mehat (policy == SP_BACKGROUND) ? 323493dad966305a7fb555addd367532dd2af275a27San Mehat SCHED_BATCH : SCHED_NORMAL, 324493dad966305a7fb555addd367532dd2af275a27San Mehat ¶m); 325493dad966305a7fb555addd367532dd2af275a27San Mehat } 326493dad966305a7fb555addd367532dd2af275a27San Mehat 327493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 328493dad966305a7fb555addd367532dd2af275a27San Mehat} 3290384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 330bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#else 331bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 332bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown/* Stubs for non-Android targets. */ 333bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 334bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brownint set_sched_policy(int tid, SchedPolicy policy) 335bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{ 336bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown return 0; 337bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown} 338bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 339bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brownint get_sched_policy(int tid, SchedPolicy *policy) 340bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown{ 341bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown *policy = SP_SYSTEM_DEFAULT; 342bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown return 0; 343bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown} 344bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 345bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown#endif 346bff8f3fa9848e52e3f3fe773796a03a80133992aJeff Brown 34786c7cc81891a69ace7044de667b0624c284ee82bGlenn Kastenconst char *get_sched_policy_name(SchedPolicy policy) 34886c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten{ 34969bfb1f099164ae7ba44b5d0f7ba7c47cbbafd4dGlenn Kasten policy = _policy(policy); 35086c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten static const char * const strings[SP_CNT] = { 35186c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten [SP_BACKGROUND] = "bg", 35286c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten [SP_FOREGROUND] = "fg", 35310ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten [SP_SYSTEM] = " ", 35410ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten [SP_AUDIO_APP] = "aa", 35510ec3c7645bfdb70518dc1b21df40ad5478589e3Glenn Kasten [SP_AUDIO_SYS] = "as", 35686c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten }; 35786c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten if ((policy < SP_CNT) && (strings[policy] != NULL)) 35886c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten return strings[policy]; 35986c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten else 36086c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten return "error"; 36186c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten} 36286c7cc81891a69ace7044de667b0624c284ee82bGlenn Kasten 363