sched_policy.c revision 0384a98d6f61fa47ffde01c15e552f738e88fb94
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 260384a98d6f61fa47ffde01c15e552f738e88fb94Raphael#ifdef HAVE_SCHED_H 270384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 28493dad966305a7fb555addd367532dd2af275a27San Mehat#include <sched.h> 29493dad966305a7fb555addd367532dd2af275a27San Mehat 30493dad966305a7fb555addd367532dd2af275a27San Mehat#include <cutils/sched_policy.h> 31493dad966305a7fb555addd367532dd2af275a27San Mehat 323cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#ifndef SCHED_NORMAL 333cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat #define SCHED_NORMAL 0 343cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif 353cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 363cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#ifndef SCHED_BATCH 373cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat #define SCHED_BATCH 3 383cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat#endif 393cd5b66ba05cffe38bfa4e2da9b93292ba0b073aSan Mehat 40493dad966305a7fb555addd367532dd2af275a27San Mehatstatic int add_tid_to_cgroup(int tid, const char *grp_name) 41493dad966305a7fb555addd367532dd2af275a27San Mehat{ 42493dad966305a7fb555addd367532dd2af275a27San Mehat int fd; 43493dad966305a7fb555addd367532dd2af275a27San Mehat char path[255]; 44493dad966305a7fb555addd367532dd2af275a27San Mehat char text[64]; 45493dad966305a7fb555addd367532dd2af275a27San Mehat 46493dad966305a7fb555addd367532dd2af275a27San Mehat sprintf(path, "/dev/cpuctl/%s/tasks", grp_name); 47493dad966305a7fb555addd367532dd2af275a27San Mehat 48493dad966305a7fb555addd367532dd2af275a27San Mehat if ((fd = open(path, O_WRONLY)) < 0) 49493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 50493dad966305a7fb555addd367532dd2af275a27San Mehat 51493dad966305a7fb555addd367532dd2af275a27San Mehat sprintf(text, "%d", tid); 52493dad966305a7fb555addd367532dd2af275a27San Mehat if (write(fd, text, strlen(text)) < 0) { 53493dad966305a7fb555addd367532dd2af275a27San Mehat close(fd); 54493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 55493dad966305a7fb555addd367532dd2af275a27San Mehat } 56493dad966305a7fb555addd367532dd2af275a27San Mehat 57493dad966305a7fb555addd367532dd2af275a27San Mehat close(fd); 58493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 59493dad966305a7fb555addd367532dd2af275a27San Mehat} 60493dad966305a7fb555addd367532dd2af275a27San Mehat 61493dad966305a7fb555addd367532dd2af275a27San Mehatint set_sched_policy(int tid, SchedPolicy policy) 62493dad966305a7fb555addd367532dd2af275a27San Mehat{ 63493dad966305a7fb555addd367532dd2af275a27San Mehat static int __sys_supports_schedgroups = -1; 64493dad966305a7fb555addd367532dd2af275a27San Mehat 65493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups < 0) { 66493dad966305a7fb555addd367532dd2af275a27San Mehat if (!access("/dev/cpuctl/tasks", F_OK)) { 67493dad966305a7fb555addd367532dd2af275a27San Mehat __sys_supports_schedgroups = 1; 68493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 69493dad966305a7fb555addd367532dd2af275a27San Mehat __sys_supports_schedgroups = 0; 70493dad966305a7fb555addd367532dd2af275a27San Mehat } 71493dad966305a7fb555addd367532dd2af275a27San Mehat } 72493dad966305a7fb555addd367532dd2af275a27San Mehat 73493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups) { 74493dad966305a7fb555addd367532dd2af275a27San Mehat const char *grp = NULL; 75493dad966305a7fb555addd367532dd2af275a27San Mehat 76493dad966305a7fb555addd367532dd2af275a27San Mehat if (policy == SP_BACKGROUND) { 77493dad966305a7fb555addd367532dd2af275a27San Mehat grp = "bg_non_interactive"; 78493dad966305a7fb555addd367532dd2af275a27San Mehat } 79493dad966305a7fb555addd367532dd2af275a27San Mehat 80493dad966305a7fb555addd367532dd2af275a27San Mehat if (add_tid_to_cgroup(tid, grp)) { 81493dad966305a7fb555addd367532dd2af275a27San Mehat if (errno != ESRCH && errno != ENOENT) 82493dad966305a7fb555addd367532dd2af275a27San Mehat return -errno; 83493dad966305a7fb555addd367532dd2af275a27San Mehat } 84493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 85493dad966305a7fb555addd367532dd2af275a27San Mehat struct sched_param param; 86493dad966305a7fb555addd367532dd2af275a27San Mehat 87493dad966305a7fb555addd367532dd2af275a27San Mehat param.sched_priority = 0; 88493dad966305a7fb555addd367532dd2af275a27San Mehat sched_setscheduler(tid, 89493dad966305a7fb555addd367532dd2af275a27San Mehat (policy == SP_BACKGROUND) ? 90493dad966305a7fb555addd367532dd2af275a27San Mehat SCHED_BATCH : SCHED_NORMAL, 91493dad966305a7fb555addd367532dd2af275a27San Mehat ¶m); 92493dad966305a7fb555addd367532dd2af275a27San Mehat } 93493dad966305a7fb555addd367532dd2af275a27San Mehat 94493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 95493dad966305a7fb555addd367532dd2af275a27San Mehat} 960384a98d6f61fa47ffde01c15e552f738e88fb94Raphael 970384a98d6f61fa47ffde01c15e552f738e88fb94Raphael#endif /* HAVE_SCHED_H */ 98