aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVilas Bhat <vilasbhat@google.com>2024-04-09 14:49:23 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-04-09 14:49:23 +0000
commit9c25054f06aa437e643a5d30aaef1c5094444b4b (patch)
treef1411c57e348b3495aa1eeb9ac4e2b9355d22500
parentd1be345fc00910f52ce4bd8033edde3fc5fb66e9 (diff)
parente808db727c990047224dbf61f7360828bd316501 (diff)
downloadperfetto-9c25054f06aa437e643a5d30aaef1c5094444b4b.tar.gz
Merge "perfetto/ftrace: Introduce f2fs garbage collection ftrace events" into main
-rw-r--r--protos/perfetto/trace/ftrace/f2fs.proto34
-rw-r--r--protos/perfetto/trace/ftrace/ftrace_event.proto3
-rw-r--r--protos/perfetto/trace/perfetto_trace.proto37
-rw-r--r--src/tools/ftrace_proto_gen/event_list5
-rw-r--r--src/trace_processor/importers/ftrace/ftrace_descriptors.cc80
-rw-r--r--src/traced/probes/ftrace/event_info.cc105
-rw-r--r--src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_background_gc/format14
-rw-r--r--src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_gc_begin/format21
-rw-r--r--src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_gc_end/format21
9 files changed, 318 insertions, 2 deletions
diff --git a/protos/perfetto/trace/ftrace/f2fs.proto b/protos/perfetto/trace/ftrace/f2fs.proto
index 0e5938448..eb8be75c2 100644
--- a/protos/perfetto/trace/ftrace/f2fs.proto
+++ b/protos/perfetto/trace/ftrace/f2fs.proto
@@ -288,3 +288,37 @@ message F2fsIostatLatencyFtraceEvent {
optional uint32 n_wr_s_cnt = 27;
optional uint32 n_wr_s_peak = 28;
}
+message F2fsBackgroundGcFtraceEvent {
+ optional uint64 dev = 1;
+ optional uint32 wait_ms = 2;
+ optional uint32 prefree = 3;
+ optional uint32 free = 4;
+}
+message F2fsGcBeginFtraceEvent {
+ optional uint64 dev = 1;
+ optional uint32 sync = 2;
+ optional uint32 background = 3;
+ optional int64 dirty_nodes = 4;
+ optional int64 dirty_dents = 5;
+ optional int64 dirty_imeta = 6;
+ optional uint32 free_sec = 7;
+ optional uint32 free_seg = 8;
+ optional int32 reserved_seg = 9;
+ optional uint32 prefree_seg = 10;
+ optional int32 gc_type = 11;
+ optional uint32 no_bg_gc = 12;
+ optional uint32 nr_free_secs = 13;
+}
+message F2fsGcEndFtraceEvent {
+ optional uint64 dev = 1;
+ optional int32 ret = 2;
+ optional int32 seg_freed = 3;
+ optional int32 sec_freed = 4;
+ optional int64 dirty_nodes = 5;
+ optional int64 dirty_dents = 6;
+ optional int64 dirty_imeta = 7;
+ optional uint32 free_sec = 8;
+ optional uint32 free_seg = 9;
+ optional int32 reserved_seg = 10;
+ optional uint32 prefree_seg = 11;
+}
diff --git a/protos/perfetto/trace/ftrace/ftrace_event.proto b/protos/perfetto/trace/ftrace/ftrace_event.proto
index e0b1eeba6..5d5bf0665 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event.proto
@@ -611,5 +611,8 @@ message FtraceEvent {
DpuDsiCmdFifoStatusFtraceEvent dpu_dsi_cmd_fifo_status = 492;
DpuDsiRxFtraceEvent dpu_dsi_rx = 493;
DpuDsiTxFtraceEvent dpu_dsi_tx = 494;
+ F2fsBackgroundGcFtraceEvent f2fs_background_gc = 495;
+ F2fsGcBeginFtraceEvent f2fs_gc_begin = 496;
+ F2fsGcEndFtraceEvent f2fs_gc_end = 497;
}
}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index fc89f813f..c8b4c9e86 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -8284,6 +8284,40 @@ message F2fsIostatLatencyFtraceEvent {
optional uint32 n_wr_s_cnt = 27;
optional uint32 n_wr_s_peak = 28;
}
+message F2fsBackgroundGcFtraceEvent {
+ optional uint64 dev = 1;
+ optional uint32 wait_ms = 2;
+ optional uint32 prefree = 3;
+ optional uint32 free = 4;
+}
+message F2fsGcBeginFtraceEvent {
+ optional uint64 dev = 1;
+ optional uint32 sync = 2;
+ optional uint32 background = 3;
+ optional int64 dirty_nodes = 4;
+ optional int64 dirty_dents = 5;
+ optional int64 dirty_imeta = 6;
+ optional uint32 free_sec = 7;
+ optional uint32 free_seg = 8;
+ optional int32 reserved_seg = 9;
+ optional uint32 prefree_seg = 10;
+ optional int32 gc_type = 11;
+ optional uint32 no_bg_gc = 12;
+ optional uint32 nr_free_secs = 13;
+}
+message F2fsGcEndFtraceEvent {
+ optional uint64 dev = 1;
+ optional int32 ret = 2;
+ optional int32 seg_freed = 3;
+ optional int32 sec_freed = 4;
+ optional int64 dirty_nodes = 5;
+ optional int64 dirty_dents = 6;
+ optional int64 dirty_imeta = 7;
+ optional uint32 free_sec = 8;
+ optional uint32 free_seg = 9;
+ optional int32 reserved_seg = 10;
+ optional uint32 prefree_seg = 11;
+}
// End of protos/perfetto/trace/ftrace/f2fs.proto
@@ -10637,6 +10671,9 @@ message FtraceEvent {
DpuDsiCmdFifoStatusFtraceEvent dpu_dsi_cmd_fifo_status = 492;
DpuDsiRxFtraceEvent dpu_dsi_rx = 493;
DpuDsiTxFtraceEvent dpu_dsi_tx = 494;
+ F2fsBackgroundGcFtraceEvent f2fs_background_gc = 495;
+ F2fsGcBeginFtraceEvent f2fs_gc_begin = 496;
+ F2fsGcEndFtraceEvent f2fs_gc_end = 497;
}
}
diff --git a/src/tools/ftrace_proto_gen/event_list b/src/tools/ftrace_proto_gen/event_list
index c4b480780..db13230fd 100644
--- a/src/tools/ftrace_proto_gen/event_list
+++ b/src/tools/ftrace_proto_gen/event_list
@@ -488,4 +488,7 @@ panel/panel_write_generic
sched/sched_migrate_task
dpu/dsi_cmd_fifo_status
dpu/dsi_rx
-dpu/dsi_tx \ No newline at end of file
+dpu/dsi_tx
+f2fs/f2fs_background_gc
+f2fs/f2fs_gc_begin
+f2fs/f2fs_gc_end
diff --git a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
index f272e6d8a..3b846f4e1 100644
--- a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
@@ -24,7 +24,7 @@ namespace perfetto {
namespace trace_processor {
namespace {
-std::array<FtraceMessageDescriptor, 492> descriptors{{
+std::array<FtraceMessageDescriptor, 498> descriptors{{
{nullptr, 0, {}},
{nullptr, 0, {}},
{nullptr, 0, {}},
@@ -5423,6 +5423,84 @@ std::array<FtraceMessageDescriptor, 492> descriptors{{
{"load", ProtoSchemaType::kUint32},
},
},
+ {
+ "dpu_dsi_cmd_fifo_status",
+ 2,
+ {
+ {},
+ {"header", ProtoSchemaType::kUint32},
+ {"payload", ProtoSchemaType::kUint32},
+ },
+ },
+ {
+ "dpu_dsi_rx",
+ 2,
+ {
+ {},
+ {"cmd", ProtoSchemaType::kUint32},
+ {"rx_buf", ProtoSchemaType::kUint32},
+ },
+ },
+ {
+ "dpu_dsi_tx",
+ 4,
+ {
+ {},
+ {"type", ProtoSchemaType::kUint32},
+ {"tx_buf", ProtoSchemaType::kUint32},
+ {"last", ProtoSchemaType::kUint32},
+ {"delay_ms", ProtoSchemaType::kUint32},
+ },
+ },
+ {
+ "f2fs_background_gc",
+ 4,
+ {
+ {},
+ {"dev", ProtoSchemaType::kUint64},
+ {"wait_ms", ProtoSchemaType::kUint32},
+ {"prefree", ProtoSchemaType::kUint32},
+ {"free", ProtoSchemaType::kUint32},
+ },
+ },
+ {
+ "f2fs_gc_begin",
+ 13,
+ {
+ {},
+ {"dev", ProtoSchemaType::kUint64},
+ {"sync", ProtoSchemaType::kUint32},
+ {"background", ProtoSchemaType::kUint32},
+ {"dirty_nodes", ProtoSchemaType::kInt64},
+ {"dirty_dents", ProtoSchemaType::kInt64},
+ {"dirty_imeta", ProtoSchemaType::kInt64},
+ {"free_sec", ProtoSchemaType::kUint32},
+ {"free_seg", ProtoSchemaType::kUint32},
+ {"reserved_seg", ProtoSchemaType::kInt32},
+ {"prefree_seg", ProtoSchemaType::kUint32},
+ {"gc_type", ProtoSchemaType::kInt32},
+ {"no_bg_gc", ProtoSchemaType::kUint32},
+ {"nr_free_secs", ProtoSchemaType::kUint32},
+ },
+ },
+ {
+ "f2fs_gc_end",
+ 11,
+ {
+ {},
+ {"dev", ProtoSchemaType::kUint64},
+ {"ret", ProtoSchemaType::kInt32},
+ {"seg_freed", ProtoSchemaType::kInt32},
+ {"sec_freed", ProtoSchemaType::kInt32},
+ {"dirty_nodes", ProtoSchemaType::kInt64},
+ {"dirty_dents", ProtoSchemaType::kInt64},
+ {"dirty_imeta", ProtoSchemaType::kInt64},
+ {"free_sec", ProtoSchemaType::kUint32},
+ {"free_seg", ProtoSchemaType::kUint32},
+ {"reserved_seg", ProtoSchemaType::kInt32},
+ {"prefree_seg", ProtoSchemaType::kUint32},
+ },
+ },
}};
} // namespace
diff --git a/src/traced/probes/ftrace/event_info.cc b/src/traced/probes/ftrace/event_info.cc
index 3778987a5..e472d060a 100644
--- a/src/traced/probes/ftrace/event_info.cc
+++ b/src/traced/probes/ftrace/event_info.cc
@@ -4637,6 +4637,111 @@ std::vector<Event> GetStaticEventInfo() {
kUnsetFtraceId,
420,
kUnsetSize},
+ {"f2fs_background_gc",
+ "f2fs",
+ {
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dev", 1, ProtoSchemaType::kUint64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "wait_ms", 2, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "prefree", 3, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "free", 4, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ },
+ kUnsetFtraceId,
+ 495,
+ kUnsetSize},
+ {"f2fs_gc_begin",
+ "f2fs",
+ {
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dev", 1, ProtoSchemaType::kUint64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "sync", 2, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "background", 3, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dirty_nodes", 4, ProtoSchemaType::kInt64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dirty_dents", 5, ProtoSchemaType::kInt64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dirty_imeta", 6, ProtoSchemaType::kInt64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "free_sec", 7, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "free_seg", 8, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "reserved_seg", 9, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "prefree_seg", 10, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "gc_type", 11, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "no_bg_gc", 12, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "nr_free_secs", 13, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ },
+ kUnsetFtraceId,
+ 496,
+ kUnsetSize},
+ {"f2fs_gc_end",
+ "f2fs",
+ {
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dev", 1, ProtoSchemaType::kUint64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "ret", 2, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "seg_freed", 3, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "sec_freed", 4, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dirty_nodes", 5, ProtoSchemaType::kInt64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dirty_dents", 6, ProtoSchemaType::kInt64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "dirty_imeta", 7, ProtoSchemaType::kInt64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "free_sec", 8, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "free_seg", 9, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "reserved_seg", 10, ProtoSchemaType::kInt32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "prefree_seg", 11, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ },
+ kUnsetFtraceId,
+ 497,
+ kUnsetSize},
{"fastrpc_dma_stat",
"fastrpc",
{
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_background_gc/format b/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_background_gc/format
new file mode 100644
index 000000000..f6aa90153
--- /dev/null
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_background_gc/format
@@ -0,0 +1,14 @@
+name: f2fs_background_gc
+ID: 519
+format:
+ field:unsigned short common_type; offset:0; size:2; signed:0;
+ field:unsigned char common_flags; offset:2; size:1; signed:0;
+ field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
+ field:int common_pid; offset:4; size:4; signed:1;
+
+ field:dev_t dev; offset:8; size:4; signed:0;
+ field:unsigned int wait_ms; offset:12; size:4; signed:0;
+ field:unsigned int prefree; offset:16; size:4; signed:0;
+ field:unsigned int free; offset:20; size:4; signed:0;
+
+print fmt: "dev = (%d,%d), wait_ms = %u, prefree = %u, free = %u", ((unsigned int) ((REC->dev) >> 20)), ((unsigned int) ((REC->dev) & ((1U << 20) - 1))), REC->wait_ms, REC->prefree, REC->free
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_gc_begin/format b/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_gc_begin/format
new file mode 100644
index 000000000..502decacb
--- /dev/null
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_gc_begin/format
@@ -0,0 +1,21 @@
+name: f2fs_gc_begin
+ID: 520
+format:
+ field:unsigned short common_type; offset:0; size:2; signed:0;
+ field:unsigned char common_flags; offset:2; size:1; signed:0;
+ field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
+ field:int common_pid; offset:4; size:4; signed:1;
+
+ field:dev_t dev; offset:8; size:4; signed:0;
+ field:int gc_type; offset:12; size:4; signed:1;
+ field:bool no_bg_gc; offset:16; size:1; signed:0;
+ field:unsigned int nr_free_secs; offset:20; size:4; signed:0;
+ field:long long dirty_nodes; offset:24; size:8; signed:1;
+ field:long long dirty_dents; offset:32; size:8; signed:1;
+ field:long long dirty_imeta; offset:40; size:8; signed:1;
+ field:unsigned int free_sec; offset:48; size:4; signed:0;
+ field:unsigned int free_seg; offset:52; size:4; signed:0;
+ field:int reserved_seg; offset:56; size:4; signed:1;
+ field:unsigned int prefree_seg; offset:60; size:4; signed:0;
+
+print fmt: "dev = (%d,%d), gc_type = %s, no_background_GC = %d, nr_free_secs = %u, nodes = %lld, dents = %lld, imeta = %lld, free_sec:%u, free_seg:%u, rsv_seg:%d, prefree_seg:%u", ((unsigned int) ((REC->dev) >> 20)), ((unsigned int) ((REC->dev) & ((1U << 20) - 1))), __print_symbolic(REC->gc_type, { 1, "Foreground GC" }, { 0, "Background GC" }), (REC->gc_type == 0) ? REC->no_bg_gc : -1, REC->nr_free_secs, REC->dirty_nodes, REC->dirty_dents, REC->dirty_imeta, REC->free_sec, REC->free_seg, REC->reserved_seg, REC->prefree_seg
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_gc_end/format b/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_gc_end/format
new file mode 100644
index 000000000..14870b345
--- /dev/null
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/f2fs/f2fs_gc_end/format
@@ -0,0 +1,21 @@
+name: f2fs_gc_end
+ID: 521
+format:
+ field:unsigned short common_type; offset:0; size:2; signed:0;
+ field:unsigned char common_flags; offset:2; size:1; signed:0;
+ field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
+ field:int common_pid; offset:4; size:4; signed:1;
+
+ field:dev_t dev; offset:8; size:4; signed:0;
+ field:int ret; offset:12; size:4; signed:1;
+ field:int seg_freed; offset:16; size:4; signed:1;
+ field:int sec_freed; offset:20; size:4; signed:1;
+ field:long long dirty_nodes; offset:24; size:8; signed:1;
+ field:long long dirty_dents; offset:32; size:8; signed:1;
+ field:long long dirty_imeta; offset:40; size:8; signed:1;
+ field:unsigned int free_sec; offset:48; size:4; signed:0;
+ field:unsigned int free_seg; offset:52; size:4; signed:0;
+ field:int reserved_seg; offset:56; size:4; signed:1;
+ field:unsigned int prefree_seg; offset:60; size:4; signed:0;
+
+print fmt: "dev = (%d,%d), ret = %d, seg_freed = %d, sec_freed = %d, nodes = %lld, dents = %lld, imeta = %lld, free_sec:%u, free_seg:%u, rsv_seg:%d, prefree_seg:%u", ((unsigned int) ((REC->dev) >> 20)), ((unsigned int) ((REC->dev) & ((1U << 20) - 1))), REC->ret, REC->seg_freed, REC->sec_freed, REC->dirty_nodes, REC->dirty_dents, REC->dirty_imeta, REC->free_sec, REC->free_seg, REC->reserved_seg, REC->prefree_seg