merge in jb-mr1-release history after reset to jb-mr1-dev
diff --git a/atrace/atrace.c b/atrace/atrace.c
index 381a4ed..5edc47b 100644
--- a/atrace/atrace.c
+++ b/atrace/atrace.c
@@ -93,6 +93,11 @@
 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 @@
 // 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 @@
 {
     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 @@
 // 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 @@
     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 @@
     // 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 @@
     // 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 @@
     // 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);
     }