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

Commit 7e382bc2 authored by Rafal Slawik's avatar Rafal Slawik Committed by Automerger Merge Worker
Browse files

Merge "Check if CPU time tracking is expected to work" am: bd18538f am:...

Merge "Check if CPU time tracking is expected to work" am: bd18538f am: 70d3b484 am: 9f730866 am: a907cfd2

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1566193

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: Icf901c2173a4871283a799daf905a3e8495d7580
parents 481f81b0 a907cfd2
Loading
Loading
Loading
Loading
+17 −2
Original line number Original line Diff line number Diff line
@@ -155,10 +155,14 @@ static bool initGlobals() {
    return true;
    return true;
}
}


static bool attachTracepointProgram(const std::string &eventType, const std::string &eventName) {
static int retrieveProgramFd(const std::string &eventType, const std::string &eventName) {
    std::string path = StringPrintf(BPF_FS_PATH "prog_time_in_state_tracepoint_%s_%s",
    std::string path = StringPrintf(BPF_FS_PATH "prog_time_in_state_tracepoint_%s_%s",
                                    eventType.c_str(), eventName.c_str());
                                    eventType.c_str(), eventName.c_str());
    int prog_fd = retrieveProgram(path.c_str());
    return retrieveProgram(path.c_str());
}

static bool attachTracepointProgram(const std::string &eventType, const std::string &eventName) {
    int prog_fd = retrieveProgramFd(eventType, eventName);
    if (prog_fd < 0) return false;
    if (prog_fd < 0) return false;
    return bpf_attach_tracepoint(prog_fd, eventType.c_str(), eventName.c_str()) >= 0;
    return bpf_attach_tracepoint(prog_fd, eventType.c_str(), eventName.c_str()) >= 0;
}
}
@@ -174,6 +178,17 @@ static std::optional<uint32_t> getPolicyFreqIdx(uint32_t policy) {
    return {};
    return {};
}
}


// Check if tracking is expected to work without activating it.
bool isTrackingUidTimesSupported() {
    auto freqs = getCpuFreqs();
    if (!freqs || freqs->empty()) return false;
    if (gTracking) return true;
    if (retrieveProgramFd("sched", "sched_switch") < 0) return false;
    if (retrieveProgramFd("power", "cpu_frequency") < 0) return false;
    if (retrieveProgramFd("sched", "sched_process_free") < 0) return false;
    return true;
}

// Start tracking and aggregating data to be reported by getUidCpuFreqTimes and getUidsCpuFreqTimes.
// Start tracking and aggregating data to be reported by getUidCpuFreqTimes and getUidsCpuFreqTimes.
// Returns true on success, false otherwise.
// Returns true on success, false otherwise.
// Tracking is active only once a live process has successfully called this function; if the calling
// Tracking is active only once a live process has successfully called this function; if the calling
+1 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@
namespace android {
namespace android {
namespace bpf {
namespace bpf {


bool isTrackingUidTimesSupported();
bool startTrackingUidTimes();
bool startTrackingUidTimes();
std::optional<std::vector<std::vector<uint64_t>>> getTotalCpuFreqTimes();
std::optional<std::vector<std::vector<uint64_t>>> getTotalCpuFreqTimes();
std::optional<std::vector<std::vector<uint64_t>>> getUidCpuFreqTimes(uint32_t uid);
std::optional<std::vector<std::vector<uint64_t>>> getUidCpuFreqTimes(uint32_t uid);
+5 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,11 @@ static constexpr uint64_t NSEC_PER_YEAR = NSEC_PER_SEC * 60 * 60 * 24 * 365;


using std::vector;
using std::vector;


TEST(TimeInStateTest, IsTrackingSupported) {
    isTrackingUidTimesSupported();
    SUCCEED();
}

TEST(TimeInStateTest, TotalTimeInState) {
TEST(TimeInStateTest, TotalTimeInState) {
    auto times = getTotalCpuFreqTimes();
    auto times = getTotalCpuFreqTimes();
    ASSERT_TRUE(times.has_value());
    ASSERT_TRUE(times.has_value());