summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Gennis <jgennis@google.com>2012-06-12 12:41:23 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2012-06-12 12:41:23 -0700
commita3a75d956e502f924dc29f4f29c7d46f0f8e4e56 (patch)
treef267658e6559e9cadd1f5b0859d2e975033a7e87
parent400e9bc8d3c449da234e70abe319bc2670c94298 (diff)
parentb9314021ee1ccaa62eb115e8e0188f482a950f3b (diff)
downloadextras-a3a75d956e502f924dc29f4f29c7d46f0f8e4e56.tar.gz
am b9314021: atrace: enable running on user builds
* commit 'b9314021ee1ccaa62eb115e8e0188f482a950f3b': atrace: enable running on user builds
-rw-r--r--atrace/Android.mk4
-rw-r--r--atrace/atrace.c49
2 files changed, 37 insertions, 16 deletions
diff --git a/atrace/Android.mk b/atrace/Android.mk
index 1de8e95c..12526d02 100644
--- a/atrace/Android.mk
+++ b/atrace/Android.mk
@@ -10,8 +10,8 @@ LOCAL_CFLAGS += -std=c99
LOCAL_MODULE:= atrace
-LOCAL_MODULE_TAGS:= debug
+LOCAL_MODULE_TAGS:= optional
-LOCAL_STATIC_LIBRARIES := libz
+LOCAL_SHARED_LIBRARIES := libz
include $(BUILD_EXECUTABLE)
diff --git a/atrace/atrace.c b/atrace/atrace.c
index a0d42502..d81cb5c0 100644
--- a/atrace/atrace.c
+++ b/atrace/atrace.c
@@ -55,6 +55,9 @@ static const char* k_tracingOverwriteEnablePath =
static const char* k_schedSwitchEnablePath =
"/sys/kernel/debug/tracing/events/sched/sched_switch/enable";
+static const char* k_schedWakeupEnablePath =
+ "/sys/kernel/debug/tracing/events/sched/sched_wakeup/enable";
+
static const char* k_cpuFreqEnablePath =
"/sys/kernel/debug/tracing/events/power/cpu_frequency/enable";
@@ -132,7 +135,10 @@ static bool setTraceOverwriteEnable(bool enable)
// Enable or disable tracing of the kernel scheduler switching.
static bool setSchedSwitchTracingEnable(bool enable)
{
- return setKernelOptionEnable(k_schedSwitchEnablePath, enable);
+ bool ok = true;
+ ok &= setKernelOptionEnable(k_schedSwitchEnablePath, enable);
+ ok &= setKernelOptionEnable(k_schedWakeupEnablePath, enable);
+ return ok;
}
// Enable or disable tracing of the CPU clock frequency.
@@ -212,11 +218,11 @@ static bool fileExists(const char* filename) {
}
// Enable tracing in the kernel.
-static bool startTrace()
+static bool startTrace(bool isRoot)
{
bool ok = true;
- // Set up the tracing options.
+ // Set up the tracing options that don't require root.
ok &= setTraceOverwriteEnable(g_traceOverwrite);
ok &= setSchedSwitchTracingEnable(g_traceSchedSwitch);
ok &= setCpuFrequencyTracingEnable(g_traceCpuFrequency);
@@ -224,11 +230,17 @@ static bool startTrace()
if (fileExists(k_governorLoadEnablePath) || g_traceGovernorLoad) {
ok &= setGovernorLoadTracingEnable(g_traceGovernorLoad);
}
- ok &= setWorkqueueTracingEnabled(g_traceWorkqueue);
- ok &= setDiskTracingEnabled(g_traceDisk);
ok &= setTraceBufferSizeKB(g_traceBufferSizeKB);
ok &= setGlobalClockEnable(true);
+ // Set up the tracing options that do require root. The options that
+ // require root should have errored out earlier if we're not running as
+ // root.
+ if (isRoot) {
+ ok &= setWorkqueueTracingEnabled(g_traceWorkqueue);
+ ok &= setDiskTracingEnabled(g_traceDisk);
+ }
+
// Enable tracing.
ok &= setTracingEnabled(true);
@@ -240,7 +252,7 @@ static bool startTrace()
}
// Disable tracing in the kernel.
-static void stopTrace()
+static void stopTrace(bool isRoot)
{
// Disable tracing.
setTracingEnabled(false);
@@ -252,9 +264,13 @@ static void stopTrace()
if (fileExists(k_governorLoadEnablePath)) {
setGovernorLoadTracingEnable(false);
}
- setWorkqueueTracingEnabled(false);
setGlobalClockEnable(false);
+ if (isRoot) {
+ setWorkqueueTracingEnabled(false);
+ setDiskTracingEnabled(false);
+ }
+
// Note that we can't reset the trace buffer size here because that would
// clear the trace before we've read it.
}
@@ -389,16 +405,13 @@ static void registerSigHandler() {
int main(int argc, char **argv)
{
+ bool isRoot = (getuid() == 0);
+
if (argc == 2 && 0 == strcmp(argv[1], "--help")) {
showHelp(argv[0]);
exit(0);
}
- if (getuid() != 0) {
- fprintf(stderr, "error: %s must be run as root.", argv[0]);
- exit(1);
- }
-
for (;;) {
int ret;
@@ -426,6 +439,10 @@ int main(int argc, char **argv)
break;
case 'd':
+ if (!isRoot) {
+ fprintf(stderr, "error: tracing disk activity requires root privileges\n");
+ exit(1);
+ }
g_traceDisk = true;
break;
@@ -442,6 +459,10 @@ int main(int argc, char **argv)
break;
case 'w':
+ if (!isRoot) {
+ fprintf(stderr, "error: tracing kernel work queues requires root privileges\n");
+ exit(1);
+ }
g_traceWorkqueue = true;
break;
@@ -459,7 +480,7 @@ int main(int argc, char **argv)
registerSigHandler();
- bool ok = startTrace();
+ bool ok = startTrace(isRoot);
if (ok) {
printf("capturing trace...");
@@ -486,7 +507,7 @@ int main(int argc, char **argv)
}
// Stop the trace and restore the default settings.
- stopTrace();
+ stopTrace(isRoot);
if (ok) {
if (!g_traceAborted) {