Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit efbbe612 authored by Elliott Hughes's avatar Elliott Hughes Committed by Gerrit Code Review
Browse files

Merge changes Iefcb1ec9,I6df97295

* changes:
  Rewrite get_sched_policy_name for safety.
  cutils: add restricted cpuset
parents c8a8771b 9f49508f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ cc_library {

    shared_libs: ["liblog"],
    header_libs: [
        "libbase_headers",
        "libcutils_headers",
        "libutils_headers",
    ],
+8 −7
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ typedef enum {
    SP_AUDIO_SYS = 4,
    SP_TOP_APP = 5,
    SP_RT_APP = 6,
    SP_RESTRICTED = 7,
    SP_CNT,
    SP_MAX = SP_CNT - 1,
    SP_SYSTEM_DEFAULT = SP_FOREGROUND,
+16 −13
Original line number Diff line number Diff line
@@ -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];
}
+12 −12
Original line number Diff line number Diff line
@@ -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));
}