am e43c2483: More fixes to Binder perf regression from Eclair
Merge commit 'e43c248316d0faa7bdc23de823b068c2aa3520ab' into froyo-plus-aosp * commit 'e43c248316d0faa7bdc23de823b068c2aa3520ab': More fixes to Binder perf regression from Eclair
This commit is contained in:
commit
218faa30d5
|
@ -22,6 +22,7 @@
|
|||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#define LOG_TAG "SchedPolicy"
|
||||
#include "cutils/log.h"
|
||||
|
@ -42,15 +43,28 @@
|
|||
|
||||
#define POLICY_DEBUG 0
|
||||
|
||||
static pthread_once_t the_once = PTHREAD_ONCE_INIT;
|
||||
|
||||
static int __sys_supports_schedgroups = -1;
|
||||
|
||||
/* Add tid to the group defined by dev_path ("/dev/cpuctl/.../tasks") */
|
||||
static int add_tid_to_cgroup(int tid, const char *dev_path)
|
||||
// File descriptors open to /dev/cpuctl/../tasks, setup by initialize, or -1 on error.
|
||||
static int normal_cgroup_fd = -1;
|
||||
static int bg_cgroup_fd = -1;
|
||||
|
||||
/* Add tid to the scheduling group defined by the policy */
|
||||
static int add_tid_to_cgroup(int tid, SchedPolicy policy)
|
||||
{
|
||||
int fd;
|
||||
if ((fd = open(dev_path, O_WRONLY)) < 0) {
|
||||
SLOGE("add_tid_to_cgroup failed to open '%s' (%s)\n", dev_path,
|
||||
strerror(errno));
|
||||
|
||||
if (policy == SP_BACKGROUND) {
|
||||
fd = bg_cgroup_fd;
|
||||
} else {
|
||||
fd = normal_cgroup_fd;
|
||||
}
|
||||
|
||||
if (fd < 0) {
|
||||
SLOGE("add_tid_to_cgroup failed; background=%d\n",
|
||||
policy == SP_BACKGROUND ? 1 : 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -65,30 +79,38 @@ static int add_tid_to_cgroup(int tid, const char *dev_path)
|
|||
}
|
||||
|
||||
if (write(fd, ptr, end - ptr) < 0) {
|
||||
close(fd);
|
||||
/*
|
||||
* If the thread is in the process of exiting,
|
||||
* don't flag an error
|
||||
*/
|
||||
if (errno == ESRCH)
|
||||
return 0;
|
||||
SLOGW("add_tid_to_cgroup failed to write '%s' to '%s' (%s)\n",
|
||||
ptr, dev_path, strerror(errno));
|
||||
/*
|
||||
* If the thread is in the process of exiting,
|
||||
* don't flag an error
|
||||
*/
|
||||
if (errno == ESRCH)
|
||||
return 0;
|
||||
SLOGW("add_tid_to_cgroup failed to write '%s' (%s); background=%d\n",
|
||||
ptr, strerror(errno), policy == SP_BACKGROUND ? 1 : 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void initialize()
|
||||
{
|
||||
if (__sys_supports_schedgroups < 0) {
|
||||
if (!access("/dev/cpuctl/tasks", F_OK)) {
|
||||
__sys_supports_schedgroups = 1;
|
||||
} else {
|
||||
__sys_supports_schedgroups = 0;
|
||||
static void __initialize(void) {
|
||||
char* filename;
|
||||
if (!access("/dev/cpuctl/tasks", F_OK)) {
|
||||
__sys_supports_schedgroups = 1;
|
||||
|
||||
filename = "/dev/cpuctl/tasks";
|
||||
normal_cgroup_fd = open(filename, O_WRONLY);
|
||||
if (normal_cgroup_fd < 0) {
|
||||
SLOGE("open of %s failed: %s\n", filename, strerror(errno));
|
||||
}
|
||||
|
||||
filename = "/dev/cpuctl/bg_non_interactive/tasks";
|
||||
bg_cgroup_fd = open(filename, O_WRONLY);
|
||||
if (bg_cgroup_fd < 0) {
|
||||
SLOGE("open of %s failed: %s\n", filename, strerror(errno));
|
||||
}
|
||||
} else {
|
||||
__sys_supports_schedgroups = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -166,7 +188,7 @@ static int getSchedulerGroup(int tid, char* buf, size_t bufLen)
|
|||
|
||||
int get_sched_policy(int tid, SchedPolicy *policy)
|
||||
{
|
||||
initialize();
|
||||
pthread_once(&the_once, __initialize);
|
||||
|
||||
if (__sys_supports_schedgroups) {
|
||||
char grpBuf[32];
|
||||
|
@ -198,7 +220,7 @@ int get_sched_policy(int tid, SchedPolicy *policy)
|
|||
|
||||
int set_sched_policy(int tid, SchedPolicy policy)
|
||||
{
|
||||
initialize();
|
||||
pthread_once(&the_once, __initialize);
|
||||
|
||||
#if POLICY_DEBUG
|
||||
char statfile[64];
|
||||
|
@ -233,14 +255,7 @@ int set_sched_policy(int tid, SchedPolicy policy)
|
|||
#endif
|
||||
|
||||
if (__sys_supports_schedgroups) {
|
||||
const char *dev_path;
|
||||
if (policy == SP_BACKGROUND) {
|
||||
dev_path = "/dev/cpuctl/bg_non_interactive/tasks";
|
||||
} else {
|
||||
dev_path = "/dev/cpuctl/tasks";
|
||||
}
|
||||
|
||||
if (add_tid_to_cgroup(tid, dev_path)) {
|
||||
if (add_tid_to_cgroup(tid, policy)) {
|
||||
if (errno != ESRCH && errno != ENOENT)
|
||||
return -errno;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue