Merge changes Iefcb1ec9,I6df97295

* changes:
  Rewrite get_sched_policy_name for safety.
  cutils: add restricted cpuset
This commit is contained in:
Elliott Hughes 2018-04-25 23:46:53 +00:00 committed by Gerrit Code Review
commit efbbe6120b
4 changed files with 37 additions and 32 deletions

View File

@ -164,6 +164,7 @@ cc_library {
shared_libs: ["liblog"],
header_libs: [
"libbase_headers",
"libcutils_headers",
"libutils_headers",
],

View File

@ -40,16 +40,17 @@ extern bool schedboost_enabled();
/* Keep in sync with THREAD_GROUP_* in frameworks/base/core/java/android/os/Process.java */
typedef enum {
SP_DEFAULT = -1,
SP_DEFAULT = -1,
SP_BACKGROUND = 0,
SP_FOREGROUND = 1,
SP_SYSTEM = 2, // can't be used with set_sched_policy()
SP_AUDIO_APP = 3,
SP_AUDIO_SYS = 4,
SP_TOP_APP = 5,
SP_RT_APP = 6,
SP_SYSTEM = 2, // can't be used with set_sched_policy()
SP_AUDIO_APP = 3,
SP_AUDIO_SYS = 4,
SP_TOP_APP = 5,
SP_RT_APP = 6,
SP_RESTRICTED = 7,
SP_CNT,
SP_MAX = SP_CNT - 1,
SP_MAX = SP_CNT - 1,
SP_SYSTEM_DEFAULT = SP_FOREGROUND,
} SchedPolicy;

View File

@ -25,6 +25,7 @@
#include <string.h>
#include <unistd.h>
#include <android-base/macros.h>
#include <log/log.h>
/* Re-map SP_DEFAULT to the system default policy, and leave other values unchanged.
@ -57,6 +58,7 @@ static int system_bg_cpuset_fd = -1;
static int bg_cpuset_fd = -1;
static int fg_cpuset_fd = -1;
static int ta_cpuset_fd = -1; // special cpuset for top app
static int rs_cpuset_fd = -1; // special cpuset for screen off restrictions
// File descriptors open to /dev/stune/../tasks, setup by initialize, or -1 on error
static int bg_schedboost_fd = -1;
@ -151,6 +153,8 @@ static void __initialize() {
system_bg_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
filename = "/dev/cpuset/top-app/tasks";
ta_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
filename = "/dev/cpuset/restricted/tasks";
rs_cpuset_fd = open(filename, O_WRONLY | O_CLOEXEC);
if (schedboost_enabled()) {
filename = "/dev/stune/top-app/tasks";
@ -308,6 +312,9 @@ int set_cpuset_policy(int tid, SchedPolicy policy)
case SP_SYSTEM:
fd = system_bg_cpuset_fd;
break;
case SP_RESTRICTED:
fd = rs_cpuset_fd;
break;
default:
boost_fd = fd = -1;
break;
@ -454,20 +461,16 @@ int get_sched_policy(int /*tid*/, SchedPolicy* policy) {
#endif
const char *get_sched_policy_name(SchedPolicy policy)
{
const char* get_sched_policy_name(SchedPolicy policy) {
policy = _policy(policy);
static const char * const strings[SP_CNT] = {
[SP_BACKGROUND] = "bg",
[SP_FOREGROUND] = "fg",
[SP_SYSTEM] = " ",
[SP_AUDIO_APP] = "aa",
[SP_AUDIO_SYS] = "as",
[SP_TOP_APP] = "ta",
[SP_RT_APP] = "rt",
static const char* const kSchedPolicyNames[] = {
[SP_BACKGROUND] = "bg", [SP_FOREGROUND] = "fg", [SP_SYSTEM] = " ",
[SP_AUDIO_APP] = "aa", [SP_AUDIO_SYS] = "as", [SP_TOP_APP] = "ta",
[SP_RT_APP] = "rt", [SP_RESTRICTED] = "rs",
};
if ((policy < SP_CNT) && (strings[policy] != NULL))
return strings[policy];
else
static_assert(arraysize(kSchedPolicyNames) == SP_CNT, "missing name");
if (policy < SP_BACKGROUND || policy >= SP_CNT) {
return "error";
}
return kSchedPolicyNames[policy];
}

View File

@ -60,6 +60,12 @@ long long medianSleepTime() {
return sleepTimes[median];
}
static void AssertPolicy(SchedPolicy expected_policy) {
SchedPolicy current_policy;
ASSERT_EQ(0, get_sched_policy(0, &current_policy));
EXPECT_EQ(expected_policy, current_policy);
}
TEST(SchedPolicy, set_sched_policy) {
if (!hasCapSysNice()) {
GTEST_LOG_(INFO) << "skipping test that requires CAP_SYS_NICE";
@ -76,23 +82,17 @@ TEST(SchedPolicy, set_sched_policy) {
const unsigned int BG_FG_SLACK_FACTOR = 100;
ASSERT_EQ(0, set_sched_policy(0, SP_BACKGROUND));
AssertPolicy(SP_BACKGROUND);
auto bgSleepTime = medianSleepTime();
ASSERT_EQ(0, set_sched_policy(0, SP_FOREGROUND));
AssertPolicy(SP_FOREGROUND);
auto fgSleepTime = medianSleepTime();
ASSERT_GT(bgSleepTime, fgSleepTime * BG_FG_SLACK_FACTOR);
}
TEST(SchedPolicy, get_sched_policy) {
SchedPolicy policy;
ASSERT_EQ(0, get_sched_policy(0, &policy));
const char *policyName = get_sched_policy_name(policy);
EXPECT_NE(nullptr, policyName);
EXPECT_STRNE("error", policyName);
ASSERT_EQ(0, set_sched_policy(0, SP_BACKGROUND));
SchedPolicy newPolicy;
ASSERT_EQ(0, get_sched_policy(0, &newPolicy));
EXPECT_EQ(SP_BACKGROUND, newPolicy);
TEST(SchedPolicy, get_sched_policy_name) {
EXPECT_STREQ("bg", get_sched_policy_name(SP_BACKGROUND));
EXPECT_STREQ("error", get_sched_policy_name(SchedPolicy(-2)));
EXPECT_STREQ("error", get_sched_policy_name(SP_CNT));
}