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

Commit e721536e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Set the atrace clock to boot when possible and mono otherwise." into oc-dev

parents f2a4bd80 56a2ba0b
Loading
Loading
Loading
Loading
+33 −9
Original line number Diff line number Diff line
@@ -450,8 +450,8 @@ static bool isTraceClock(const char *mode)
        return false;
    }

    char buf[4097];
    ssize_t n = read(fd, buf, 4096);
    char buf[100];
    ssize_t n = read(fd, buf, 99);
    close(fd);
    if (n == -1) {
        fprintf(stderr, "error reading %s: %s (%d)\n", k_traceClockPath,
@@ -475,13 +475,38 @@ static bool isTraceClock(const char *mode)
    return strcmp(mode, start) == 0;
}

// Enable or disable the kernel's use of the global clock.  Disabling the global
// clock will result in the kernel using a per-CPU local clock.
// Read the trace_clock sysfs file and return true if it contains the requested
// value.  The trace_clock file format is:
// local [global] counter uptime perf
static bool traceClockContains(const char *mode)
{
    int fd = open((g_traceFolder + k_traceClockPath).c_str(), O_RDONLY);
    if (fd == -1) {
        fprintf(stderr, "error opening %s: %s (%d)\n", k_traceClockPath,
            strerror(errno), errno);
        return false;
    }

    char buf[100];
    ssize_t n = read(fd, buf, 99);
    close(fd);
    if (n == -1) {
        fprintf(stderr, "error reading %s: %s (%d)\n", k_traceClockPath,
            strerror(errno), errno);
        return false;
    }
    buf[n] = '\0';

    return strstr(buf, mode) != NULL;
}

// Set the clock to the best available option while tracing. Use 'boot' if it's
// available; otherwise, use 'mono'.
// Any write to the trace_clock sysfs file will reset the buffer, so only
// update it if the requested value is not the current value.
static bool setGlobalClockEnable(bool enable)
static bool setClock()
{
    const char *clock = enable ? "global" : "local";
    const char* clock = traceClockContains("boot") ? "boot" : "mono";

    if (isTraceClock(clock)) {
        return true;
@@ -783,7 +808,7 @@ static bool setUpTrace()
    ok &= setCategoriesEnableFromFile(g_categoriesFile);
    ok &= setTraceOverwriteEnable(g_traceOverwrite);
    ok &= setTraceBufferSizeKB(g_traceBufferSizeKB);
    ok &= setGlobalClockEnable(true);
    ok &= setClock();
    ok &= setPrintTgidEnableIfPresent(true);
    ok &= setKernelTraceFuncs(g_kernelTraceFuncs);

@@ -859,7 +884,6 @@ static void cleanUpTrace()
    // Set the options back to their defaults.
    setTraceOverwriteEnable(true);
    setTraceBufferSizeKB(1);
    setGlobalClockEnable(false);
    setPrintTgidEnableIfPresent(false);
    setKernelTraceFuncs(NULL);
}
@@ -1210,7 +1234,7 @@ int main(int argc, char **argv)

    if (ok && traceStart) {
        if (!traceStream) {
            printf("capturing trace...");
            printf("capturing trace...\n");
            fflush(stdout);
        }

+4 −0
Original line number Diff line number Diff line
@@ -124,6 +124,10 @@ on post-fs
    write /sys/kernel/debug/tracing/tracing_on 0
    write /sys/kernel/tracing/tracing_on 0

    # Set the trace clock to boot if it exists, falling back to mono if not.
    write /d/tracing/trace_clock mono
    write /d/tracing/trace_clock boot

# Allow only the shell group to read and truncate the kernel trace.
    chown root shell /sys/kernel/debug/tracing/trace
    chown root shell /sys/kernel/tracing/trace