sched_policy.c revision 493dad966305a7fb555addd367532dd2af275a27
1493dad966305a7fb555addd367532dd2af275a27San Mehat/* libs/cutils/sched_policy.c 2493dad966305a7fb555addd367532dd2af275a27San Mehat** 3493dad966305a7fb555addd367532dd2af275a27San Mehat** Copyright 2007, The Android Open Source Project 4493dad966305a7fb555addd367532dd2af275a27San Mehat** 5493dad966305a7fb555addd367532dd2af275a27San Mehat** Licensed under the Apache License, Version 2.0 (the "License"); 6493dad966305a7fb555addd367532dd2af275a27San Mehat** you may not use this file except in compliance with the License. 7493dad966305a7fb555addd367532dd2af275a27San Mehat** You may obtain a copy of the License at 8493dad966305a7fb555addd367532dd2af275a27San Mehat** 9493dad966305a7fb555addd367532dd2af275a27San Mehat** http://www.apache.org/licenses/LICENSE-2.0 10493dad966305a7fb555addd367532dd2af275a27San Mehat** 11493dad966305a7fb555addd367532dd2af275a27San Mehat** Unless required by applicable law or agreed to in writing, software 12493dad966305a7fb555addd367532dd2af275a27San Mehat** distributed under the License is distributed on an "AS IS" BASIS, 13493dad966305a7fb555addd367532dd2af275a27San Mehat** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14493dad966305a7fb555addd367532dd2af275a27San Mehat** See the License for the specific language governing permissions and 15493dad966305a7fb555addd367532dd2af275a27San Mehat** limitations under the License. 16493dad966305a7fb555addd367532dd2af275a27San Mehat*/ 17493dad966305a7fb555addd367532dd2af275a27San Mehat 18493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdio.h> 19493dad966305a7fb555addd367532dd2af275a27San Mehat#include <stdlib.h> 20493dad966305a7fb555addd367532dd2af275a27San Mehat#include <unistd.h> 21493dad966305a7fb555addd367532dd2af275a27San Mehat#include <string.h> 22493dad966305a7fb555addd367532dd2af275a27San Mehat#include <errno.h> 23493dad966305a7fb555addd367532dd2af275a27San Mehat#include <fcntl.h> 24493dad966305a7fb555addd367532dd2af275a27San Mehat#include <sched.h> 25493dad966305a7fb555addd367532dd2af275a27San Mehat#include <linux/sched.h> 26493dad966305a7fb555addd367532dd2af275a27San Mehat 27493dad966305a7fb555addd367532dd2af275a27San Mehat#include <cutils/sched_policy.h> 28493dad966305a7fb555addd367532dd2af275a27San Mehat 29493dad966305a7fb555addd367532dd2af275a27San Mehatstatic int add_tid_to_cgroup(int tid, const char *grp_name) 30493dad966305a7fb555addd367532dd2af275a27San Mehat{ 31493dad966305a7fb555addd367532dd2af275a27San Mehat int fd; 32493dad966305a7fb555addd367532dd2af275a27San Mehat char path[255]; 33493dad966305a7fb555addd367532dd2af275a27San Mehat char text[64]; 34493dad966305a7fb555addd367532dd2af275a27San Mehat 35493dad966305a7fb555addd367532dd2af275a27San Mehat sprintf(path, "/dev/cpuctl/%s/tasks", grp_name); 36493dad966305a7fb555addd367532dd2af275a27San Mehat 37493dad966305a7fb555addd367532dd2af275a27San Mehat if ((fd = open(path, O_WRONLY)) < 0) 38493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 39493dad966305a7fb555addd367532dd2af275a27San Mehat 40493dad966305a7fb555addd367532dd2af275a27San Mehat sprintf(text, "%d", tid); 41493dad966305a7fb555addd367532dd2af275a27San Mehat if (write(fd, text, strlen(text)) < 0) { 42493dad966305a7fb555addd367532dd2af275a27San Mehat close(fd); 43493dad966305a7fb555addd367532dd2af275a27San Mehat return -1; 44493dad966305a7fb555addd367532dd2af275a27San Mehat } 45493dad966305a7fb555addd367532dd2af275a27San Mehat 46493dad966305a7fb555addd367532dd2af275a27San Mehat close(fd); 47493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 48493dad966305a7fb555addd367532dd2af275a27San Mehat} 49493dad966305a7fb555addd367532dd2af275a27San Mehat 50493dad966305a7fb555addd367532dd2af275a27San Mehatint set_sched_policy(int tid, SchedPolicy policy) 51493dad966305a7fb555addd367532dd2af275a27San Mehat{ 52493dad966305a7fb555addd367532dd2af275a27San Mehat static int __sys_supports_schedgroups = -1; 53493dad966305a7fb555addd367532dd2af275a27San Mehat 54493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups < 0) { 55493dad966305a7fb555addd367532dd2af275a27San Mehat if (!access("/dev/cpuctl/tasks", F_OK)) { 56493dad966305a7fb555addd367532dd2af275a27San Mehat __sys_supports_schedgroups = 1; 57493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 58493dad966305a7fb555addd367532dd2af275a27San Mehat __sys_supports_schedgroups = 0; 59493dad966305a7fb555addd367532dd2af275a27San Mehat } 60493dad966305a7fb555addd367532dd2af275a27San Mehat } 61493dad966305a7fb555addd367532dd2af275a27San Mehat 62493dad966305a7fb555addd367532dd2af275a27San Mehat if (__sys_supports_schedgroups) { 63493dad966305a7fb555addd367532dd2af275a27San Mehat const char *grp = NULL; 64493dad966305a7fb555addd367532dd2af275a27San Mehat 65493dad966305a7fb555addd367532dd2af275a27San Mehat if (policy == SP_BACKGROUND) { 66493dad966305a7fb555addd367532dd2af275a27San Mehat grp = "bg_non_interactive"; 67493dad966305a7fb555addd367532dd2af275a27San Mehat } 68493dad966305a7fb555addd367532dd2af275a27San Mehat 69493dad966305a7fb555addd367532dd2af275a27San Mehat if (add_tid_to_cgroup(tid, grp)) { 70493dad966305a7fb555addd367532dd2af275a27San Mehat if (errno != ESRCH && errno != ENOENT) 71493dad966305a7fb555addd367532dd2af275a27San Mehat return -errno; 72493dad966305a7fb555addd367532dd2af275a27San Mehat } 73493dad966305a7fb555addd367532dd2af275a27San Mehat } else { 74493dad966305a7fb555addd367532dd2af275a27San Mehat struct sched_param param; 75493dad966305a7fb555addd367532dd2af275a27San Mehat 76493dad966305a7fb555addd367532dd2af275a27San Mehat param.sched_priority = 0; 77493dad966305a7fb555addd367532dd2af275a27San Mehat sched_setscheduler(tid, 78493dad966305a7fb555addd367532dd2af275a27San Mehat (policy == SP_BACKGROUND) ? 79493dad966305a7fb555addd367532dd2af275a27San Mehat SCHED_BATCH : SCHED_NORMAL, 80493dad966305a7fb555addd367532dd2af275a27San Mehat ¶m); 81493dad966305a7fb555addd367532dd2af275a27San Mehat } 82493dad966305a7fb555addd367532dd2af275a27San Mehat 83493dad966305a7fb555addd367532dd2af275a27San Mehat return 0; 84493dad966305a7fb555addd367532dd2af275a27San Mehat} 85