sched_policy.c revision 253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdad
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 19493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdio.h> 20493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdlib.h> 21493dad966305a7fb555addd367532dd2af275a27San Mehat#include <unistd.h> 22493dad966305a7fb555addd367532dd2af275a27San Mehat#include <string.h> 23493dad966305a7fb555addd367532dd2af275a27San Mehat#include <errno.h> 24493dad966305a7fb555addd367532dd2af275a27San Mehat#include <fcntl.h> 250384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 26d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#define LOG_TAG "SchedPolicy" 27d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#include "cutils/log.h" 28d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 290384a98d6f61fa47ffde01c15e552f738e88fb94Raphael#ifdef HAVE_SCHED_H 300384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 31493dad966305a7fb555addd367532dd2af275a27San Mehat#include <sched.h> 32493dad966305a7fb555addd367532dd2af275a27San Mehat 33493dad966305a7fb555addd367532dd2af275a27San Mehat#include <cutils/sched_policy.h> 34493dad966305a7fb555addd367532dd2af275a27San Mehat 353cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#ifndef SCHED_NORMAL 363cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat #define SCHED_NORMAL 0 373cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif 383cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 393cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#ifndef SCHED_BATCH 403cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat #define SCHED_BATCH 3 413cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif 423cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 43805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat#define POLICY_DEBUG 0 44d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 45c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic int __sys_supports_schedgroups = -1; 46c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 47253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick/* Add tid to the group defined by dev_path ("/dev/cpuctl/.../tasks") */ 48253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrickstatic int add_tid_to_cgroup(int tid, const char *dev_path) 49493dad966305a7fb555addd367532dd2af275a27San Mehat{ 50493dad966305a7fb555addd367532dd2af275a27San Mehat int fd; 51253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick if ((fd = open(dev_path, O_WRONLY)) < 0) { 52253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick SLOGE("add_tid_to_cgroup failed to open '%s' (%s)\n", dev_path, 53c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat strerror(errno)); 54493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 55805d67ab11c1bb21d494459d6167f5f67f0002ebSan Mehat } 56493dad966305a7fb555addd367532dd2af275a27San Mehat 57253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick // specialized itoa -- works for tid > 0 58253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char text[22]; 59253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char *end = text + sizeof(text) - 1; 60253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick char *ptr = end; 61253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick *ptr = '\0'; 62253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick while (tid > 0) { 63253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick *--ptr = '0' + (tid % 10); 64253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick tid = tid / 10; 65253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick } 66253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick 67253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick if (write(fd, ptr, end - ptr) < 0) { 68493dad966305a7fb555addd367532dd2af275a27San Mehat close(fd); 69c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat /* 70c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat * If the thread is in the process of exiting, 71c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat * don't flag an error 72c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat */ 73c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat if (errno == ESRCH) 74c1c38dd01c43079ed24b9030bc8a20c649bacc3fSan Mehat return 0; 75253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick SLOGW("add_tid_to_cgroup failed to write '%s' to '%s' (%s)\n", 76253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick ptr, dev_path, strerror(errno)); 77493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 78493dad966305a7fb555addd367532dd2af275a27San Mehat } 79493dad966305a7fb555addd367532dd2af275a27San Mehat 80493dad966305a7fb555addd367532dd2af275a27San Mehat close(fd); 81493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 82493dad966305a7fb555addd367532dd2af275a27San Mehat} 83493dad966305a7fb555addd367532dd2af275a27San Mehat 84c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic inline void initialize() 85493dad966305a7fb555addd367532dd2af275a27San Mehat{ 86493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups < 0) { 87493dad966305a7fb555addd367532dd2af275a27San Mehat if (!access("/dev/cpuctl/tasks", F_OK)) { 88493dad966305a7fb555addd367532dd2af275a27San Mehat __sys_supports_schedgroups = 1; 89493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 90493dad966305a7fb555addd367532dd2af275a27San Mehat __sys_supports_schedgroups = 0; 91493dad966305a7fb555addd367532dd2af275a27San Mehat } 92493dad966305a7fb555addd367532dd2af275a27San Mehat } 93c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 94c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 95c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat/* 96c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * Try to get the scheduler group. 97c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 98503df2075991cd03ddf43d14e05768a2138b9028San Mehat * The data from /proc/<pid>/cgroup looks (something) like: 99c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 2:cpu:/bg_non_interactive 100503df2075991cd03ddf43d14e05768a2138b9028San Mehat * 1:cpuacct:/ 101c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * 102c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * We return the part after the "/", which will be an empty string for 103c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * the default cgroup. If the string is longer than "bufLen", the string 104c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat * will be truncated. 105c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat */ 106c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatstatic int getSchedulerGroup(int tid, char* buf, size_t bufLen) 107c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 108c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#ifdef HAVE_ANDROID_OS 109c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat char pathBuf[32]; 110503df2075991cd03ddf43d14e05768a2138b9028San Mehat char lineBuf[256]; 111503df2075991cd03ddf43d14e05768a2138b9028San Mehat FILE *fp; 112c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 113c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid); 114503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(fp = fopen(pathBuf, "r"))) { 115c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 116c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 117c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 118503df2075991cd03ddf43d14e05768a2138b9028San Mehat while(fgets(lineBuf, sizeof(lineBuf) -1, fp)) { 119503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *next = lineBuf; 120503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *subsys; 121503df2075991cd03ddf43d14e05768a2138b9028San Mehat char *grp; 122503df2075991cd03ddf43d14e05768a2138b9028San Mehat size_t len; 123c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 124503df2075991cd03ddf43d14e05768a2138b9028San Mehat /* Junk the first field */ 125503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!strsep(&next, ":")) { 126503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 127503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 128c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 129503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(subsys = strsep(&next, ":"))) { 130503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 131503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 132503df2075991cd03ddf43d14e05768a2138b9028San Mehat 133503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (strcmp(subsys, "cpu")) { 134503df2075991cd03ddf43d14e05768a2138b9028San Mehat /* Not the subsys we're looking for */ 135503df2075991cd03ddf43d14e05768a2138b9028San Mehat continue; 136503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 137503df2075991cd03ddf43d14e05768a2138b9028San Mehat 138503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (!(grp = strsep(&next, ":"))) { 139503df2075991cd03ddf43d14e05768a2138b9028San Mehat goto out_bad_data; 140503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 141503df2075991cd03ddf43d14e05768a2138b9028San Mehat grp++; /* Drop the leading '/' */ 142503df2075991cd03ddf43d14e05768a2138b9028San Mehat len = strlen(grp); 143503df2075991cd03ddf43d14e05768a2138b9028San Mehat grp[len-1] = '\0'; /* Drop the trailing '\n' */ 144503df2075991cd03ddf43d14e05768a2138b9028San Mehat 145503df2075991cd03ddf43d14e05768a2138b9028San Mehat if (bufLen <= len) { 146503df2075991cd03ddf43d14e05768a2138b9028San Mehat len = bufLen - 1; 147503df2075991cd03ddf43d14e05768a2138b9028San Mehat } 148503df2075991cd03ddf43d14e05768a2138b9028San Mehat strncpy(buf, grp, len); 149503df2075991cd03ddf43d14e05768a2138b9028San Mehat buf[len] = '\0'; 150503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 151503df2075991cd03ddf43d14e05768a2138b9028San Mehat return 0; 152c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 153c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 1547e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGE("Failed to find cpu subsys"); 155503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 156503df2075991cd03ddf43d14e05768a2138b9028San Mehat return -1; 157503df2075991cd03ddf43d14e05768a2138b9028San Mehat out_bad_data: 1587e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGE("Bad cgroup data {%s}", lineBuf); 159503df2075991cd03ddf43d14e05768a2138b9028San Mehat fclose(fp); 160503df2075991cd03ddf43d14e05768a2138b9028San Mehat return -1; 161c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#else 162c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ENOSYS; 163c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 164c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat#endif 165c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 166c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 167c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint get_sched_policy(int tid, SchedPolicy *policy) 168c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 169c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat initialize(); 170c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 171c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (__sys_supports_schedgroups) { 172c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat char grpBuf[32]; 173c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (getSchedulerGroup(tid, grpBuf, sizeof(grpBuf)) < 0) 174c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 175c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (grpBuf[0] == '\0') { 176c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_FOREGROUND; 177c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } else if (!strcmp(grpBuf, "bg_non_interactive")) { 178c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_BACKGROUND; 179c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } else { 180c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ERANGE; 181c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 182c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 183c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } else { 184c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat int rc = sched_getscheduler(tid); 185c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat if (rc < 0) 186c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 187c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else if (rc == SCHED_NORMAL) 188c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_FOREGROUND; 189c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else if (rc == SCHED_BATCH) 190c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat *policy = SP_BACKGROUND; 191c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat else { 192c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat errno = ERANGE; 193c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return -1; 194c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 195c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat } 196c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat return 0; 197c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat} 198c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat 199c0dfca7ae1f6016461235552091c2cacacca82a2San Mehatint set_sched_policy(int tid, SchedPolicy policy) 200c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat{ 201c0dfca7ae1f6016461235552091c2cacacca82a2San Mehat initialize(); 202493dad966305a7fb555addd367532dd2af275a27San Mehat 203d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#if POLICY_DEBUG 204d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char statfile[64]; 205d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char statline[1024]; 206d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char thread_name[255]; 207d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat int fd; 208d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 209d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat sprintf(statfile, "/proc/%d/stat", tid); 210d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat memset(thread_name, 0, sizeof(thread_name)); 211d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 212d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat fd = open(statfile, O_RDONLY); 213d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat if (fd >= 0) { 214d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat int rc = read(fd, statline, 1023); 215d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat close(fd); 216d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat statline[rc] = 0; 217d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char *p = statline; 218d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat char *q; 219d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 220d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat for (p = statline; *p != '('; p++); 221d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat p++; 222d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat for (q = p; *q != ')'; q++); 223d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 224d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat strncpy(thread_name, p, (q-p)); 225d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } 226d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat if (policy == SP_BACKGROUND) { 2277e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("vvv tid %d (%s)", tid, thread_name); 228d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } else if (policy == SP_FOREGROUND) { 2297e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("^^^ tid %d (%s)", tid, thread_name); 230d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } else { 2317e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("??? tid %d (%s)", tid, thread_name); 232d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat } 233d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat#endif 234d2e4e46ce4bc29c3328fccfbbbe0590eaa8713f7San Mehat 235493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups) { 236253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick const char *dev_path; 237493dad966305a7fb555addd367532dd2af275a27San Mehat if (policy == SP_BACKGROUND) { 238253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick dev_path = "/dev/cpuctl/bg_non_interactive/tasks"; 239253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick } else { 240253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick dev_path = "/dev/cpuctl/tasks"; 241493dad966305a7fb555addd367532dd2af275a27San Mehat } 242493dad966305a7fb555addd367532dd2af275a27San Mehat 243253e27acb6c9e3e0b03c59f25cdf9ecbd64bcdadBrad Fitzpatrick if (add_tid_to_cgroup(tid, dev_path)) { 244493dad966305a7fb555addd367532dd2af275a27San Mehat if (errno != ESRCH && errno != ENOENT) 245493dad966305a7fb555addd367532dd2af275a27San Mehat return -errno; 246493dad966305a7fb555addd367532dd2af275a27San Mehat } 247493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 248493dad966305a7fb555addd367532dd2af275a27San Mehat struct sched_param param; 249493dad966305a7fb555addd367532dd2af275a27San Mehat 250493dad966305a7fb555addd367532dd2af275a27San Mehat param.sched_priority = 0; 251493dad966305a7fb555addd367532dd2af275a27San Mehat sched_setscheduler(tid, 252493dad966305a7fb555addd367532dd2af275a27San Mehat (policy == SP_BACKGROUND) ? 253493dad966305a7fb555addd367532dd2af275a27San Mehat SCHED_BATCH : SCHED_NORMAL, 254493dad966305a7fb555addd367532dd2af275a27San Mehat ¶m); 255493dad966305a7fb555addd367532dd2af275a27San Mehat } 256493dad966305a7fb555addd367532dd2af275a27San Mehat 257493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 258493dad966305a7fb555addd367532dd2af275a27San Mehat} 2590384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 2600384a98d6f61fa47ffde01c15e552f738e88fb94Raphael#endif /* HAVE_SCHED_H */ 261