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

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

Merge "Update atrace to work with tracefs, not debugfs"

parents 4d741ebe 2cd93cc4
Loading
Loading
Loading
Loading
+103 −73
Original line number Diff line number Diff line
@@ -112,81 +112,81 @@ static const TracingCategory k_categories[] = {
    { "adb",        "ADB",              ATRACE_TAG_ADB, { } },
    { k_coreServiceCategory, "Core services", 0, { } },
    { "sched",      "CPU Scheduling",   0, {
        { REQ,      "/sys/kernel/debug/tracing/events/sched/sched_switch/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/sched/sched_wakeup/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/sched/sched_blocked_reason/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/sched/sched_cpu_hotplug/enable" },
        { REQ,      "events/sched/sched_switch/enable" },
        { REQ,      "events/sched/sched_wakeup/enable" },
        { OPT,      "events/sched/sched_blocked_reason/enable" },
        { OPT,      "events/sched/sched_cpu_hotplug/enable" },
    } },
    { "irq",        "IRQ Events",   0, {
        { REQ,      "/sys/kernel/debug/tracing/events/irq/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/ipi/enable" },
        { REQ,      "events/irq/enable" },
        { OPT,      "events/ipi/enable" },
    } },
    { "i2c",        "I2C Events",   0, {
        { REQ,      "/sys/kernel/debug/tracing/events/i2c/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/i2c/i2c_read/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/i2c/i2c_write/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/i2c/i2c_result/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/i2c/i2c_reply/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/i2c/smbus_read/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/i2c/smbus_write/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/i2c/smbus_result/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/i2c/smbus_reply/enable" },
        { REQ,      "events/i2c/enable" },
        { REQ,      "events/i2c/i2c_read/enable" },
        { REQ,      "events/i2c/i2c_write/enable" },
        { REQ,      "events/i2c/i2c_result/enable" },
        { REQ,      "events/i2c/i2c_reply/enable" },
        { OPT,      "events/i2c/smbus_read/enable" },
        { OPT,      "events/i2c/smbus_write/enable" },
        { OPT,      "events/i2c/smbus_result/enable" },
        { OPT,      "events/i2c/smbus_reply/enable" },
    } },
    { "freq",       "CPU Frequency",    0, {
        { REQ,      "/sys/kernel/debug/tracing/events/power/cpu_frequency/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/power/clock_set_rate/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/power/cpu_frequency_limits/enable" },
        { REQ,      "events/power/cpu_frequency/enable" },
        { OPT,      "events/power/clock_set_rate/enable" },
        { OPT,      "events/power/cpu_frequency_limits/enable" },
    } },
    { "membus",     "Memory Bus Utilization", 0, {
        { REQ,      "/sys/kernel/debug/tracing/events/memory_bus/enable" },
        { REQ,      "events/memory_bus/enable" },
    } },
    { "idle",       "CPU Idle",         0, {
        { REQ,      "/sys/kernel/debug/tracing/events/power/cpu_idle/enable" },
        { REQ,      "events/power/cpu_idle/enable" },
    } },
    { "disk",       "Disk I/O",         0, {
        { OPT,      "/sys/kernel/debug/tracing/events/f2fs/f2fs_sync_file_enter/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/f2fs/f2fs_sync_file_exit/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/f2fs/f2fs_write_begin/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/f2fs/f2fs_write_end/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/ext4/ext4_da_write_begin/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/ext4/ext4_da_write_end/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable" },
        { OPT,      "/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_exit/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/block/block_rq_issue/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/block/block_rq_complete/enable" },
        { OPT,      "events/f2fs/f2fs_sync_file_enter/enable" },
        { OPT,      "events/f2fs/f2fs_sync_file_exit/enable" },
        { OPT,      "events/f2fs/f2fs_write_begin/enable" },
        { OPT,      "events/f2fs/f2fs_write_end/enable" },
        { OPT,      "events/ext4/ext4_da_write_begin/enable" },
        { OPT,      "events/ext4/ext4_da_write_end/enable" },
        { OPT,      "events/ext4/ext4_sync_file_enter/enable" },
        { OPT,      "events/ext4/ext4_sync_file_exit/enable" },
        { REQ,      "events/block/block_rq_issue/enable" },
        { REQ,      "events/block/block_rq_complete/enable" },
    } },
    { "mmc",        "eMMC commands",    0, {
        { REQ,      "/sys/kernel/debug/tracing/events/mmc/enable" },
        { REQ,      "events/mmc/enable" },
    } },
    { "load",       "CPU Load",         0, {
        { REQ,      "/sys/kernel/debug/tracing/events/cpufreq_interactive/enable" },
        { REQ,      "events/cpufreq_interactive/enable" },
    } },
    { "sync",       "Synchronization",  0, {
        { REQ,      "/sys/kernel/debug/tracing/events/sync/enable" },
        { REQ,      "events/sync/enable" },
    } },
    { "workq",      "Kernel Workqueues", 0, {
        { REQ,      "/sys/kernel/debug/tracing/events/workqueue/enable" },
        { REQ,      "events/workqueue/enable" },
    } },
    { "memreclaim", "Kernel Memory Reclaim", 0, {
        { REQ,      "/sys/kernel/debug/tracing/events/vmscan/mm_vmscan_direct_reclaim_begin/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/vmscan/mm_vmscan_direct_reclaim_end/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/vmscan/mm_vmscan_kswapd_wake/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/vmscan/mm_vmscan_kswapd_sleep/enable" },
        { REQ,      "events/vmscan/mm_vmscan_direct_reclaim_begin/enable" },
        { REQ,      "events/vmscan/mm_vmscan_direct_reclaim_end/enable" },
        { REQ,      "events/vmscan/mm_vmscan_kswapd_wake/enable" },
        { REQ,      "events/vmscan/mm_vmscan_kswapd_sleep/enable" },
    } },
    { "regulators",  "Voltage and Current Regulators", 0, {
        { REQ,      "/sys/kernel/debug/tracing/events/regulator/enable" },
        { REQ,      "events/regulator/enable" },
    } },
    { "binder_driver", "Binder Kernel driver", 0, {
        { REQ,      "/sys/kernel/debug/tracing/events/binder/binder_transaction/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/binder/binder_transaction_received/enable" },
        { REQ,      "events/binder/binder_transaction/enable" },
        { REQ,      "events/binder/binder_transaction_received/enable" },
    } },
    { "binder_lock", "Binder global lock trace", 0, {
        { REQ,      "/sys/kernel/debug/tracing/events/binder/binder_lock/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/binder/binder_locked/enable" },
        { REQ,      "/sys/kernel/debug/tracing/events/binder/binder_unlock/enable" },
        { REQ,      "events/binder/binder_lock/enable" },
        { REQ,      "events/binder/binder_locked/enable" },
        { REQ,      "events/binder/binder_unlock/enable" },
    } },
    { "pagecache",  "Page cache", 0, {
        { REQ,      "/sys/kernel/debug/tracing/events/filemap/enable" },
        { REQ,      "events/filemap/enable" },
    } },
};

@@ -205,61 +205,62 @@ static const char* g_outputFile = nullptr;
/* Global state */
static bool g_traceAborted = false;
static bool g_categoryEnables[NELEM(k_categories)] = {};
static std::string g_traceFolder;

/* Sys file paths */
static const char* k_traceClockPath =
    "/sys/kernel/debug/tracing/trace_clock";
    "trace_clock";

static const char* k_traceBufferSizePath =
    "/sys/kernel/debug/tracing/buffer_size_kb";
    "buffer_size_kb";

static const char* k_tracingOverwriteEnablePath =
    "/sys/kernel/debug/tracing/options/overwrite";
    "options/overwrite";

static const char* k_currentTracerPath =
    "/sys/kernel/debug/tracing/current_tracer";
    "current_tracer";

static const char* k_printTgidPath =
    "/sys/kernel/debug/tracing/options/print-tgid";
    "options/print-tgid";

static const char* k_funcgraphAbsTimePath =
    "/sys/kernel/debug/tracing/options/funcgraph-abstime";
    "options/funcgraph-abstime";

static const char* k_funcgraphCpuPath =
    "/sys/kernel/debug/tracing/options/funcgraph-cpu";
    "options/funcgraph-cpu";

static const char* k_funcgraphProcPath =
    "/sys/kernel/debug/tracing/options/funcgraph-proc";
    "options/funcgraph-proc";

static const char* k_funcgraphFlatPath =
    "/sys/kernel/debug/tracing/options/funcgraph-flat";
    "options/funcgraph-flat";

static const char* k_funcgraphDurationPath =
    "/sys/kernel/debug/tracing/options/funcgraph-duration";
    "options/funcgraph-duration";

static const char* k_ftraceFilterPath =
    "/sys/kernel/debug/tracing/set_ftrace_filter";
    "set_ftrace_filter";

static const char* k_tracingOnPath =
    "/sys/kernel/debug/tracing/tracing_on";
    "tracing_on";

static const char* k_tracePath =
    "/sys/kernel/debug/tracing/trace";
    "trace";

static const char* k_traceStreamPath =
    "/sys/kernel/debug/tracing/trace_pipe";
    "trace_pipe";

static const char* k_traceMarkerPath =
    "/sys/kernel/debug/tracing/trace_marker";
    "trace_marker";

// Check whether a file exists.
static bool fileExists(const char* filename) {
    return access(filename, F_OK) != -1;
    return access((g_traceFolder + filename).c_str(), F_OK) != -1;
}

// Check whether a file is writable.
static bool fileIsWritable(const char* filename) {
    return access(filename, W_OK) != -1;
    return access((g_traceFolder + filename).c_str(), W_OK) != -1;
}

// Truncate a file.
@@ -268,9 +269,9 @@ static bool truncateFile(const char* path)
    // This uses creat rather than truncate because some of the debug kernel
    // device nodes (e.g. k_ftraceFilterPath) currently aren't changed by
    // calls to truncate, but they are cleared by calls to creat.
    int traceFD = creat(path, 0);
    int traceFD = creat((g_traceFolder + path).c_str(), 0);
    if (traceFD == -1) {
        fprintf(stderr, "error truncating %s: %s (%d)\n", path,
        fprintf(stderr, "error truncating %s: %s (%d)\n", (g_traceFolder + path).c_str(),
            strerror(errno), errno);
        return false;
    }
@@ -282,9 +283,10 @@ static bool truncateFile(const char* path)

static bool _writeStr(const char* filename, const char* str, int flags)
{
    int fd = open(filename, flags);
    std::string fullFilename = g_traceFolder + filename;
    int fd = open(fullFilename.c_str(), flags);
    if (fd == -1) {
        fprintf(stderr, "error opening %s: %s (%d)\n", filename,
        fprintf(stderr, "error opening %s: %s (%d)\n", fullFilename.c_str(),
                strerror(errno), errno);
        return false;
    }
@@ -292,7 +294,7 @@ static bool _writeStr(const char* filename, const char* str, int flags)
    bool ok = true;
    ssize_t len = strlen(str);
    if (write(fd, str, len) != len) {
        fprintf(stderr, "error writing to %s: %s (%d)\n", filename,
        fprintf(stderr, "error writing to %s: %s (%d)\n", fullFilename.c_str(),
                strerror(errno), errno);
        ok = false;
    }
@@ -318,7 +320,7 @@ static void writeClockSyncMarker()
{
  char buffer[128];
  int len = 0;
  int fd = open(k_traceMarkerPath, O_WRONLY);
  int fd = open((g_traceFolder + k_traceMarkerPath).c_str(), O_WRONLY);
  if (fd == -1) {
      fprintf(stderr, "error opening %s: %s (%d)\n", k_traceMarkerPath,
              strerror(errno), errno);
@@ -439,7 +441,7 @@ static bool setTraceBufferSizeKB(int size)
// local [global] counter uptime perf
static bool isTraceClock(const char *mode)
{
    int fd = open(k_traceClockPath, O_RDONLY);
    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);
@@ -652,7 +654,7 @@ static bool disableKernelTraceEvents() {
static bool verifyKernelTraceFuncs(const char* funcs)
{
    std::string buf;
    if (!android::base::ReadFileToString(k_ftraceFilterPath, &buf)) {
    if (!android::base::ReadFileToString(g_traceFolder + k_ftraceFilterPath, &buf)) {
         fprintf(stderr, "error opening %s: %s (%d)\n", k_ftraceFilterPath,
            strerror(errno), errno);
         return false;
@@ -873,7 +875,7 @@ static void stopTrace()
static void streamTrace()
{
    char trace_data[4096];
    int traceFD = open(k_traceStreamPath, O_RDWR);
    int traceFD = open((g_traceFolder + k_traceStreamPath).c_str(), O_RDWR);
    if (traceFD == -1) {
        fprintf(stderr, "error opening %s: %s (%d)\n", k_traceStreamPath,
                strerror(errno), errno);
@@ -898,7 +900,7 @@ static void streamTrace()
static void dumpTrace(int outFd)
{
    ALOGI("Dumping trace");
    int traceFD = open(k_tracePath, O_RDWR);
    int traceFD = open((g_traceFolder + k_tracePath).c_str(), O_RDWR);
    if (traceFD == -1) {
        fprintf(stderr, "error opening %s: %s (%d)\n", k_tracePath,
                strerror(errno), errno);
@@ -1053,6 +1055,29 @@ static void showHelp(const char *cmd)
            );
}

bool findTraceFiles()
{
    static const std::string debugfs_path = "/sys/kernel/debug/tracing/";
    static const std::string tracefs_path = "/sys/kernel/tracing/";
    static const std::string trace_file = "trace_marker";

    bool tracefs = access((tracefs_path + trace_file).c_str(), F_OK) != -1;
    bool debugfs = access((debugfs_path + trace_file).c_str(), F_OK) != -1;

    if (!tracefs && !debugfs) {
        fprintf(stderr, "Error: Did not find trace folder\n");
        return false;
    }

    if (tracefs) {
        g_traceFolder = tracefs_path;
    } else {
        g_traceFolder = debugfs_path;
    }

    return true;
}

int main(int argc, char **argv)
{
    bool async = false;
@@ -1066,6 +1091,11 @@ int main(int argc, char **argv)
        exit(0);
    }

    if (!findTraceFiles()) {
        fprintf(stderr, "No trace folder found\n");
        exit(-1);
    }

    for (;;) {
        int ret;
        int option_index = 0;
+59 −0
Original line number Diff line number Diff line
@@ -4,72 +4,131 @@ on post-fs

# Allow writing to the kernel trace log.
    chmod 0222 /sys/kernel/debug/tracing/trace_marker
    chmod 0222 /sys/kernel/tracing/trace_marker

# Allow the shell group to enable (some) kernel tracing.
    chown root shell /sys/kernel/debug/tracing/trace_clock
    chown root shell /sys/kernel/tracing/trace_clock
    chown root shell /sys/kernel/debug/tracing/buffer_size_kb
    chown root shell /sys/kernel/tracing/buffer_size_kb
    chown root shell /sys/kernel/debug/tracing/options/overwrite
    chown root shell /sys/kernel/tracing/options/overwrite
    chown root shell /sys/kernel/debug/tracing/options/print-tgid
    chown root shell /sys/kernel/tracing/options/print-tgid
    chown root shell /sys/kernel/debug/tracing/events/sched/sched_switch/enable
    chown root shell /sys/kernel/tracing/events/sched/sched_switch/enable
    chown root shell /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
    chown root shell /sys/kernel/tracing/events/sched/sched_wakeup/enable
    chown root shell /sys/kernel/debug/tracing/events/sched/sched_blocked_reason/enable
    chown root shell /sys/kernel/tracing/events/sched/sched_blocked_reason/enable
    chown root shell /sys/kernel/debug/tracing/events/sched/sched_cpu_hotplug/enable
    chown root shell /sys/kernel/tracing/events/sched/sched_cpu_hotplug/enable
    chown root shell /sys/kernel/debug/tracing/events/power/cpu_frequency/enable
    chown root shell /sys/kernel/tracing/events/power/cpu_frequency/enable
    chown root shell /sys/kernel/debug/tracing/events/power/cpu_idle/enable
    chown root shell /sys/kernel/tracing/events/power/cpu_idle/enable
    chown root shell /sys/kernel/debug/tracing/events/power/clock_set_rate/enable
    chown root shell /sys/kernel/tracing/events/power/clock_set_rate/enable
    chown root shell /sys/kernel/debug/tracing/events/power/cpu_frequency_limits/enable
    chown root shell /sys/kernel/tracing/events/power/cpu_frequency_limits/enable
    chown root shell /sys/kernel/debug/tracing/events/cpufreq_interactive/enable
    chown root shell /sys/kernel/tracing/events/cpufreq_interactive/enable
    chown root shell /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_direct_reclaim_begin/enable
    chown root shell /sys/kernel/tracing/events/vmscan/mm_vmscan_direct_reclaim_begin/enable
    chown root shell /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_direct_reclaim_end/enable
    chown root shell /sys/kernel/tracing/events/vmscan/mm_vmscan_direct_reclaim_end/enable
    chown root shell /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_kswapd_wake/enable
    chown root shell /sys/kernel/tracing/events/vmscan/mm_vmscan_kswapd_wake/enable
    chown root shell /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_kswapd_sleep/enable
    chown root shell /sys/kernel/tracing/events/vmscan/mm_vmscan_kswapd_sleep/enable
    chown root shell /sys/kernel/debug/tracing/events/binder/binder_transaction/enable
    chown root shell /sys/kernel/tracing/events/binder/binder_transaction/enable
    chown root shell /sys/kernel/debug/tracing/events/binder/binder_transaction_received/enable
    chown root shell /sys/kernel/tracing/events/binder/binder_transaction_received/enable
    chown root shell /sys/kernel/debug/tracing/events/binder/binder_lock/enable
    chown root shell /sys/kernel/tracing/events/binder/binder_lock/enable
    chown root shell /sys/kernel/debug/tracing/events/binder/binder_locked/enable
    chown root shell /sys/kernel/tracing/events/binder/binder_locked/enable
    chown root shell /sys/kernel/debug/tracing/events/binder/binder_unlock/enable
    chown root shell /sys/kernel/tracing/events/binder/binder_unlock/enable

    chown root shell /sys/kernel/debug/tracing/tracing_on
    chown root shell /sys/kernel/tracing/tracing_on

    chmod 0664 /sys/kernel/debug/tracing/trace_clock
    chmod 0664 /sys/kernel/tracing/trace_clock
    chmod 0664 /sys/kernel/debug/tracing/buffer_size_kb
    chmod 0664 /sys/kernel/tracing/buffer_size_kb
    chmod 0664 /sys/kernel/debug/tracing/options/overwrite
    chmod 0664 /sys/kernel/tracing/options/overwrite
    chmod 0664 /sys/kernel/debug/tracing/options/print-tgid
    chmod 0664 /sys/kernel/tracing/options/print-tgid
    chmod 0664 /sys/kernel/debug/tracing/events/sched/sched_switch/enable
    chmod 0664 /sys/kernel/tracing/events/sched/sched_switch/enable
    chmod 0664 /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
    chmod 0664 /sys/kernel/tracing/events/sched/sched_wakeup/enable
    chmod 0664 /sys/kernel/debug/tracing/events/sched/sched_blocked_reason/enable
    chmod 0664 /sys/kernel/tracing/events/sched/sched_blocked_reason/enable
    chmod 0664 /sys/kernel/debug/tracing/events/sched/sched_cpu_hotplug/enable
    chmod 0664 /sys/kernel/tracing/events/sched/sched_cpu_hotplug/enable
    chmod 0664 /sys/kernel/debug/tracing/events/power/cpu_frequency/enable
    chmod 0664 /sys/kernel/tracing/events/power/cpu_frequency/enable
    chmod 0664 /sys/kernel/debug/tracing/events/power/cpu_idle/enable
    chmod 0664 /sys/kernel/tracing/events/power/cpu_idle/enable
    chmod 0664 /sys/kernel/debug/tracing/events/power/clock_set_rate/enable
    chmod 0664 /sys/kernel/tracing/events/power/clock_set_rate/enable
    chmod 0664 /sys/kernel/debug/tracing/events/power/cpu_frequency_limits/enable
    chmod 0664 /sys/kernel/tracing/events/power/cpu_frequency_limits/enable
    chmod 0664 /sys/kernel/debug/tracing/events/cpufreq_interactive/enable
    chmod 0664 /sys/kernel/tracing/events/cpufreq_interactive/enable
    chmod 0664 /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_direct_reclaim_begin/enable
    chmod 0664 /sys/kernel/tracing/events/vmscan/mm_vmscan_direct_reclaim_begin/enable
    chmod 0664 /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_direct_reclaim_end/enable
    chmod 0664 /sys/kernel/tracing/events/vmscan/mm_vmscan_direct_reclaim_end/enable
    chmod 0664 /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_kswapd_wake/enable
    chmod 0664 /sys/kernel/tracing/events/vmscan/mm_vmscan_kswapd_wake/enable
    chmod 0664 /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_kswapd_sleep/enable
    chmod 0664 /sys/kernel/tracing/events/vmscan/mm_vmscan_kswapd_sleep/enable
    chmod 0664 /sys/kernel/debug/tracing/tracing_on
    chmod 0664 /sys/kernel/tracing/tracing_on
    chmod 0664 /sys/kernel/debug/tracing/events/binder/binder_transaction/enable
    chmod 0664 /sys/kernel/tracing/events/binder/binder_transaction/enable
    chmod 0664 /sys/kernel/debug/tracing/events/binder/binder_transaction_received/enable
    chmod 0664 /sys/kernel/tracing/events/binder/binder_transaction_received/enable
    chmod 0664 /sys/kernel/debug/tracing/events/binder/binder_lock/enable
    chmod 0664 /sys/kernel/tracing/events/binder/binder_lock/enable
    chmod 0664 /sys/kernel/debug/tracing/events/binder/binder_locked/enable
    chmod 0664 /sys/kernel/tracing/events/binder/binder_locked/enable
    chmod 0664 /sys/kernel/debug/tracing/events/binder/binder_unlock/enable
    chmod 0664 /sys/kernel/tracing/events/binder/binder_unlock/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/i2c_read/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/i2c_read/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/i2c_write/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/i2c_write/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/i2c_result/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/i2c_result/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/i2c_reply/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/i2c_reply/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/smbus_read/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/smbus_read/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/smbus_write/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/smbus_write/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/smbus_result/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/smbus_result/enable
    chmod 0664 /sys/kernel/debug/tracing/events/i2c/smbus_reply/enable
    chmod 0664 /sys/kernel/tracing/events/i2c/smbus_reply/enable

    # Tracing disabled by default
    write /sys/kernel/debug/tracing/tracing_on 0
    write /sys/kernel/tracing/tracing_on 0

# 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
    chmod 0660 /sys/kernel/debug/tracing/trace
    chmod 0660 /sys/kernel/tracing/trace

on property:persist.debug.atrace.boottrace=1
    start boottrace