trace_processor: support kfree_skb event
kfree_skb ftrace events indicates that the packet was discarded due to
some error. This patch shows the kfree skb count on the global counter
tracker.
Bug: 221349557
Test: ui/run-dev-server & manaul check the UI behavior
Test: tools/diff_test_trace_processor.py <trace_processor_shell> \
--query-metric-filter='kfree_skb'
Change-Id: I0f9135c24553bfb024b9c87e70f626a108199200
diff --git a/Android.bp b/Android.bp
index ff943ad..03cd439 100644
--- a/Android.bp
+++ b/Android.bp
@@ -4173,6 +4173,7 @@
"protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
+ "protos/perfetto/trace/ftrace/skb.proto",
"protos/perfetto/trace/ftrace/sock.proto",
"protos/perfetto/trace/ftrace/sync.proto",
"protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4395,6 +4396,7 @@
"protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
+ "protos/perfetto/trace/ftrace/skb.proto",
"protos/perfetto/trace/ftrace/sock.proto",
"protos/perfetto/trace/ftrace/sync.proto",
"protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4451,6 +4453,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/scm.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sde.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/signal.gen.cc",
+ "external/perfetto/protos/perfetto/trace/ftrace/skb.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sock.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sync.gen.cc",
"external/perfetto/protos/perfetto/trace/ftrace/synthetic.gen.cc",
@@ -4507,6 +4510,7 @@
"protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
+ "protos/perfetto/trace/ftrace/skb.proto",
"protos/perfetto/trace/ftrace/sock.proto",
"protos/perfetto/trace/ftrace/sync.proto",
"protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4563,6 +4567,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/scm.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/sde.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/signal.gen.h",
+ "external/perfetto/protos/perfetto/trace/ftrace/skb.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/sock.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/sync.gen.h",
"external/perfetto/protos/perfetto/trace/ftrace/synthetic.gen.h",
@@ -4623,6 +4628,7 @@
"protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
+ "protos/perfetto/trace/ftrace/skb.proto",
"protos/perfetto/trace/ftrace/sock.proto",
"protos/perfetto/trace/ftrace/sync.proto",
"protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4678,6 +4684,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/scm.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sde.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/signal.pb.cc",
+ "external/perfetto/protos/perfetto/trace/ftrace/skb.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sock.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sync.pb.cc",
"external/perfetto/protos/perfetto/trace/ftrace/synthetic.pb.cc",
@@ -4734,6 +4741,7 @@
"protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
+ "protos/perfetto/trace/ftrace/skb.proto",
"protos/perfetto/trace/ftrace/sock.proto",
"protos/perfetto/trace/ftrace/sync.proto",
"protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4789,6 +4797,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/scm.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/sde.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/signal.pb.h",
+ "external/perfetto/protos/perfetto/trace/ftrace/skb.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/sock.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/sync.pb.h",
"external/perfetto/protos/perfetto/trace/ftrace/synthetic.pb.h",
@@ -4849,6 +4858,7 @@
"protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
+ "protos/perfetto/trace/ftrace/skb.proto",
"protos/perfetto/trace/ftrace/sock.proto",
"protos/perfetto/trace/ftrace/sync.proto",
"protos/perfetto/trace/ftrace/synthetic.proto",
@@ -4905,6 +4915,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/scm.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sde.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/signal.pbzero.cc",
+ "external/perfetto/protos/perfetto/trace/ftrace/skb.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sock.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/sync.pbzero.cc",
"external/perfetto/protos/perfetto/trace/ftrace/synthetic.pbzero.cc",
@@ -4961,6 +4972,7 @@
"protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
+ "protos/perfetto/trace/ftrace/skb.proto",
"protos/perfetto/trace/ftrace/sock.proto",
"protos/perfetto/trace/ftrace/sync.proto",
"protos/perfetto/trace/ftrace/synthetic.proto",
@@ -5017,6 +5029,7 @@
"external/perfetto/protos/perfetto/trace/ftrace/scm.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/sde.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/signal.pbzero.h",
+ "external/perfetto/protos/perfetto/trace/ftrace/skb.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/sock.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/sync.pbzero.h",
"external/perfetto/protos/perfetto/trace/ftrace/synthetic.pbzero.h",
diff --git a/BUILD b/BUILD
index 7e47fd9..2d41c88 100644
--- a/BUILD
+++ b/BUILD
@@ -2841,6 +2841,7 @@
"protos/perfetto/trace/ftrace/scm.proto",
"protos/perfetto/trace/ftrace/sde.proto",
"protos/perfetto/trace/ftrace/signal.proto",
+ "protos/perfetto/trace/ftrace/skb.proto",
"protos/perfetto/trace/ftrace/sock.proto",
"protos/perfetto/trace/ftrace/sync.proto",
"protos/perfetto/trace/ftrace/synthetic.proto",
diff --git a/protos/perfetto/trace/ftrace/all_protos.gni b/protos/perfetto/trace/ftrace/all_protos.gni
index 7d43696..9ec8cf5 100644
--- a/protos/perfetto/trace/ftrace/all_protos.gni
+++ b/protos/perfetto/trace/ftrace/all_protos.gni
@@ -55,6 +55,7 @@
"scm.proto",
"sde.proto",
"signal.proto",
+ "skb.proto",
"sock.proto",
"sync.proto",
"synthetic.proto",
diff --git a/protos/perfetto/trace/ftrace/ftrace_event.proto b/protos/perfetto/trace/ftrace/ftrace_event.proto
index 13b3acb..d73dec4 100644
--- a/protos/perfetto/trace/ftrace/ftrace_event.proto
+++ b/protos/perfetto/trace/ftrace/ftrace_event.proto
@@ -55,6 +55,7 @@
import "protos/perfetto/trace/ftrace/scm.proto";
import "protos/perfetto/trace/ftrace/sde.proto";
import "protos/perfetto/trace/ftrace/signal.proto";
+import "protos/perfetto/trace/ftrace/skb.proto";
import "protos/perfetto/trace/ftrace/sock.proto";
import "protos/perfetto/trace/ftrace/sync.proto";
import "protos/perfetto/trace/ftrace/synthetic.proto";
@@ -460,5 +461,6 @@
CrosEcSensorhubDataFtraceEvent cros_ec_sensorhub_data = 364;
NapiGroReceiveEntryFtraceEvent napi_gro_receive_entry = 365;
NapiGroReceiveExitFtraceEvent napi_gro_receive_exit = 366;
+ KfreeSkbFtraceEvent kfree_skb = 367;
}
}
diff --git a/protos/perfetto/trace/ftrace/skb.proto b/protos/perfetto/trace/ftrace/skb.proto
new file mode 100644
index 0000000..b77f871
--- /dev/null
+++ b/protos/perfetto/trace/ftrace/skb.proto
@@ -0,0 +1,12 @@
+// Autogenerated by:
+// ../../tools/ftrace_proto_gen/ftrace_proto_gen.cc
+// Do not edit.
+
+syntax = "proto2";
+package perfetto.protos;
+
+message KfreeSkbFtraceEvent {
+ optional uint64 location = 1;
+ optional uint32 protocol = 2;
+ optional uint64 skbaddr = 3;
+}
diff --git a/protos/perfetto/trace/perfetto_trace.proto b/protos/perfetto/trace/perfetto_trace.proto
index 5b04757..c066c5c 100644
--- a/protos/perfetto/trace/perfetto_trace.proto
+++ b/protos/perfetto/trace/perfetto_trace.proto
@@ -5471,6 +5471,16 @@
// End of protos/perfetto/trace/ftrace/signal.proto
+// Begin of protos/perfetto/trace/ftrace/skb.proto
+
+message KfreeSkbFtraceEvent {
+ optional uint64 location = 1;
+ optional uint32 protocol = 2;
+ optional uint64 skbaddr = 3;
+}
+
+// End of protos/perfetto/trace/ftrace/skb.proto
+
// Begin of protos/perfetto/trace/ftrace/sock.proto
message InetSockSetStateFtraceEvent {
@@ -6009,6 +6019,7 @@
CrosEcSensorhubDataFtraceEvent cros_ec_sensorhub_data = 364;
NapiGroReceiveEntryFtraceEvent napi_gro_receive_entry = 365;
NapiGroReceiveExitFtraceEvent napi_gro_receive_exit = 366;
+ KfreeSkbFtraceEvent kfree_skb = 367;
}
}
diff --git a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
index e397165..2ac0e3c 100644
--- a/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_descriptors.cc
@@ -24,7 +24,7 @@
namespace trace_processor {
namespace {
-std::array<MessageDescriptor, 367> descriptors{{
+std::array<MessageDescriptor, 368> descriptors{{
{nullptr, 0, {}},
{nullptr, 0, {}},
{nullptr, 0, {}},
@@ -3952,6 +3952,16 @@
{"ret", ProtoSchemaType::kInt32},
},
},
+ {
+ "kfree_skb",
+ 3,
+ {
+ {},
+ {"location", ProtoSchemaType::kUint64},
+ {"protocol", ProtoSchemaType::kUint32},
+ {"skbaddr", ProtoSchemaType::kUint64},
+ },
+ },
}};
} // namespace
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index 1008761..b1f5c17 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -55,6 +55,7 @@
#include "protos/perfetto/trace/ftrace/scm.pbzero.h"
#include "protos/perfetto/trace/ftrace/sde.pbzero.h"
#include "protos/perfetto/trace/ftrace/signal.pbzero.h"
+#include "protos/perfetto/trace/ftrace/skb.pbzero.h"
#include "protos/perfetto/trace/ftrace/sock.pbzero.h"
#include "protos/perfetto/trace/ftrace/systrace.pbzero.h"
#include "protos/perfetto/trace/ftrace/task.pbzero.h"
@@ -111,6 +112,7 @@
cpu_freq_name_id_(context->storage->InternString("cpufreq")),
gpu_freq_name_id_(context->storage->InternString("gpufreq")),
cpu_idle_name_id_(context->storage->InternString("cpuidle")),
+ kfree_skb_name_id_(context->storage->InternString("Kfree Skb")),
ion_total_id_(context->storage->InternString("mem.ion")),
ion_change_id_(context->storage->InternString("mem.ion_change")),
ion_buffer_id_(context->storage->InternString("mem.ion_buffer")),
@@ -680,6 +682,10 @@
ParseCpuFrequencyLimits(ts, data);
break;
}
+ case FtraceEvent::kKfreeSkbFieldNumber: {
+ ParseKfreeSkb(ts, data);
+ break;
+ }
default:
break;
}
@@ -1880,5 +1886,16 @@
timestamp, static_cast<double>(evt.min_freq()), min_track);
}
+void FtraceParser::ParseKfreeSkb(int64_t timestamp,
+ protozero::ConstBytes blob) {
+ protos::pbzero::KfreeSkbFtraceEvent::Decoder evt(blob.data, blob.size);
+
+ num_of_kfree_skb_ += 1;
+ TrackId track =
+ context_->track_tracker->InternGlobalCounterTrack(kfree_skb_name_id_);
+ context_->event_tracker->PushCounter(
+ timestamp, static_cast<double>(num_of_kfree_skb_), track);
+}
+
} // namespace trace_processor
} // namespace perfetto
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.h b/src/trace_processor/importers/ftrace/ftrace_parser.h
index 934bb07..611c980 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.h
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.h
@@ -168,6 +168,7 @@
int64_t timestamp,
protozero::ConstBytes);
void ParseCpuFrequencyLimits(int64_t timestamp, protozero::ConstBytes);
+ void ParseKfreeSkb(int64_t timestamp, protozero::ConstBytes);
TraceProcessorContext* context_;
RssStatTracker rss_stat_tracker_;
@@ -178,6 +179,7 @@
const StringId cpu_freq_name_id_;
const StringId gpu_freq_name_id_;
const StringId cpu_idle_name_id_;
+ const StringId kfree_skb_name_id_;
const StringId ion_total_id_;
const StringId ion_change_id_;
const StringId ion_buffer_id_;
@@ -246,6 +248,9 @@
// Record number of transmitted bytes to the network interface card.
std::unordered_map<StringId, uint64_t> nic_transmitted_bytes_;
+ // Record number of kfree_skb.
+ uint64_t num_of_kfree_skb_ = 0;
+
// Keep sock to stream number mapping.
std::unordered_map<uint64_t, uint32_t> skaddr_to_stream_;
diff --git a/src/traced/probes/ftrace/event_info.cc b/src/traced/probes/ftrace/event_info.cc
index baf5468..bd88df6 100644
--- a/src/traced/probes/ftrace/event_info.cc
+++ b/src/traced/probes/ftrace/event_info.cc
@@ -6549,6 +6549,22 @@
kUnsetFtraceId,
325,
kUnsetSize},
+ {"kfree_skb",
+ "skb",
+ {
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "location", 1, ProtoSchemaType::kUint64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "protocol", 2, ProtoSchemaType::kUint32,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ {kUnsetOffset, kUnsetSize, FtraceFieldType::kInvalidFtraceFieldType,
+ "skbaddr", 3, ProtoSchemaType::kUint64,
+ TranslationStrategy::kInvalidTranslationStrategy},
+ },
+ kUnsetFtraceId,
+ 367,
+ kUnsetSize},
{"inet_sock_set_state",
"sock",
{
diff --git a/src/traced/probes/ftrace/test/data/synthetic/events/skb/kfree_skb/format b/src/traced/probes/ftrace/test/data/synthetic/events/skb/kfree_skb/format
new file mode 100644
index 0000000..5f55e20
--- /dev/null
+++ b/src/traced/probes/ftrace/test/data/synthetic/events/skb/kfree_skb/format
@@ -0,0 +1,13 @@
+name: kfree_skb
+ID: 925
+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:void * skbaddr; offset:8; size:8; signed:0;
+ field:void * location; offset:16; size:8; signed:0;
+ field:unsigned short protocol; offset:24; size:2; signed:0;
+
+print fmt: "skbaddr=%p protocol=%u location=%p", REC->skbaddr, REC->protocol, REC->location
diff --git a/test/trace_processor/network/index b/test/trace_processor/network/index
index 3f8fa33..01ad31b 100644
--- a/test/trace_processor/network/index
+++ b/test/trace_processor/network/index
@@ -5,3 +5,4 @@
inet_sock_set_state.textproto inet_sock_set_state.sql inet_sock_set_state.out
tcp_retransmit_skb.textproto tcp_retransmit_skb.sql tcp_retransmit_skb.out
napi_gro_receive.textproto napi_gro_receive.sql napi_gro_receive.out
+kfree_skb.textproto kfree_skb.sql kfree_skb.out
\ No newline at end of file
diff --git a/test/trace_processor/network/kfree_skb.out b/test/trace_processor/network/kfree_skb.out
new file mode 100644
index 0000000..b565496
--- /dev/null
+++ b/test/trace_processor/network/kfree_skb.out
@@ -0,0 +1,5 @@
+"ts"
+10000
+10020
+20000
+20020
diff --git a/test/trace_processor/network/kfree_skb.sql b/test/trace_processor/network/kfree_skb.sql
new file mode 100644
index 0000000..b985091
--- /dev/null
+++ b/test/trace_processor/network/kfree_skb.sql
@@ -0,0 +1,10 @@
+SELECT
+ ts
+FROM
+ counter AS c
+ LEFT JOIN
+ counter_track AS t
+ ON c.track_id = t.id
+WHERE
+ name GLOB "Kfree Skb"
+ORDER BY ts;
\ No newline at end of file
diff --git a/test/trace_processor/network/kfree_skb.textproto b/test/trace_processor/network/kfree_skb.textproto
new file mode 100644
index 0000000..bda1c2b
--- /dev/null
+++ b/test/trace_processor/network/kfree_skb.textproto
@@ -0,0 +1,44 @@
+packet {
+ ftrace_events {
+ cpu: 2
+ event {
+ timestamp: 10000
+ pid: 200
+ kfree_skb {
+ }
+ }
+ }
+}
+packet {
+ ftrace_events {
+ cpu: 2
+ event {
+ timestamp: 10020
+ pid: 300
+ kfree_skb {
+ }
+ }
+ }
+}
+packet {
+ ftrace_events {
+ cpu: 2
+ event {
+ timestamp: 20000
+ pid: 200
+ kfree_skb {
+ }
+ }
+ }
+}
+packet {
+ ftrace_events {
+ cpu: 2
+ event {
+ timestamp: 20020
+ pid: 300
+ kfree_skb {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tools/ftrace_proto_gen/event_list b/tools/ftrace_proto_gen/event_list
index 948eb11..698528a 100644
--- a/tools/ftrace_proto_gen/event_list
+++ b/tools/ftrace_proto_gen/event_list
@@ -361,3 +361,4 @@
cros_ec/cros_ec_sensorhub_data
net/napi_gro_receive_entry
net/napi_gro_receive_exit
+skb/kfree_skb