summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Gennis <jgennis@google.com>2012-10-05 16:04:12 -0700
committerJamie Gennis <jgennis@google.com>2012-10-05 16:38:04 -0700
commit24505a5826d7c5cf89f3da85058befd671a73444 (patch)
tree9a3910b32d912bdb237ef87dbd297fe2d4dabe44
parenta404a7e9bb05f4c1b0c9312d10a4c96c6cbdfcc9 (diff)
downloadextras-24505a5826d7c5cf89f3da85058befd671a73444.tar.gz
atrace: make clock & bus bw tracing optional
This change makes enabling clock tracing and bus bandwidth tracing depend on whether the device's kernel supports these features. If it's not supported it will be skipped. Change-Id: I51d57299693635b0ecebb75de5dccd5b62d47be3
-rw-r--r--atrace/atrace.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/atrace/atrace.c b/atrace/atrace.c
index 381a4ed9..5edc47b3 100644
--- a/atrace/atrace.c
+++ b/atrace/atrace.c
@@ -93,6 +93,11 @@ static const char* k_tracePath =
static const char* k_traceMarkerPath =
"/sys/kernel/debug/tracing/trace_marker";
+// Check whether a file exists.
+static bool fileExists(const char* filename) {
+ return access(filename, F_OK) != -1;
+}
+
// Write a string to a file, returning true if the write was successful.
bool writeStr(const char* filename, const char* str)
{
@@ -151,11 +156,14 @@ static bool setSchedSwitchTracingEnable(bool enable)
// Enable or disable tracing of the Bus utilization.
static bool setBusUtilizationTracingEnable(bool enable)
{
- bool ok = false;
+ bool ok = true, oneSet = false;
// these can be platform specific so make sure that at least
// one succeeds.
- ok |= setKernelOptionEnable(k_memoryBusEnablePath, enable);
- return ok;
+ if (fileExists(k_memoryBusEnablePath)) {
+ ok &= setKernelOptionEnable(k_memoryBusEnablePath, enable);
+ oneSet |= ok;
+ }
+ return ok && (oneSet || !enable);
}
// Enable or disable tracing of the CPU clock frequency.
@@ -163,7 +171,9 @@ static bool setFrequencyTracingEnable(bool enable)
{
bool ok = true;
ok &= setKernelOptionEnable(k_cpuFreqEnablePath, enable);
- ok &= setKernelOptionEnable(k_clockSetRateEnablePath, enable);
+ if (fileExists(k_clockSetRateEnablePath)) {
+ ok &= setKernelOptionEnable(k_clockSetRateEnablePath, enable);
+ }
return ok;
}
@@ -177,7 +187,11 @@ static bool setCpuIdleTracingEnable(bool enable)
// the CPU load.
static bool setGovernorLoadTracingEnable(bool enable)
{
- return setKernelOptionEnable(k_governorLoadEnablePath, enable);
+ bool ok = true;
+ if (fileExists(k_governorLoadEnablePath) || enable) {
+ ok &= setKernelOptionEnable(k_governorLoadEnablePath, enable);
+ }
+ return ok;
}
// Enable or disable tracing of the kernel workqueues.
@@ -232,11 +246,6 @@ static bool setGlobalClockEnable(bool enable)
return writeStr(k_traceClockPath, enable ? "global" : "local");
}
-// Check whether a file exists.
-static bool fileExists(const char* filename) {
- return access(filename, F_OK) != -1;
-}
-
// Enable tracing in the kernel.
static bool startTrace(bool isRoot)
{
@@ -245,12 +254,9 @@ static bool startTrace(bool isRoot)
// Set up the tracing options that don't require root.
ok &= setTraceOverwriteEnable(g_traceOverwrite);
ok &= setSchedSwitchTracingEnable(g_traceSchedSwitch);
- ok &= setBusUtilizationTracingEnable(g_traceBusUtilization);
ok &= setFrequencyTracingEnable(g_traceFrequency);
ok &= setCpuIdleTracingEnable(g_traceCpuIdle);
- if (fileExists(k_governorLoadEnablePath) || g_traceGovernorLoad) {
- ok &= setGovernorLoadTracingEnable(g_traceGovernorLoad);
- }
+ ok &= setGovernorLoadTracingEnable(g_traceGovernorLoad);
ok &= setTraceBufferSizeKB(g_traceBufferSizeKB);
ok &= setGlobalClockEnable(true);
@@ -258,6 +264,7 @@ static bool startTrace(bool isRoot)
// require root should have errored out earlier if we're not running as
// root.
if (isRoot) {
+ ok &= setBusUtilizationTracingEnable(g_traceBusUtilization);
ok &= setWorkqueueTracingEnabled(g_traceWorkqueue);
ok &= setDiskTracingEnabled(g_traceDisk);
}
@@ -281,14 +288,12 @@ static void stopTrace(bool isRoot)
// Set the options back to their defaults.
setTraceOverwriteEnable(true);
setSchedSwitchTracingEnable(false);
- setBusUtilizationTracingEnable(false);
setFrequencyTracingEnable(false);
- if (fileExists(k_governorLoadEnablePath)) {
- setGovernorLoadTracingEnable(false);
- }
+ setGovernorLoadTracingEnable(false);
setGlobalClockEnable(false);
if (isRoot) {
+ setBusUtilizationTracingEnable(false);
setWorkqueueTracingEnabled(false);
setDiskTracingEnabled(false);
}