blob: 7553090fd3c47aa8a005d44e9157bee771b7e22e [file] [log] [blame]
Raphael0384a982009-09-15 17:10:17 -07001
San Mehat493dad92009-09-12 10:06:57 -07002/* libs/cutils/sched_policy.c
3**
4** Copyright 2007, The Android Open Source Project
5**
6** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
9**
10** http://www.apache.org/licenses/LICENSE-2.0
11**
12** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
16** limitations under the License.
17*/
18
19#include <stdio.h>
20#include <stdlib.h>
21#include <unistd.h>
22#include <string.h>
23#include <errno.h>
24#include <fcntl.h>
Raphael0384a982009-09-15 17:10:17 -070025
26#ifdef HAVE_SCHED_H
27
San Mehat493dad92009-09-12 10:06:57 -070028#include <sched.h>
San Mehat493dad92009-09-12 10:06:57 -070029
30#include <cutils/sched_policy.h>
31
San Mehat3cd5b662009-09-14 16:05:24 -070032#ifndef SCHED_NORMAL
33 #define SCHED_NORMAL 0
34#endif
35
36#ifndef SCHED_BATCH
37 #define SCHED_BATCH 3
38#endif
39
San Mehat493dad92009-09-12 10:06:57 -070040static int add_tid_to_cgroup(int tid, const char *grp_name)
41{
42 int fd;
43 char path[255];
44 char text[64];
45
46 sprintf(path, "/dev/cpuctl/%s/tasks", grp_name);
47
48 if ((fd = open(path, O_WRONLY)) < 0)
49 return -1;
50
51 sprintf(text, "%d", tid);
52 if (write(fd, text, strlen(text)) < 0) {
53 close(fd);
54 return -1;
55 }
56
57 close(fd);
58 return 0;
59}
60
61int set_sched_policy(int tid, SchedPolicy policy)
62{
63 static int __sys_supports_schedgroups = -1;
64
65 if (__sys_supports_schedgroups < 0) {
66 if (!access("/dev/cpuctl/tasks", F_OK)) {
67 __sys_supports_schedgroups = 1;
68 } else {
69 __sys_supports_schedgroups = 0;
70 }
71 }
72
73 if (__sys_supports_schedgroups) {
74 const char *grp = NULL;
75
76 if (policy == SP_BACKGROUND) {
77 grp = "bg_non_interactive";
78 }
79
80 if (add_tid_to_cgroup(tid, grp)) {
81 if (errno != ESRCH && errno != ENOENT)
82 return -errno;
83 }
84 } else {
85 struct sched_param param;
86
87 param.sched_priority = 0;
88 sched_setscheduler(tid,
89 (policy == SP_BACKGROUND) ?
90 SCHED_BATCH : SCHED_NORMAL,
91 &param);
92 }
93
94 return 0;
95}
Raphael0384a982009-09-15 17:10:17 -070096
97#endif /* HAVE_SCHED_H */