From 2e336b1da1ed66e943089c812f7697f5de450936 Mon Sep 17 00:00:00 2001 From: John Reck Date: Fri, 26 Aug 2016 13:43:19 -0700 Subject: [PATCH] Fix access check Fixes a bug where USE_CPUSET used access(F_OK) as a sign that it should try writing to the cpuset path. It needs to instead use access(W_OK) to ensure that it has write access as that's what it would try to open() with. And stop trying to repeatedly open a file that doesn't exist. Change-Id: Ib391ee6f08345051c48a986a732eda30143cb614 --- libcutils/sched_policy.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libcutils/sched_policy.c b/libcutils/sched_policy.c index 32e6c2559..ad5671bf4 100644 --- a/libcutils/sched_policy.c +++ b/libcutils/sched_policy.c @@ -52,6 +52,7 @@ static inline SchedPolicy _policy(SchedPolicy p) static pthread_once_t the_once = PTHREAD_ONCE_INIT; static int __sys_supports_schedgroups = -1; +static int __sys_supports_timerslack = -1; // File descriptors open to /dev/cpuctl/../tasks, setup by initialize, or -1 on error. static int bg_cgroup_fd = -1; @@ -104,7 +105,7 @@ static int add_tid_to_cgroup(int tid, int fd) static void __initialize(void) { char* filename; - if (!access("/dev/cpuctl/tasks", F_OK)) { + if (!access("/dev/cpuctl/tasks", W_OK)) { __sys_supports_schedgroups = 1; filename = "/dev/cpuctl/tasks"; @@ -123,7 +124,7 @@ static void __initialize(void) { } #ifdef USE_CPUSETS - if (!access("/dev/cpuset/tasks", F_OK)) { + if (!access("/dev/cpuset/tasks", W_OK)) { filename = "/dev/cpuset/foreground/tasks"; fg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC); @@ -142,6 +143,10 @@ static void __initialize(void) { #endif } #endif + + char buf[64]; + snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", getpid()); + __sys_supports_timerslack = !access(buf, W_OK); } /* @@ -417,8 +422,10 @@ int set_sched_policy(int tid, SchedPolicy policy) ¶m); } - set_timerslack_ns(tid, policy == SP_BACKGROUND ? + if (__sys_supports_timerslack) { + set_timerslack_ns(tid, policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG); + } return 0; }