Commit 4942a898 authored by Michael Spang's avatar Michael Spang Committed by Commit Bot

chromecast: tracing: Add support for tracing on older kernels

The tracing control directory was originally part of the debug filesystem
at /sys/kernel/debug/tracing. We have to support this location in order
for tracing to work on older kernels.

Bug: 786091
Test: chromecast/tools/trace.py

Change-Id: Iccde78471201ab0bf9f4577057c28935f0909ce3
Reviewed-on: https://chromium-review.googlesource.com/896625Reviewed-by: default avatarAlex Sakhartchouk <alexst@chromium.org>
Commit-Queue: Michael Spang <spang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#533493}
parent 94f7e5c0
...@@ -18,6 +18,7 @@ namespace tracing { ...@@ -18,6 +18,7 @@ namespace tracing {
namespace { namespace {
const char kPathTracefs[] = "/sys/kernel/tracing"; const char kPathTracefs[] = "/sys/kernel/tracing";
const char kPathDebugfsTracing[] = "/sys/kernel/debug/tracing";
const char kTraceFileTracingOn[] = "tracing_on"; const char kTraceFileTracingOn[] = "tracing_on";
const char kTraceFileTraceMarker[] = "trace_marker"; const char kTraceFileTraceMarker[] = "trace_marker";
const char kTraceFileSetEvent[] = "set_event"; const char kTraceFileSetEvent[] = "set_event";
...@@ -99,8 +100,10 @@ void AddCategoryEvents(const std::string& category, ...@@ -99,8 +100,10 @@ void AddCategoryEvents(const std::string& category,
LOG(WARNING) << "Unrecognized category: " << category; LOG(WARNING) << "Unrecognized category: " << category;
} }
bool WriteTracingFile(const char* trace_file, base::StringPiece contents) { bool WriteTracingFile(const char* tracing_dir,
base::FilePath path = base::FilePath(kPathTracefs).Append(trace_file); const char* trace_file,
base::StringPiece contents) {
base::FilePath path = base::FilePath(tracing_dir).Append(trace_file);
if (!base::WriteFile(path, contents.data(), contents.size())) { if (!base::WriteFile(path, contents.data(), contents.size())) {
PLOG(ERROR) << "write: " << path; PLOG(ERROR) << "write: " << path;
...@@ -110,8 +113,8 @@ bool WriteTracingFile(const char* trace_file, base::StringPiece contents) { ...@@ -110,8 +113,8 @@ bool WriteTracingFile(const char* trace_file, base::StringPiece contents) {
return true; return true;
} }
bool EnableTraceEvent(base::StringPiece event) { bool EnableTraceEvent(const char* tracing_dir, base::StringPiece event) {
base::FilePath path = base::FilePath(kPathTracefs).Append(kTraceFileSetEvent); base::FilePath path = base::FilePath(tracing_dir).Append(kTraceFileSetEvent);
// Enabling events returns EINVAL if the event does not exist. It is normal // Enabling events returns EINVAL if the event does not exist. It is normal
// for driver specific events to be missing when the driver is not built in. // for driver specific events to be missing when the driver is not built in.
...@@ -124,6 +127,13 @@ bool EnableTraceEvent(base::StringPiece event) { ...@@ -124,6 +127,13 @@ bool EnableTraceEvent(base::StringPiece event) {
return true; return true;
} }
const char* FindTracingDir() {
base::FilePath path = base::FilePath(kPathTracefs).Append(kTraceFileSetEvent);
if (!access(path.value().c_str(), W_OK))
return kPathTracefs;
return kPathDebugfsTracing;
}
} // namespace } // namespace
bool IsValidCategory(base::StringPiece str) { bool IsValidCategory(base::StringPiece str) {
...@@ -151,41 +161,45 @@ bool StartFtrace(const std::vector<std::string>& categories) { ...@@ -151,41 +161,45 @@ bool StartFtrace(const std::vector<std::string>& categories) {
return false; return false;
} }
const char* tracing_dir = FindTracingDir();
// Disable tracing and clear events. // Disable tracing and clear events.
if (!WriteTracingFile(kTraceFileTracingOn, "0")) if (!WriteTracingFile(tracing_dir, kTraceFileTracingOn, "0"))
return false; return false;
if (!WriteTracingFile(kTraceFileSetEvent, "\n")) if (!WriteTracingFile(tracing_dir, kTraceFileSetEvent, "\n"))
return false; return false;
// Use CLOCK_MONOTONIC so that kernel timestamps align with std::steady_clock // Use CLOCK_MONOTONIC so that kernel timestamps align with std::steady_clock
// and base::TimeTicks. // and base::TimeTicks.
if (!WriteTracingFile(kTraceFileTraceClock, "mono")) if (!WriteTracingFile(tracing_dir, kTraceFileTraceClock, "mono"))
return false; return false;
for (const auto& event : events) for (const auto& event : events)
EnableTraceEvent(event); EnableTraceEvent(tracing_dir, event);
if (!WriteTracingFile(kTraceFileBufferSizeKb, kBufferSizeKbRunning)) if (!WriteTracingFile(tracing_dir, kTraceFileBufferSizeKb,
kBufferSizeKbRunning))
return false; return false;
if (!WriteTracingFile(kTraceFileTracingOn, "1")) if (!WriteTracingFile(tracing_dir, kTraceFileTracingOn, "1"))
return false; return false;
return true; return true;
} }
bool WriteFtraceTimeSyncMarker() { bool WriteFtraceTimeSyncMarker() {
return WriteTracingFile(kTraceFileTraceMarker, return WriteTracingFile(FindTracingDir(), kTraceFileTraceMarker,
"trace_event_clock_sync: parent_ts=0"); "trace_event_clock_sync: parent_ts=0");
} }
bool StopFtrace() { bool StopFtrace() {
if (!WriteTracingFile(kTraceFileTracingOn, "0")) if (!WriteTracingFile(FindTracingDir(), kTraceFileTracingOn, "0"))
return false; return false;
return true; return true;
} }
base::ScopedFD GetFtraceData() { base::ScopedFD GetFtraceData() {
base::FilePath path = base::FilePath(kPathTracefs).Append(kTraceFileTrace); base::FilePath path =
base::FilePath(FindTracingDir()).Append(kTraceFileTrace);
base::ScopedFD trace_data(HANDLE_EINTR( base::ScopedFD trace_data(HANDLE_EINTR(
open(path.value().c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK))); open(path.value().c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK)));
if (!trace_data.is_valid()) if (!trace_data.is_valid())
...@@ -194,9 +208,10 @@ base::ScopedFD GetFtraceData() { ...@@ -194,9 +208,10 @@ base::ScopedFD GetFtraceData() {
} }
bool ClearFtrace() { bool ClearFtrace() {
if (!WriteTracingFile(kTraceFileBufferSizeKb, kBufferSizeKbIdle)) const char* tracing_dir = FindTracingDir();
if (!WriteTracingFile(tracing_dir, kTraceFileBufferSizeKb, kBufferSizeKbIdle))
return false; return false;
if (!WriteTracingFile(kTraceFileTrace, "0")) if (!WriteTracingFile(tracing_dir, kTraceFileTrace, "0"))
return false; return false;
return true; return true;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment