aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOctavian Tuchila <octaviant@google.com>2021-10-06 09:31:46 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2021-10-06 09:31:46 +0000
commit2cac07b0f803fad494a397505b791a57f08a432d (patch)
treee39a16e10a11ae28c980e0e06a0cf68f1dadf4ec
parent9412f737242359dc48cb009740216ac389b961ce (diff)
parent9c4b8a72b9eadebf89bbdde48c0bfcb3f2d01cff (diff)
downloadperfetto-2cac07b0f803fad494a397505b791a57f08a432d.tar.gz
Merge "ui: Show direct_reclaim begin/end information"
-rw-r--r--docs/data-sources/atrace.md2
-rw-r--r--src/trace_processor/importers/ftrace/ftrace_parser.cc63
-rw-r--r--src/trace_processor/importers/ftrace/ftrace_parser.h9
-rw-r--r--src/traced/probes/ftrace/event_info.cc24
4 files changed, 97 insertions, 1 deletions
diff --git a/docs/data-sources/atrace.md b/docs/data-sources/atrace.md
index 51e50f1f4..a54bd1a90 100644
--- a/docs/data-sources/atrace.md
+++ b/docs/data-sources/atrace.md
@@ -42,7 +42,7 @@ a managed execution environment, and a user-space <-> kernel-space roundtrip to
write the marker into `/sys/kernel/debug/tracing/trace_marker` (which is the
most expensive part).
-Our team is are looking into a migration path for Android, in light of the newly
+Our team is looking into a migration path for Android, in light of the newly
introduced [Tracing SDK](/docs/instrumentation/tracing-sdk.md). At the moment
the advice is to keep using the existing ATrace API on Android.
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index 425a0ed3f..9b5aba81e 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -56,6 +56,7 @@
#include "protos/perfetto/trace/ftrace/systrace.pbzero.h"
#include "protos/perfetto/trace/ftrace/task.pbzero.h"
#include "protos/perfetto/trace/ftrace/thermal.pbzero.h"
+#include "protos/perfetto/trace/ftrace/vmscan.pbzero.h"
#include "protos/perfetto/trace/ftrace/workqueue.pbzero.h"
#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
@@ -125,6 +126,12 @@ FtraceParser::FtraceParser(TraceProcessorContext* context)
workqueue_id_(context_->storage->InternString("workqueue")),
irq_id_(context_->storage->InternString("irq")),
ret_arg_id_(context_->storage->InternString("ret")),
+ direct_reclaim_order_id_(
+ context->storage->InternString("direct_reclaim_order")),
+ direct_reclaim_may_writepage_id_(
+ context->storage->InternString("direct_reclaim_may_writepage")),
+ direct_reclaim_gfp_flags_id_(
+ context->storage->InternString("direct_reclaim_gfp_flags")),
vec_arg_id_(context->storage->InternString("vec")),
gpu_mem_total_name_id_(context->storage->InternString("GPU Memory")),
gpu_mem_total_unit_id_(context->storage->InternString(
@@ -498,6 +505,14 @@ util::Status FtraceParser::ParseFtraceEvent(uint32_t cpu,
ParseScmCallEnd(ts, pid, data);
break;
}
+ case FtraceEvent::kMmVmscanDirectReclaimBeginFieldNumber: {
+ ParseDirectReclaimBegin(ts, pid, data);
+ break;
+ }
+ case FtraceEvent::kMmVmscanDirectReclaimEndFieldNumber: {
+ ParseDirectReclaimEnd(ts, pid, data);
+ break;
+ }
case FtraceEvent::kWorkqueueExecuteStartFieldNumber: {
ParseWorkqueueExecuteStart(ts, pid, data, seq_state);
break;
@@ -1268,6 +1283,54 @@ void FtraceParser::ParseScmCallEnd(int64_t timestamp,
context_->slice_tracker->End(timestamp, track_id);
}
+void FtraceParser::ParseDirectReclaimBegin(int64_t timestamp,
+ uint32_t pid,
+ ConstBytes blob) {
+ UniqueTid utid = context_->process_tracker->GetOrCreateThread(pid);
+ TrackId track_id = context_->track_tracker->InternThreadTrack(utid);
+ protos::pbzero::MmVmscanDirectReclaimBeginFtraceEvent::Decoder
+ direct_reclaim_begin(blob.data, blob.size);
+
+ StringId name_id = context_->storage->InternString(
+ "mm_vmscan_direct_reclaim nr_reclaimed=?");
+
+ auto args_inserter = [this, &direct_reclaim_begin](
+ ArgsTracker::BoundInserter* inserter) {
+ inserter->AddArg(direct_reclaim_order_id_,
+ Variadic::Integer(direct_reclaim_begin.order()));
+ inserter->AddArg(direct_reclaim_may_writepage_id_,
+ Variadic::Integer(direct_reclaim_begin.may_writepage()));
+ inserter->AddArg(
+ direct_reclaim_gfp_flags_id_,
+ Variadic::UnsignedInteger(direct_reclaim_begin.gfp_flags()));
+ };
+ context_->slice_tracker->Begin(timestamp, track_id, kNullStringId, name_id,
+ args_inserter);
+}
+
+void FtraceParser::ParseDirectReclaimEnd(int64_t timestamp,
+ uint32_t pid,
+ ConstBytes blob) {
+ protos::pbzero::ScmCallEndFtraceEvent::Decoder evt(blob.data, blob.size);
+ UniqueTid utid = context_->process_tracker->GetOrCreateThread(pid);
+ TrackId track_id = context_->track_tracker->InternThreadTrack(utid);
+ protos::pbzero::MmVmscanDirectReclaimEndFtraceEvent::Decoder
+ direct_reclame_end(blob.data, blob.size);
+
+ const auto opt_slice_id = context_->slice_tracker->End(timestamp, track_id);
+ if (opt_slice_id) {
+ auto* slice_table = context_->storage->mutable_slice_table();
+ uint32_t row_idx = *slice_table->id().IndexOf(*opt_slice_id);
+
+ char str[128];
+ sprintf(str, "mm_vmscan_direct_reclaim nr_reclaimed=%" PRIu64,
+ direct_reclame_end.nr_reclaimed());
+ StringId name_id = context_->storage->InternString(str);
+
+ slice_table->mutable_name()->Set(row_idx, name_id);
+ }
+}
+
void FtraceParser::ParseWorkqueueExecuteStart(
int64_t timestamp,
uint32_t pid,
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.h b/src/trace_processor/importers/ftrace/ftrace_parser.h
index 79e1c6584..5ba69f530 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.h
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.h
@@ -120,6 +120,12 @@ class FtraceParser {
uint32_t pid,
protozero::ConstBytes);
void ParseScmCallEnd(int64_t timestamp, uint32_t pid, protozero::ConstBytes);
+ void ParseDirectReclaimBegin(int64_t timestamp,
+ uint32_t pid,
+ protozero::ConstBytes);
+ void ParseDirectReclaimEnd(int64_t timestamp,
+ uint32_t pid,
+ protozero::ConstBytes);
void ParseWorkqueueExecuteStart(int64_t timestamp,
uint32_t pid,
protozero::ConstBytes,
@@ -174,6 +180,9 @@ class FtraceParser {
const StringId workqueue_id_;
const StringId irq_id_;
const StringId ret_arg_id_;
+ const StringId direct_reclaim_order_id_;
+ const StringId direct_reclaim_may_writepage_id_;
+ const StringId direct_reclaim_gfp_flags_id_;
const StringId vec_arg_id_;
const StringId gpu_mem_total_name_id_;
const StringId gpu_mem_total_unit_id_;
diff --git a/src/traced/probes/ftrace/event_info.cc b/src/traced/probes/ftrace/event_info.cc
index 9422d521f..9d6ac9ddc 100644
--- a/src/traced/probes/ftrace/event_info.cc
+++ b/src/traced/probes/ftrace/event_info.cc
@@ -6218,6 +6218,30 @@ std::vector<Event> GetStaticEventInfo() {
338,
kUnsetSize},
{"scm_call_end", "scm", {}, kUnsetFtraceId, 339, kUnsetSize},
+ {"mm_vmscan_direct_reclaim_begin",
+ "vmscan",
+ {
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "order", 1, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "may_writepage", 2, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "gfp_flags", 3, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ },
+ kUnsetFtraceId,
+ 338,
+ kUnsetSize},
+ {"mm_vmscan_direct_reclaim_end",
+ "vmscan",
+ {{kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "nr_reclaimed", 1, ProtoSchemaType::kUint64,
+ TranslationStrategy::kInvalidTranslationStrategy}},
+ kUnsetFtraceId,
+ 339,
+ kUnsetSize},
{"tracing_mark_write",
"sde",
{