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

Commit b0491f89 authored by Connor O'Brien's avatar Connor O'Brien
Browse files

libtimeinstate: tolerate multiple calls to startTrackingUidTimes



system_server instantiates 2 of each type of KernelCpuUidTimeReader,
but the logic in startTrackingUidTimes() must run exactly once. Revise
startTrackingUidTimes() to return immediately if tracking is already
active. This makes it safe to call from the KernelCpuUidTimeReader
constructor, ensuring that tracking will start as early as possible.

Bug: 138317993
Test: boot & check that time_in_state programs have been attached
exactly once
Change-Id: Ic64438a3270874b398a8db07531521fe1d02a3de
Signed-off-by: default avatarConnor O'Brien <connoro@google.com>
parent 8e7d61c0
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ namespace bpf {

static std::mutex gInitializedMutex;
static bool gInitialized = false;
static std::mutex gTrackingMutex;
static bool gTracking = false;
static uint32_t gNPolicies = 0;
static uint32_t gNCpus = 0;
static std::vector<std::vector<uint32_t>> gPolicyFreqs;
@@ -161,7 +163,9 @@ static bool attachTracepointProgram(const std::string &eventType, const std::str
// This function should *not* be called while tracking is already active; doing so is unnecessary
// and can lead to accounting errors.
bool startTrackingUidTimes() {
    std::lock_guard<std::mutex> guard(gTrackingMutex);
    if (!initGlobals()) return false;
    if (gTracking) return true;

    unique_fd cpuPolicyFd(bpf_obj_get_wronly(BPF_FS_PATH "map_time_in_state_cpu_policy_map"));
    if (cpuPolicyFd < 0) return false;
@@ -209,8 +213,9 @@ bool startTrackingUidTimes() {
        if (writeToMapEntry(policyFreqIdxFd, &i, &zero, BPF_ANY)) return false;
    }

    return attachTracepointProgram("sched", "sched_switch") &&
    gTracking = attachTracepointProgram("sched", "sched_switch") &&
            attachTracepointProgram("power", "cpu_frequency");
    return gTracking;
}

std::optional<std::vector<std::vector<uint32_t>>> getCpuFreqs() {