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

Commit 304c1264 authored by John Stultz's avatar John Stultz Committed by android-build-merger
Browse files

Merge \\"sched_policy: Add support for /proc/<tid>/timerslack_ns over...

Merge \\"sched_policy: Add support for /proc/<tid>/timerslack_ns over PR_SET_TIMERSLACK_PID\\" am: 817d5349
am: acf5e849

Change-Id: I3653682cc758372919d24aa2c463da27f7be3602
parents c44ce4ab acf5e849
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ static int getCGroupSubsys(int tid, const char* subsys, char* buf, size_t bufLen
    FILE *fp;

    snprintf(pathBuf, sizeof(pathBuf), "/proc/%d/cgroup", tid);
    if (!(fp = fopen(pathBuf, "r"))) {
    if (!(fp = fopen(pathBuf, "re"))) {
        return -1;
    }

@@ -323,6 +323,27 @@ int set_cpuset_policy(int tid, SchedPolicy policy)
#endif
}

static void set_timerslack_ns(int tid, unsigned long long slack) {
    char buf[64];

    /* v4.6+ kernels support the /proc/<tid>/timerslack_ns interface. */
    snprintf(buf, sizeof(buf), "/proc/%d/timerslack_ns", tid);
    int fd = open(buf, O_WRONLY | O_CLOEXEC);
    if (fd != -1) {
        int len = snprintf(buf, sizeof(buf), "%llu", slack);
        if (write(fd, buf, len) != len) {
            SLOGE("set_timerslack_ns write failed: %s\n", strerror(errno));
        }
        close(fd);
        return;
    }

    /* If the above fails, try the old common.git PR_SET_TIMERSLACK_PID. */
    if (prctl(PR_SET_TIMERSLACK_PID, slack, tid) == -1) {
        SLOGE("set_timerslack_ns prctl failed: %s\n", strerror(errno));
    }
}

int set_sched_policy(int tid, SchedPolicy policy)
{
    if (tid == 0) {
@@ -335,12 +356,11 @@ int set_sched_policy(int tid, SchedPolicy policy)
    char statfile[64];
    char statline[1024];
    char thread_name[255];
    int fd;

    snprintf(statfile, sizeof(statfile), "/proc/%d/stat", tid);
    memset(thread_name, 0, sizeof(thread_name));

    fd = open(statfile, O_RDONLY);
    int fd = open(statfile, O_RDONLY | O_CLOEXEC);
    if (fd >= 0) {
        int rc = read(fd, statline, 1023);
        close(fd);
@@ -405,8 +425,8 @@ int set_sched_policy(int tid, SchedPolicy policy)
                           &param);
    }

    prctl(PR_SET_TIMERSLACK_PID,
          policy == SP_BACKGROUND ? TIMER_SLACK_BG : TIMER_SLACK_FG, tid);
    set_timerslack_ns(tid, policy == SP_BACKGROUND ?
                               TIMER_SLACK_BG : TIMER_SLACK_FG);

    return 0;
}