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

Commit 817d5349 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

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

parents 6dc68cb5 2f13f0a4
Loading
Loading
Loading
Loading
+25 −5
Original line number Original line Diff line number Diff line
@@ -160,7 +160,7 @@ static int getSchedulerGroup(int tid, char* buf, size_t bufLen)
    FILE *fp;
    FILE *fp;


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


@@ -292,6 +292,27 @@ int set_cpuset_policy(int tid, SchedPolicy policy)
#endif
#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)
int set_sched_policy(int tid, SchedPolicy policy)
{
{
    if (tid == 0) {
    if (tid == 0) {
@@ -304,12 +325,11 @@ int set_sched_policy(int tid, SchedPolicy policy)
    char statfile[64];
    char statfile[64];
    char statline[1024];
    char statline[1024];
    char thread_name[255];
    char thread_name[255];
    int fd;


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


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


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


    return 0;
    return 0;
}
}