Merge "Set SHM config for multiple producers."
diff --git a/src/traced/probes/filesystem/inode_file_data_source.cc b/src/traced/probes/filesystem/inode_file_data_source.cc
index 77e85db..2f5c590 100644
--- a/src/traced/probes/filesystem/inode_file_data_source.cc
+++ b/src/traced/probes/filesystem/inode_file_data_source.cc
@@ -21,6 +21,7 @@
#include <sys/types.h>
#include <unistd.h>
#include <queue>
+#include <unordered_map>
#include "perfetto/base/logging.h"
#include "perfetto/base/scoped_file.h"
@@ -84,12 +85,13 @@
void CreateStaticDeviceToInodeMap(
const std::string& root_directory,
- std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* static_file_map) {
+ std::map<BlockDeviceID, std::unordered_map<Inode, InodeMapValue>>*
+ static_file_map) {
ScanFilesDFS(root_directory,
[static_file_map](BlockDeviceID block_device_id,
Inode inode_number, const std::string& path,
protos::pbzero::InodeFileMap_Entry_Type type) {
- std::map<Inode, InodeMapValue>& inode_map =
+ std::unordered_map<Inode, InodeMapValue>& inode_map =
(*static_file_map)[block_device_id];
inode_map[inode_number].SetType(type);
inode_map[inode_number].AddPath(path);
@@ -109,7 +111,8 @@
InodeFileDataSource::InodeFileDataSource(
TracingSessionID id,
- std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* static_file_map,
+ std::map<BlockDeviceID, std::unordered_map<Inode, InodeMapValue>>*
+ static_file_map,
LRUInodeCache* cache,
std::unique_ptr<TraceWriter> writer)
: session_id_(id),
@@ -153,7 +156,8 @@
});
// Could not be found, just add the inode number
- PERFETTO_DLOG("%zu inodes not found", inode_numbers->size());
+ if (inode_numbers->size() != 0)
+ PERFETTO_DLOG("%zu inodes not found", inode_numbers->size());
for (const auto& unresolved_inode : *inode_numbers) {
auto* entry = destination->add_entries();
entry->set_inode_number(unresolved_inode);
@@ -200,7 +204,8 @@
it = inode_numbers->erase(it);
FillInodeEntry(destination, inode_number, *value);
}
- PERFETTO_DLOG("%" PRIu64 " inodes found in cache", cache_found_count);
+ if (cache_found_count > 0)
+ PERFETTO_DLOG("%" PRIu64 " inodes found in cache", cache_found_count);
}
void InodeFileDataSource::OnInodes(
diff --git a/src/traced/probes/filesystem/inode_file_data_source.h b/src/traced/probes/filesystem/inode_file_data_source.h
index db6d887..af881d4 100644
--- a/src/traced/probes/filesystem/inode_file_data_source.h
+++ b/src/traced/probes/filesystem/inode_file_data_source.h
@@ -23,6 +23,7 @@
#include <memory>
#include <set>
#include <string>
+#include <unordered_map>
#include "perfetto/base/weak_ptr.h"
#include "perfetto/traced/data_source_types.h"
@@ -48,7 +49,8 @@
// Creates block_device_map for /system partition
void CreateStaticDeviceToInodeMap(
const std::string& root_directory,
- std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* static_file_map);
+ std::map<BlockDeviceID, std::unordered_map<Inode, InodeMapValue>>*
+ static_file_map);
void FillInodeEntry(InodeFileMap* destination,
Inode inode_number,
@@ -58,7 +60,8 @@
public:
InodeFileDataSource(
TracingSessionID,
- std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* static_file_map,
+ std::map<BlockDeviceID, std::unordered_map<Inode, InodeMapValue>>*
+ static_file_map,
LRUInodeCache* cache,
std::unique_ptr<TraceWriter> writer);
@@ -89,7 +92,8 @@
private:
const TracingSessionID session_id_;
- std::map<BlockDeviceID, std::map<Inode, InodeMapValue>>* static_file_map_;
+ std::map<BlockDeviceID, std::unordered_map<Inode, InodeMapValue>>*
+ static_file_map_;
LRUInodeCache* cache_;
std::multimap<BlockDeviceID, std::string> mount_points_;
std::unique_ptr<TraceWriter> writer_;
diff --git a/src/traced/probes/probes_producer.h b/src/traced/probes/probes_producer.h
index b5b8d5e..bd550c7 100644
--- a/src/traced/probes/probes_producer.h
+++ b/src/traced/probes/probes_producer.h
@@ -146,7 +146,8 @@
std::map<DataSourceInstanceID, std::unique_ptr<InodeFileDataSource>>
file_map_sources_;
LRUInodeCache cache_{kLRUInodeCacheSize};
- std::map<BlockDeviceID, std::map<Inode, InodeMapValue>> system_inodes_;
+ std::map<BlockDeviceID, std::unordered_map<Inode, InodeMapValue>>
+ system_inodes_;
};
} // namespace perfetto
diff --git a/tools/fix_include_guards b/tools/fix_include_guards
index fd674c0..8c8d4e0 100755
--- a/tools/fix_include_guards
+++ b/tools/fix_include_guards
@@ -56,7 +56,7 @@
def main():
checkonly = '--check-only' in sys.argv
num_files_changed = 0
- for topdir in ('src', 'include', 'test'):
+ for topdir in ('src', 'include', 'test', 'tools'):
for root, dirs, files in os.walk(topdir):
for name in files:
if not name.endswith('.h'):
diff --git a/tools/ftrace_proto_gen/ftrace_proto_gen.h b/tools/ftrace_proto_gen/ftrace_proto_gen.h
index 7b82791..a5be4f4 100644
--- a/tools/ftrace_proto_gen/ftrace_proto_gen.h
+++ b/tools/ftrace_proto_gen/ftrace_proto_gen.h
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+#ifndef TOOLS_FTRACE_PROTO_GEN_FTRACE_PROTO_GEN_H_
+#define TOOLS_FTRACE_PROTO_GEN_FTRACE_PROTO_GEN_H_
+
#include <set>
#include <string>
#include <vector>
@@ -50,3 +53,5 @@
void GenerateEventInfo(const std::vector<std::string>& events_info);
} // namespace perfetto
+
+#endif // TOOLS_FTRACE_PROTO_GEN_FTRACE_PROTO_GEN_H_
diff --git a/tools/trace_to_text/BUILD.gn b/tools/trace_to_text/BUILD.gn
index e0c63d9..90e1233c 100644
--- a/tools/trace_to_text/BUILD.gn
+++ b/tools/trace_to_text/BUILD.gn
@@ -21,6 +21,8 @@
"../../protos/perfetto/trace:lite",
]
sources = [
+ "ftrace_event_formatter.cc",
+ "ftrace_event_formatter.h",
"main.cc",
]
}
diff --git a/tools/trace_to_text/ftrace_event_formatter.cc b/tools/trace_to_text/ftrace_event_formatter.cc
new file mode 100644
index 0000000..1120d7a
--- /dev/null
+++ b/tools/trace_to_text/ftrace_event_formatter.cc
@@ -0,0 +1,2611 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "tools/trace_to_text/ftrace_event_formatter.h"
+
+#include <inttypes.h>
+
+namespace perfetto {
+namespace {
+
+using protos::BinderLockFtraceEvent;
+using protos::BinderLockedFtraceEvent;
+using protos::BinderSetPriorityFtraceEvent;
+using protos::BinderTransactionFtraceEvent;
+using protos::BinderTransactionReceivedFtraceEvent;
+using protos::BinderUnlockFtraceEvent;
+using protos::BlockBioBackmergeFtraceEvent;
+using protos::BlockBioBounceFtraceEvent;
+using protos::BlockBioCompleteFtraceEvent;
+using protos::BlockBioFrontmergeFtraceEvent;
+using protos::BlockBioQueueFtraceEvent;
+using protos::BlockBioRemapFtraceEvent;
+using protos::BlockDirtyBufferFtraceEvent;
+using protos::BlockGetrqFtraceEvent;
+using protos::BlockPlugFtraceEvent;
+using protos::BlockRqAbortFtraceEvent;
+using protos::BlockRqCompleteFtraceEvent;
+using protos::BlockRqInsertFtraceEvent;
+using protos::BlockRqIssueFtraceEvent;
+using protos::BlockRqRemapFtraceEvent;
+using protos::BlockRqRequeueFtraceEvent;
+using protos::BlockSleeprqFtraceEvent;
+using protos::BlockSplitFtraceEvent;
+using protos::BlockTouchBufferFtraceEvent;
+using protos::BlockUnplugFtraceEvent;
+using protos::CgroupAttachTaskFtraceEvent;
+using protos::CgroupDestroyRootFtraceEvent;
+using protos::CgroupMkdirFtraceEvent;
+using protos::CgroupReleaseFtraceEvent;
+using protos::CgroupRemountFtraceEvent;
+using protos::CgroupRenameFtraceEvent;
+using protos::CgroupRmdirFtraceEvent;
+using protos::CgroupSetupRootFtraceEvent;
+using protos::CgroupTransferTasksFtraceEvent;
+using protos::MmCompactionBeginFtraceEvent;
+using protos::MmCompactionDeferCompactionFtraceEvent;
+using protos::MmCompactionDeferResetFtraceEvent;
+using protos::MmCompactionDeferredFtraceEvent;
+using protos::MmCompactionEndFtraceEvent;
+using protos::MmCompactionFinishedFtraceEvent;
+using protos::MmCompactionIsolateFreepagesFtraceEvent;
+using protos::MmCompactionIsolateMigratepagesFtraceEvent;
+using protos::MmCompactionKcompactdSleepFtraceEvent;
+using protos::MmCompactionKcompactdWakeFtraceEvent;
+using protos::MmCompactionMigratepagesFtraceEvent;
+using protos::MmCompactionSuitableFtraceEvent;
+using protos::MmCompactionTryToCompactPagesFtraceEvent;
+using protos::MmCompactionWakeupKcompactdFtraceEvent;
+using protos::CpufreqInteractiveAlreadyFtraceEvent;
+using protos::CpufreqInteractiveBoostFtraceEvent;
+using protos::CpufreqInteractiveNotyetFtraceEvent;
+using protos::CpufreqInteractiveSetspeedFtraceEvent;
+using protos::CpufreqInteractiveTargetFtraceEvent;
+using protos::CpufreqInteractiveUnboostFtraceEvent;
+using protos::Ext4AllocDaBlocksFtraceEvent;
+using protos::Ext4AllocateBlocksFtraceEvent;
+using protos::Ext4AllocateInodeFtraceEvent;
+using protos::Ext4BeginOrderedTruncateFtraceEvent;
+using protos::Ext4CollapseRangeFtraceEvent;
+using protos::Ext4DaReleaseSpaceFtraceEvent;
+using protos::Ext4DaReserveSpaceFtraceEvent;
+using protos::Ext4DaUpdateReserveSpaceFtraceEvent;
+using protos::Ext4DaWriteBeginFtraceEvent;
+using protos::Ext4DaWriteEndFtraceEvent;
+using protos::Ext4DaWritePagesFtraceEvent;
+using protos::Ext4DaWritePagesExtentFtraceEvent;
+using protos::Ext4DirectIOEnterFtraceEvent;
+using protos::Ext4DirectIOExitFtraceEvent;
+using protos::Ext4DiscardBlocksFtraceEvent;
+using protos::Ext4DiscardPreallocationsFtraceEvent;
+using protos::Ext4DropInodeFtraceEvent;
+using protos::Ext4EsCacheExtentFtraceEvent;
+using protos::Ext4EsFindDelayedExtentRangeEnterFtraceEvent;
+using protos::Ext4EsFindDelayedExtentRangeExitFtraceEvent;
+using protos::Ext4EsInsertExtentFtraceEvent;
+using protos::Ext4EsLookupExtentEnterFtraceEvent;
+using protos::Ext4EsLookupExtentExitFtraceEvent;
+using protos::Ext4EsRemoveExtentFtraceEvent;
+using protos::Ext4EsShrinkFtraceEvent;
+using protos::Ext4EsShrinkCountFtraceEvent;
+using protos::Ext4EsShrinkScanEnterFtraceEvent;
+using protos::Ext4EsShrinkScanExitFtraceEvent;
+using protos::Ext4EvictInodeFtraceEvent;
+using protos::Ext4ExtConvertToInitializedEnterFtraceEvent;
+using protos::Ext4ExtConvertToInitializedFastpathFtraceEvent;
+using protos::Ext4ExtHandleUnwrittenExtentsFtraceEvent;
+using protos::Ext4ExtInCacheFtraceEvent;
+using protos::Ext4ExtLoadExtentFtraceEvent;
+using protos::Ext4ExtMapBlocksEnterFtraceEvent;
+using protos::Ext4ExtMapBlocksExitFtraceEvent;
+using protos::Ext4ExtPutInCacheFtraceEvent;
+using protos::Ext4ExtRemoveSpaceFtraceEvent;
+using protos::Ext4ExtRemoveSpaceDoneFtraceEvent;
+using protos::Ext4ExtRmIdxFtraceEvent;
+using protos::Ext4ExtRmLeafFtraceEvent;
+using protos::Ext4ExtShowExtentFtraceEvent;
+using protos::Ext4FallocateEnterFtraceEvent;
+using protos::Ext4FallocateExitFtraceEvent;
+using protos::Ext4FindDelallocRangeFtraceEvent;
+using protos::Ext4ForgetFtraceEvent;
+using protos::Ext4FreeBlocksFtraceEvent;
+using protos::Ext4FreeInodeFtraceEvent;
+using protos::Ext4GetImpliedClusterAllocExitFtraceEvent;
+using protos::Ext4GetReservedClusterAllocFtraceEvent;
+using protos::Ext4IndMapBlocksEnterFtraceEvent;
+using protos::Ext4IndMapBlocksExitFtraceEvent;
+using protos::Ext4InsertRangeFtraceEvent;
+using protos::Ext4InvalidatepageFtraceEvent;
+using protos::Ext4JournalStartFtraceEvent;
+using protos::Ext4JournalStartReservedFtraceEvent;
+using protos::Ext4JournalledInvalidatepageFtraceEvent;
+using protos::Ext4JournalledWriteEndFtraceEvent;
+using protos::Ext4LoadInodeFtraceEvent;
+using protos::Ext4LoadInodeBitmapFtraceEvent;
+using protos::Ext4MarkInodeDirtyFtraceEvent;
+using protos::Ext4MbBitmapLoadFtraceEvent;
+using protos::Ext4MbBuddyBitmapLoadFtraceEvent;
+using protos::Ext4MbDiscardPreallocationsFtraceEvent;
+using protos::Ext4MbNewGroupPaFtraceEvent;
+using protos::Ext4MbNewInodePaFtraceEvent;
+using protos::Ext4MbReleaseGroupPaFtraceEvent;
+using protos::Ext4MbReleaseInodePaFtraceEvent;
+using protos::Ext4MballocAllocFtraceEvent;
+using protos::Ext4MballocDiscardFtraceEvent;
+using protos::Ext4MballocFreeFtraceEvent;
+using protos::Ext4MballocPreallocFtraceEvent;
+using protos::Ext4OtherInodeUpdateTimeFtraceEvent;
+using protos::Ext4PunchHoleFtraceEvent;
+using protos::Ext4ReadBlockBitmapLoadFtraceEvent;
+using protos::Ext4ReadpageFtraceEvent;
+using protos::Ext4ReleasepageFtraceEvent;
+using protos::Ext4RemoveBlocksFtraceEvent;
+using protos::Ext4RequestBlocksFtraceEvent;
+using protos::Ext4RequestInodeFtraceEvent;
+using protos::Ext4SyncFileEnterFtraceEvent;
+using protos::Ext4SyncFileExitFtraceEvent;
+using protos::Ext4SyncFsFtraceEvent;
+using protos::Ext4TrimAllFreeFtraceEvent;
+using protos::Ext4TrimExtentFtraceEvent;
+using protos::Ext4TruncateEnterFtraceEvent;
+using protos::Ext4TruncateExitFtraceEvent;
+using protos::Ext4UnlinkEnterFtraceEvent;
+using protos::Ext4UnlinkExitFtraceEvent;
+using protos::Ext4WriteBeginFtraceEvent;
+using protos::Ext4WriteEndFtraceEvent;
+using protos::Ext4WritepageFtraceEvent;
+using protos::Ext4WritepagesFtraceEvent;
+using protos::Ext4WritepagesResultFtraceEvent;
+using protos::Ext4ZeroRangeFtraceEvent;
+using protos::MmFilemapAddToPageCacheFtraceEvent;
+using protos::MmFilemapDeleteFromPageCacheFtraceEvent;
+using protos::PrintFtraceEvent;
+using protos::I2cReadFtraceEvent;
+using protos::I2cReplyFtraceEvent;
+using protos::I2cResultFtraceEvent;
+using protos::I2cWriteFtraceEvent;
+using protos::SmbusReadFtraceEvent;
+using protos::SmbusReplyFtraceEvent;
+using protos::SmbusResultFtraceEvent;
+using protos::SmbusWriteFtraceEvent;
+using protos::IpiEntryFtraceEvent;
+using protos::IpiExitFtraceEvent;
+using protos::IpiRaiseFtraceEvent;
+using protos::IrqHandlerEntryFtraceEvent;
+using protos::IrqHandlerExitFtraceEvent;
+using protos::SoftirqEntryFtraceEvent;
+using protos::SoftirqExitFtraceEvent;
+using protos::SoftirqRaiseFtraceEvent;
+using protos::LowmemoryKillFtraceEvent;
+using protos::MdpCmdKickoffFtraceEvent;
+using protos::MdpCmdPingpongDoneFtraceEvent;
+using protos::MdpCmdReadptrDoneFtraceEvent;
+using protos::MdpCmdReleaseBwFtraceEvent;
+using protos::MdpCmdWaitPingpongFtraceEvent;
+using protos::MdpCommitFtraceEvent;
+using protos::MdpCompareBwFtraceEvent;
+using protos::MdpMisrCrcFtraceEvent;
+using protos::MdpMixerUpdateFtraceEvent;
+using protos::MdpPerfPrefillCalcFtraceEvent;
+using protos::MdpPerfSetOtFtraceEvent;
+using protos::MdpPerfSetPanicLutsFtraceEvent;
+using protos::MdpPerfSetQosLutsFtraceEvent;
+using protos::MdpPerfSetWmLevelsFtraceEvent;
+using protos::MdpPerfUpdateBusFtraceEvent;
+using protos::MdpSsppChangeFtraceEvent;
+using protos::MdpSsppSetFtraceEvent;
+using protos::MdpTraceCounterFtraceEvent;
+using protos::MdpVideoUnderrunDoneFtraceEvent;
+using protos::RotatorBwAoAsContextFtraceEvent;
+using protos::TracingMarkWriteFtraceEvent;
+using protos::ClockDisableFtraceEvent;
+using protos::ClockEnableFtraceEvent;
+using protos::ClockSetRateFtraceEvent;
+using protos::CpuFrequencyFtraceEvent;
+using protos::CpuFrequencyLimitsFtraceEvent;
+using protos::CpuIdleFtraceEvent;
+using protos::SuspendResumeFtraceEvent;
+using protos::RegulatorDisableFtraceEvent;
+using protos::RegulatorDisableCompleteFtraceEvent;
+using protos::RegulatorEnableFtraceEvent;
+using protos::RegulatorEnableCompleteFtraceEvent;
+using protos::RegulatorEnableDelayFtraceEvent;
+using protos::RegulatorSetVoltageFtraceEvent;
+using protos::RegulatorSetVoltageCompleteFtraceEvent;
+using protos::SchedBlockedReasonFtraceEvent;
+using protos::SchedCpuHotplugFtraceEvent;
+using protos::SchedProcessExecFtraceEvent;
+using protos::SchedProcessExitFtraceEvent;
+using protos::SchedProcessForkFtraceEvent;
+using protos::SchedProcessFreeFtraceEvent;
+using protos::SchedProcessHangFtraceEvent;
+using protos::SchedProcessWaitFtraceEvent;
+using protos::SchedSwitchFtraceEvent;
+using protos::SchedWakeupFtraceEvent;
+using protos::SchedWakeupNewFtraceEvent;
+using protos::SchedWakingFtraceEvent;
+using protos::SyncPtFtraceEvent;
+using protos::SyncTimelineFtraceEvent;
+using protos::SyncWaitFtraceEvent;
+using protos::MmVmscanDirectReclaimBeginFtraceEvent;
+using protos::MmVmscanDirectReclaimEndFtraceEvent;
+using protos::MmVmscanKswapdSleepFtraceEvent;
+using protos::MmVmscanKswapdWakeFtraceEvent;
+using protos::WorkqueueActivateWorkFtraceEvent;
+using protos::WorkqueueExecuteEndFtraceEvent;
+using protos::WorkqueueExecuteStartFtraceEvent;
+using protos::WorkqueueQueueWorkFtraceEvent;
+using protos::TaskNewtaskFtraceEvent;
+using protos::TaskRenameFtraceEvent;
+
+const char* GetSchedSwitchFlag(int32_t state) {
+ state &= 511;
+ if (state & 1)
+ return "S";
+ if (state & 2)
+ return "D";
+ if (state & 4)
+ return "T";
+ if (state & 8)
+ return "t";
+ if (state & 16)
+ return "Z";
+ if (state & 32)
+ return "X";
+ if (state & 64)
+ return "x";
+ if (state & 128)
+ return "W";
+ return "R";
+}
+
+const char* GetExt4HintFlag(int32_t state) {
+ if (state & 0x0001)
+ return "HINT_MERGE";
+ if (state & 0x0002)
+ return "HINT_RESV";
+ if (state & 0x0004)
+ return "HINT_MDATA";
+ if (state & 0x0008)
+ return "HINT_FIRST";
+ if (state & 0x0010)
+ return "HINT_BEST";
+ if (state & 0x0020)
+ return "HINT_DATA";
+ if (state & 0x0040)
+ return "HINT_NOPREALLOC";
+ if (state & 0x0080)
+ return "HINT_GRP_ALLOCE";
+ if (state & 0x0100)
+ return "HINT_GOAL_ONLY";
+ if (state & 0x0200)
+ return "HINT_DATA";
+ if (state & 0x0400)
+ return "HINT_NOPREALLOC";
+ if (state & 0x0800)
+ return "HINT_GRP_ALLOCE";
+ if (state & 0x2000)
+ return "HINT_GOAL_ONLY";
+ return "";
+}
+
+const char* GetExt4FreeBlocksFlag(int32_t state) {
+ if (state & 0x0001)
+ return "METADATA";
+ if (state & 0x0002)
+ return "FORGET";
+ if (state & 0x0004)
+ return "VALIDATED";
+ if (state & 0x0008)
+ return "NO_QUOTA";
+ if (state & 0x0010)
+ return "1ST_CLUSTER";
+ if (state & 0x0020)
+ return "LAST_CLUSTER";
+ return "";
+}
+
+const char* GetExt4ModeFlag(int32_t state) {
+ if (state & 0x01)
+ return "KEEP_SIZE";
+ if (state & 0x02)
+ return "PUNCH_HOLE";
+ if (state & 0x04)
+ return "NO_HIDE_STALE";
+ if (state & 0x08)
+ return "COLLAPSE_RANGE";
+ if (state & 0x10)
+ return "ZERO_RANGE";
+ return "";
+}
+
+const char* GetExt4ExtFlag(int32_t state) {
+ if (state & 0x0001)
+ return "CREATE";
+ if (state & 0x0002)
+ return "UNWRIT";
+ if (state & 0x0004)
+ return "DEALLOC";
+ if (state & 0x0008)
+ return "PRE_IO";
+ if (state & 0x0010)
+ return "CONVERT";
+ if (state & 0x0020)
+ return "METADATA_NOFAIL";
+ if (state & 0x0040)
+ return "NO_NORMALIZE";
+ if (state & 0x0080)
+ return "KEEP_SIZE";
+ if (state & 0x0100)
+ return "NO_LOCK";
+ return "";
+}
+
+constexpr const char* MmCompactionRetArray[] = {
+ "deferred", "skipped", "continue", "partial",
+ "complete", "no_suitable_page", "not_suitable_zone", "contended"};
+
+constexpr const char* MmCompactionSuitableArray[] = {"DMA", "Normal",
+ "Movable"};
+
+constexpr const char* SoftirqArray[] = {
+ "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK",
+ "BLOCK_IOPOLL", "TASKLET", "SCHED", "HRTIMER", "RCU"};
+
+std::string FormatSchedSwitch(const SchedSwitchFtraceEvent& sched_switch) {
+ char line[2048];
+ sprintf(line,
+ "sched_switch: prev_comm=%s "
+ "prev_pid=%d prev_prio=%d prev_state=%s ==> next_comm=%s next_pid=%d "
+ "next_prio=%d\\n",
+ sched_switch.prev_comm().c_str(), sched_switch.prev_pid(),
+ sched_switch.prev_prio(),
+ GetSchedSwitchFlag(sched_switch.prev_state()),
+ sched_switch.next_comm().c_str(), sched_switch.next_pid(),
+ sched_switch.next_prio());
+ return std::string(line);
+}
+
+std::string FormatSchedWakeup(const SchedWakeupFtraceEvent& sched_wakeup) {
+ char line[2048];
+ sprintf(line,
+ "sched_wakeup: comm=%s "
+ "pid=%d prio=%d success=%d target_cpu=%03d\\n",
+ sched_wakeup.comm().c_str(), sched_wakeup.pid(), sched_wakeup.prio(),
+ sched_wakeup.success(), sched_wakeup.target_cpu());
+ return std::string(line);
+}
+
+std::string FormatSchedBlockedReason(
+ const SchedBlockedReasonFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sched_blocked_reason: pid=%d iowait=%d caller=%llxS\\n",
+ event.pid(), event.io_wait(), event.caller());
+ return std::string(line);
+}
+
+std::string FormatPrint(const PrintFtraceEvent& print) {
+ char line[2048];
+ std::string msg = print.buf();
+ // Remove any newlines in the message. It's not entirely clear what the right
+ // behaviour is here. Maybe we should escape them instead?
+ msg.erase(std::remove(msg.begin(), msg.end(), '\n'), msg.end());
+ sprintf(line, "tracing_mark_write: %s\\n", msg.c_str());
+ return std::string(line);
+}
+
+std::string FormatCpuFrequency(const CpuFrequencyFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "cpu_frequency: state=%" PRIu32 " cpu_id=%" PRIu32 "\\n",
+ event.state(), event.cpu_id());
+ return std::string(line);
+}
+
+std::string FormatCpuFrequencyLimits(
+ const CpuFrequencyLimitsFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "cpu_frequency_limits: min_freq=%" PRIu32 "max_freq=%" PRIu32
+ " cpu_id=%" PRIu32 "\\n",
+ event.min_freq(), event.max_freq(), event.cpu_id());
+ return std::string(line);
+}
+
+std::string FormatCpuIdle(const CpuIdleFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "cpu_idle: state=%" PRIu32 " cpu_id=%" PRIu32 "\\n",
+ event.state(), event.cpu_id());
+ return std::string(line);
+}
+
+std::string FormatClockSetRate(const ClockSetRateFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "clock_set_rate: %s state=%llu cpu_id=%llu\\n",
+ event.name().empty() ? "todo" : event.name().c_str(), event.state(),
+ event.cpu_id());
+ return std::string(line);
+}
+
+std::string FormatClockEnable(const ClockEnableFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "clock_enable: %s state=%llu cpu_id=%llu\\n",
+ event.name().empty() ? "todo" : event.name().c_str(), event.state(),
+ event.cpu_id());
+ return std::string(line);
+}
+
+std::string FormatClockDisable(const ClockDisableFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "clock_disable: %s state=%llu cpu_id=%llu\\n",
+ event.name().empty() ? "todo" : event.name().c_str(), event.state(),
+ event.cpu_id());
+ return std::string(line);
+}
+
+std::string FormatTracingMarkWrite(const TracingMarkWriteFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "tracing_mark_write: %s|%d|%s\\n",
+ event.trace_begin() ? "B" : "E", event.pid(),
+ event.trace_name().c_str());
+ return std::string(line);
+}
+
+std::string FormatBinderLocked(const BinderLockedFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "binder_locked: tag=%s\\n", event.tag().c_str());
+ return std::string(line);
+}
+
+std::string FormatBinderUnlock(const BinderUnlockFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "binder_unlock: tag=%s\\n", event.tag().c_str());
+ return std::string(line);
+}
+
+std::string FormatBinderLock(const BinderLockFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "binder_lock: tag=%s\\n", event.tag().c_str());
+ return std::string(line);
+}
+
+std::string FormatBinderTransaction(const BinderTransactionFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "binder_transaction: transaction=%d dest_node=%d dest_proc=%d "
+ "dest_thread=%d reply=%d flags=0x%x code=0x%x\\n",
+ event.debug_id(), event.target_node(), event.to_proc(),
+ event.to_thread(), event.reply(), event.flags(), event.code());
+ return std::string(line);
+}
+
+std::string FormatBinderTransactionReceived(
+ const BinderTransactionReceivedFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "binder_transaction_received: transaction=%d\\n",
+ event.debug_id());
+ return std::string(line);
+}
+
+std::string FormatExt4SyncFileEnter(const Ext4SyncFileEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_sync_file_enter: dev %d,%d ino %lu parent %lu datasync %d \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long)event.parent(), event.datasync());
+ return std::string(line);
+}
+
+std::string FormatExt4SyncFileExit(const Ext4SyncFileExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_sync_file_exit: dev %d,%d ino %lu ret %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.ret());
+ return std::string(line);
+}
+
+std::string FormatExt4DaWriteBegin(const Ext4DaWriteBeginFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_da_write_begin: dev %d,%d ino %lu pos %lld len %u flags %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.pos(), event.len(), event.flags());
+ return std::string(line);
+}
+
+std::string FormatExt4DaWriteEnd(const Ext4DaWriteEndFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_da_write_end: dev %d,%d ino %lu pos %lld len %u copied %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.pos(), event.len(), event.copied());
+ return std::string(line);
+}
+
+std::string FormatBlockRqIssue(const BlockRqIssueFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_rq_issue: %d,%d %s %u (%s) %llu + %u [%s]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ event.bytes(), event.cmd().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatI2cRead(const I2cReadFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "i2c_read: i2c-%d #%u a=%03x f=%04x l=%u\\n",
+ event.adapter_nr(), event.msg_nr(), event.addr(), event.flags(),
+ event.len());
+ return std::string(line);
+}
+
+std::string FormatI2cResult(const I2cResultFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "i2c_result: i2c-%d n=%u ret=%d\\n", event.adapter_nr(),
+ event.nr_msgs(), event.ret());
+ return std::string(line);
+}
+
+std::string FormatIrqHandlerEntry(const IrqHandlerEntryFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "irq_handler_entry: irq=%d name=%s\\n", event.irq(),
+ event.name().c_str());
+ return std::string(line);
+}
+
+std::string FormatIrqHandlerExit(const IrqHandlerExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "irq_handler_exit: irq=%d ret=%s\\n", event.irq(),
+ event.ret() ? "handled" : "unhandled");
+ return std::string(line);
+}
+
+std::string FormatMmVmscanKswapdWake(
+ const MmVmscanKswapdWakeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "mm_vmscan_kswapd_wake: nid=%d order=%d\\n", event.nid(),
+ event.order());
+ return std::string(line);
+}
+
+std::string FormatMmVmscanKswapdSleep(
+ const MmVmscanKswapdSleepFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "mm_vmscan_kswapd_sleep: nid=%d\\n", event.nid());
+ return std::string(line);
+}
+
+std::string FormatRegulatorEnable(const RegulatorEnableFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "regulator_enable: name=%s\\n", event.name().c_str());
+ return std::string(line);
+}
+
+std::string FormatRegulatorEnableDelay(
+ const RegulatorEnableDelayFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "regulator_enable_delay: name=%s\\n", event.name().c_str());
+ return std::string(line);
+}
+
+std::string FormatRegulatorEnableComplete(
+ const RegulatorEnableCompleteFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "regulator_enable_complete: name=%s\\n", event.name().c_str());
+ return std::string(line);
+}
+
+std::string FormatRegulatorDisable(const RegulatorDisableFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "regulator_disable: name=%s\\n", event.name().c_str());
+ return std::string(line);
+}
+
+std::string FormatRegulatorDisableComplete(
+ const RegulatorDisableCompleteFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "regulator_disable_complete: name=%s\\n", event.name().c_str());
+ return std::string(line);
+}
+
+std::string FormatRegulatorSetVoltage(
+ const RegulatorSetVoltageFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "regulator_set_voltage: name=%s (%d-%d)\\n",
+ event.name().c_str(), event.min(), event.max());
+ return std::string(line);
+}
+
+std::string FormatRegulatorSetVoltageComplete(
+ const RegulatorSetVoltageCompleteFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "regulator_set_voltage_complete: name=%s, val=%u\\n",
+ event.name().c_str(), event.val());
+ return std::string(line);
+}
+
+std::string FormatSchedCpuHotplug(const SchedCpuHotplugFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sched_cpu_hotplug: cpu %d %s error=%d\\n",
+ event.affected_cpu(), event.status() ? "online" : "offline",
+ event.error());
+ return std::string(line);
+}
+
+std::string FormatSyncTimeline(const SyncTimelineFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sync_timeline: name=%s value=%s\\n", event.name().c_str(),
+ event.value().c_str());
+ return std::string(line);
+}
+
+std::string FormatSyncWait(const SyncWaitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sync_wait: %s name=%s state=%d\\n",
+ event.begin() ? "begin" : "end", event.name().c_str(),
+ event.status());
+ return std::string(line);
+}
+
+std::string FormatSyncPt(const SyncPtFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sync_pt: name=%s value=%s\\n", event.timeline().c_str(),
+ event.value().c_str());
+ return std::string(line);
+}
+
+std::string FormatSoftirqRaise(const SoftirqRaiseFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "softirq_raise: vec=%u [action=%s]\\n", event.vec(),
+ SoftirqArray[event.vec()]);
+ return std::string(line);
+}
+
+std::string FormatSoftirqEntry(const SoftirqEntryFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "softirq_entry: vec=%u [action=%s]\\n", event.vec(),
+ SoftirqArray[event.vec()]);
+ return std::string(line);
+}
+
+std::string FormatSoftirqExit(const SoftirqExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "softirq_exit: vec=%u [action=%s]\\n", event.vec(),
+ SoftirqArray[event.vec()]);
+ return std::string(line);
+}
+
+std::string FormatI2cWrite(const I2cWriteFtraceEvent& event) {
+ char line[2048];
+ // TODO(hjd): Check event.buf().
+ sprintf(line, "i2c_write: i2c-%d #%u a=%03x f=%04x l=%u\\n",
+ event.adapter_nr(), event.msg_nr(), event.addr(), event.flags(),
+ event.len());
+ return std::string(line);
+}
+
+std::string FormatI2cReply(const I2cReplyFtraceEvent& event) {
+ char line[2048];
+ // TODO(hjd): Check event.buf().
+ sprintf(line, "i2c_reply: i2c-%d #%u a=%03x f=%04x l=%u\\n",
+ event.adapter_nr(), event.msg_nr(), event.addr(), event.flags(),
+ event.len());
+ return std::string(line);
+}
+
+// TODO(hjd): Check gfp_flags
+std::string FormatMmVmscanDirectReclaimBegin(
+ const MmVmscanDirectReclaimBeginFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "mm_vmscan_direct_reclaim_begin: order=%d may_writepage=%d\\n",
+ event.order(), event.may_writepage());
+ return std::string(line);
+}
+
+std::string FormatMmVmscanDirectReclaimEnd(
+ const MmVmscanDirectReclaimEndFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "mm_vmscan_direct_reclaim_end: nr_reclaimed=%llu\\n",
+ event.nr_reclaimed());
+ return std::string(line);
+}
+
+std::string FormatLowmemoryKill(const LowmemoryKillFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "lowmemory_kill: %s (%d), page cache %lldkB (limit %lldkB), free "
+ "%lldKb\\n",
+ event.comm().c_str(), event.pid(), event.pagecache_size(),
+ event.pagecache_limit(), event.free());
+ return std::string(line);
+}
+
+std::string FormatWorkqueueExecuteStart(
+ const WorkqueueExecuteStartFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "workqueue_execute_start: work struct %llx: function %llxf\\n",
+ event.work(), event.function());
+ return std::string(line);
+}
+
+std::string FormatWorkqueueExecuteEnd(
+ const WorkqueueExecuteEndFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "workqueue_execute_end: work struct %llx\\n", event.work());
+ return std::string(line);
+}
+
+std::string FormatWorkqueueQueueWork(
+ const WorkqueueQueueWorkFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "workqueue_queue_work: work struct=%llx function=%llxf workqueue=%llx "
+ "req_cpu=%u cpu=%u\\n",
+ event.work(), event.function(), event.workqueue(), event.req_cpu(),
+ event.cpu());
+ return std::string(line);
+}
+
+std::string FormatWorkqueueActivateWork(
+ const WorkqueueActivateWorkFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "workqueue_activate_work: work struct %llx\\n", event.work());
+ return std::string(line);
+}
+
+std::string FormatMmCompactionBegin(const MmCompactionBeginFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_begin: zone_start=0x%llx migrate_pfn=0x%llx "
+ "free_pfn=0x%llx zone_end=0x%llx, mode=%s\\n",
+ event.zone_start(), event.migrate_pfn(), event.free_pfn(),
+ event.zone_end(), event.sync() ? "sync" : "async");
+ return std::string(line);
+}
+
+std::string FormatMmCompactionDeferCompaction(
+ const MmCompactionDeferCompactionFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_defer_compaction: node=%d zone=%-8s order=%d "
+ "order_failed=%d consider=%u limit=%lu\\n",
+ event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
+ event.order_failed(), event.considered(), 1UL << event.defer_shift());
+ return std::string(line);
+}
+
+std::string FormatMmCompactionDeferred(
+ const MmCompactionDeferredFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_deferred: node=%d zone=%-8s order=%d order_failed=%d "
+ "consider=%u limit=%lu\\n",
+ event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
+ event.order_failed(), event.considered(), 1UL << event.defer_shift());
+ return std::string(line);
+}
+
+std::string FormatMmCompactionDeferReset(
+ const MmCompactionDeferResetFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_defer_reset: node=%d zone=%-8s order=%d "
+ "order_failed=%d consider=%u limit=%lu\\n",
+ event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
+ event.order_failed(), event.considered(), 1UL << event.defer_shift());
+ return std::string(line);
+}
+
+std::string FormatMmCompactionEnd(const MmCompactionEndFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_end: zone_start=0x%llx migrate_pfn=0x%llx "
+ "free_pfn=0x%llx zone_end=0x%llx, mode=%s status=%s\\n",
+ event.zone_start(), event.migrate_pfn(), event.free_pfn(),
+ event.zone_end(), event.sync() ? "sync" : "aysnc",
+ MmCompactionRetArray[event.status()]);
+ return std::string(line);
+}
+
+std::string FormatMmCompactionFinished(
+ const MmCompactionFinishedFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "mm_compaction_finished: node=%d zone=%-8s order=%d ret=%s\\n",
+ event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
+ MmCompactionRetArray[event.ret()]);
+ return std::string(line);
+}
+
+std::string FormatMmCompactionIsolateFreepages(
+ const MmCompactionIsolateFreepagesFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_isolate_freepages: range=(0x%llx ~ 0x%llx) "
+ "nr_scanned=%llu nr_taken=%llu\\n",
+ event.start_pfn(), event.end_pfn(), event.nr_scanned(),
+ event.nr_taken());
+ return std::string(line);
+}
+
+std::string FormatMmCompactionIsolateMigratepages(
+ const MmCompactionIsolateMigratepagesFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_isolate_migratepages: range=(0x%llx ~ 0x%llx) "
+ "nr_scanned=%llu nr_taken=%llu\\n",
+ event.start_pfn(), event.end_pfn(), event.nr_scanned(),
+ event.nr_taken());
+ return std::string(line);
+}
+
+std::string FormatMmCompactionKcompactdSleep(
+ const MmCompactionKcompactdSleepFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "mm_compaction_kcompactd_sleep: nid=%d\\n", event.nid());
+ return std::string(line);
+}
+
+std::string FormatMmCompactionKcompactdWake(
+ const MmCompactionKcompactdWakeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_kcompactd_wake: nid=%d order=%d classzone_idx=%-8s\\n",
+ event.nid(), event.order(),
+ MmCompactionSuitableArray[event.classzone_idx()]);
+ return std::string(line);
+}
+
+std::string FormatMmCompactionMigratepages(
+ const MmCompactionMigratepagesFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "mm_compaction_migratepages: nr_migrated=%llu nr_failed=%llu\\n",
+ event.nr_migrated(), event.nr_failed());
+ return std::string(line);
+}
+
+std::string FormatMmCompactionSuitable(
+ const MmCompactionSuitableFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "mm_compaction_suitable: node=%d zone=%-8s order=%d ret=%s\\n",
+ event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
+ MmCompactionRetArray[event.ret()]);
+ return std::string(line);
+}
+
+std::string FormatMmCompactionTryToCompactPages(
+ const MmCompactionTryToCompactPagesFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "mm_compaction_try_to_compact_pages: order=%d gfp_mask=0x%x mode=%d\\n",
+ event.order(), event.gfp_mask(),
+ event.mode()); // convert to int?
+ return std::string(line);
+}
+
+std::string FormatMmCompactionWakeupKcompactd(
+ const MmCompactionWakeupKcompactdFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "mm_compaction_wakeup_kcompactd: nid=%d order=%d classzone_idx=%-8s\\n",
+ event.nid(), event.order(),
+ MmCompactionSuitableArray[event.classzone_idx()]);
+ return std::string(line);
+}
+
+std::string FormatSuspendResume(const SuspendResumeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "suspend_resume: %s[%u] %s\\n", event.action().c_str(),
+ event.val(), event.start() ? "begin" : "end");
+ return std::string(line);
+}
+
+std::string FormatSchedWakeupNew(const SchedWakeupNewFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sched_wakeup_new: comm=%s pid=%d prio=%d target_cpu=%03d\\n",
+ event.comm().c_str(), event.pid(), event.prio(), event.target_cpu());
+ return std::string(line);
+}
+
+std::string FormatSchedProcessExec(const SchedProcessExecFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sched_process_exec: filename=%s pid=%d old_pid=%d\\n",
+ event.filename().c_str(), event.pid(), event.old_pid());
+ return std::string(line);
+}
+std::string FormatSchedProcessExit(const SchedProcessExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sched_process_exit: comm=%s pid=%d tgid=%d prio=%d\\n",
+ event.comm().c_str(), event.pid(), event.tgid(), event.prio());
+ return std::string(line);
+}
+std::string FormatSchedProcessFork(const SchedProcessForkFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "sched_process_fork: parent_comm=%s parent_pid=%d child_comm=%s "
+ "child_pid=%d\\n",
+ event.parent_comm().c_str(), event.parent_pid(),
+ event.child_comm().c_str(), event.child_pid());
+ return std::string(line);
+}
+std::string FormatSchedProcessFree(const SchedProcessFreeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sched_process_free: comm=%s pid=%d prio=%d\\n",
+ event.comm().c_str(), event.pid(), event.prio());
+ return std::string(line);
+}
+std::string FormatSchedProcessHang(const SchedProcessHangFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sched_process_hang: comm=%s pid=%d\\n", event.comm().c_str(),
+ event.pid());
+ return std::string(line);
+}
+
+std::string FormatSchedProcessWait(const SchedProcessWaitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "sched_process_wait: comm=%s pid=%d\\n", event.comm().c_str(),
+ event.pid());
+ return std::string(line);
+}
+
+std::string FormatTaskNewtask(const TaskNewtaskFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "task_newtask: comm=%s pid=%d clone_flags=%llu oom_score_adj=%d\\n",
+ event.comm().c_str(), event.pid(), event.clone_flags(),
+ event.oom_score_adj());
+ return std::string(line);
+}
+
+std::string FormatTaskRename(const TaskRenameFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "task_rename: pid=%d oldcomm=%s newcomm=%s oom_score_adj=%d\\n",
+ event.pid(), event.newcomm().c_str(), event.oldcomm().c_str(),
+ event.oom_score_adj());
+ return std::string(line);
+}
+
+std::string FormatBlockBioBackmerge(const BlockBioBackmergeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_bio_backmerge: %d,%d %s %llu + %u [%s]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockBioBounce(const BlockBioBounceFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "block_bio_bounce:"
+ "%d,%d %s %llu + %u [%s]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockBioComplete(const BlockBioCompleteFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_bio_complete: %d,%d %s %llu + %u [%d]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(), event.error());
+ return std::string(line);
+}
+
+std::string FormatBlockBioFrontmerge(
+ const BlockBioFrontmergeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_bio_frontmerge: %d,%d %s %llu + %u [%s]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockBioQueue(const BlockBioQueueFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_bio_queue: %d,%d %s %llu + %u [%s]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockBioRemap(const BlockBioRemapFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_bio_remap: %d,%d %s %llu + %u <- (%d,%d) %llu\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ major(event.dev()), minor(event.dev()),
+ (unsigned long long)event.old_sector());
+ return std::string(line);
+}
+
+std::string FormatBlockDirtyBuffer(const BlockDirtyBufferFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_dirty_buffer: %d,%d sector=%llu size=%zu\\n",
+ major(event.dev()), minor(event.dev()),
+ (unsigned long long)event.sector(), (unsigned long)event.size());
+ return std::string(line);
+}
+
+std::string FormatBlockGetrq(const BlockGetrqFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_getrq: %d,%d %s %llu + %u [%s]\\n", major(event.dev()),
+ minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockPlug(const BlockPlugFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_plug: comm=[%s]\\n", event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockRqAbort(const BlockRqAbortFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_rq_abort: %d,%d %s (%s) %llu + %u [%d]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ event.cmd().c_str(), (unsigned long long)event.sector(),
+ event.nr_sector(), event.errors());
+ return std::string(line);
+}
+
+std::string FormatBlockRqComplete(const BlockRqCompleteFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_rq_complete: %d,%d %s (%s) %llu + %u [%d]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ event.cmd().c_str(), (unsigned long long)event.sector(),
+ event.nr_sector(), event.errors());
+ return std::string(line);
+}
+
+std::string FormatBlockRqInsert(const BlockRqInsertFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_rq_insert: %d,%d %s %u (%s) %llu + %u [%s]\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ event.bytes(), event.cmd().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockRqRemap(const BlockRqRemapFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_rq_remap: %d,%d %s %llu + %u <- (%d,%d) %llu %u\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ major(event.dev()), minor(event.dev()),
+ (unsigned long long)event.old_sector(), event.nr_bios());
+ return std::string(line);
+}
+
+std::string FormatBlockRqRequeue(const BlockRqRequeueFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_rq_requeue: %d,%d %s (%s) %llu + %u [%d\\n",
+ major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
+ event.cmd().c_str(), (unsigned long long)event.sector(),
+ event.nr_sector(), event.errors());
+ return std::string(line);
+}
+
+std::string FormatBlockSleeprq(const BlockSleeprqFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_sleeprq: %d,%d %s %llu + %u [%s]\\n", major(event.dev()),
+ minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(), event.nr_sector(),
+ event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockSplit(const BlockSplitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_split: %d,%d %s %llu / %llu [%s]\\n", major(event.dev()),
+ minor(event.dev()), event.rwbs().c_str(),
+ (unsigned long long)event.sector(),
+ (unsigned long long)event.new_sector(), event.comm().c_str());
+ return std::string(line);
+}
+
+std::string FormatBlockTouchBuffer(const BlockTouchBufferFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_touch_buffer: %d,%d sector=%llu size=%zu\\n",
+ major(event.dev()), minor(event.dev()),
+ (unsigned long long)event.sector(), (unsigned long)event.size());
+ return std::string(line);
+}
+
+std::string FormatBlockUnplug(const BlockUnplugFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "block_unplug: [%s] %d\\n", event.comm().c_str(),
+ event.nr_rq());
+ return std::string(line);
+}
+
+std::string FormatExt4AllocDaBlocks(const Ext4AllocDaBlocksFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_alloc_da_blocks: dev %d,%d ino %lu data_blocks %u meta_blocks "
+ "%u \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.data_blocks(), event.meta_blocks());
+ return std::string(line);
+}
+
+std::string FormatExt4AllocateBlocks(
+ const Ext4AllocateBlocksFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_allocate_blocks: dev %d,%d ino %lu flags %s len %u block %llu "
+ "lblk %u goal %llu lleft %u lright %u pleft %llu pright %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ GetExt4HintFlag(event.flags()), event.len(), event.block(),
+ event.logical(), event.goal(), event.lleft(), event.lright(),
+ event.pleft(), event.pright());
+ return std::string(line);
+}
+
+std::string FormatExt4AllocateInode(const Ext4AllocateInodeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_allocate_inode: dev %d,%d ino %lu dir %lu mode 0%o\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long)event.dir(), event.mode());
+ return std::string(line);
+}
+
+std::string FormatExt4BeginOrderedTruncate(
+ const Ext4BeginOrderedTruncateFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_begin_ordered_truncate: dev %d,%d ino %lu new_size %lld\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.new_size());
+ return std::string(line);
+}
+
+std::string FormatExt4CollapseRange(const Ext4CollapseRangeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_collapse_range: dev %d,%d ino %lu offset %lld len %lld\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.offset(), event.len());
+ return std::string(line);
+}
+
+std::string FormatExt4DaReleaseSpace(
+ const Ext4DaReleaseSpaceFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_da_release_space: dev %d,%d ino %lu mode 0%o i_blocks %llu "
+ "freed_blocks %d reserved_data_blocks %d reserved_meta_blocks %d "
+ "allocated_meta_blocks %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.mode(), event.i_blocks(), event.freed_blocks(),
+ event.reserved_data_blocks(), event.reserved_meta_blocks(),
+ event.allocated_meta_blocks());
+ return std::string(line);
+}
+
+std::string FormatExt4DaReserveSpace(
+ const Ext4DaReserveSpaceFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_da_reserve_space:dev %d,%d ino %lu mode 0%o i_blocks %llu "
+ "reserved_data_blocks %d reserved_meta_blocks %d \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.mode(), event.i_blocks(), event.reserved_data_blocks(),
+ event.reserved_meta_blocks());
+ return std::string(line);
+}
+
+std::string FormatExt4DaUpdateReserveSpace(
+ const Ext4DaUpdateReserveSpaceFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_da_update_reserve_space: dev %d,%d ino %lu mode 0%o i_blocks "
+ "%llu used_blocks %d reserved_data_blocks %d reserved_meta_blocks %d "
+ "allocated_meta_blocks %d quota_claim %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.mode(), event.i_blocks(), event.used_blocks(),
+ event.reserved_data_blocks(), event.reserved_meta_blocks(),
+ event.allocated_meta_blocks(), event.quota_claim());
+ return std::string(line);
+}
+
+std::string FormatExt4DaWritePages(const Ext4DaWritePagesFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_da_write_pages: dev %d,%d ino %lu first_page %lu nr_to_write "
+ "%ld sync_mode %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long)event.first_page(), (long)event.nr_to_write(),
+ event.sync_mode());
+ return std::string(line);
+}
+
+// TODO(hjd): Check flags
+std::string FormatExt4DaWritePagesExtent(
+ const Ext4DaWritePagesExtentFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_da_write_pages_extent: dev %d,%d ino %lu lblk %llu len %u \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.len());
+ return std::string(line);
+}
+
+std::string FormatExt4DiscardBlocks(const Ext4DiscardBlocksFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_discard_blocks: dev %d,%d blk %llu count %llu\\n",
+ major(event.dev()), minor(event.dev()), event.blk(), event.count());
+ return std::string(line);
+}
+
+std::string FormatExt4DiscardPreallocations(
+ const Ext4DiscardPreallocationsFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_discard_preallocations: dev %d,%d ino %lu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino());
+ return std::string(line);
+}
+
+std::string FormatExt4DropInode(const Ext4DropInodeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_drop_inode: dev %d,%d ino %lu drop %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.drop());
+ return std::string(line);
+}
+
+// TODO(hjd): Check Es status flags
+std::string FormatExt4EsCacheExtent(const Ext4EsCacheExtentFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_es_cache_extent: dev %d,%d ino %lu es [%u/%u) mapped %llu \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.len(), event.pblk());
+ return std::string(line);
+}
+
+std::string FormatExt4EsFindDelayedExtentRangeEnter(
+ const Ext4EsFindDelayedExtentRangeEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_es_find_delayed_extent_range_enter: dev %d,%d ino %lu lblk %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk());
+ return std::string(line);
+}
+
+// TODO(hjd): Check Es status flags
+std::string FormatExt4EsFindDelayedExtentRangeExit(
+ const Ext4EsFindDelayedExtentRangeExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_es_find_delayed_extent_range_exit: dev %d,%d ino %lu es "
+ "[%u/%u) mapped %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.len(), event.pblk());
+ return std::string(line);
+}
+
+// TODO(hjd): Check Es status flags
+std::string FormatExt4EsInsertExtent(
+ const Ext4EsInsertExtentFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_es_insert_extent: dev %d,%d ino %lu es [%u/%u) mapped %llu \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.len(), event.pblk());
+ return std::string(line);
+}
+
+std::string FormatExt4EsLookupExtentEnter(
+ const Ext4EsLookupExtentEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_es_lookup_extent_enter: dev %d,%d ino %lu lblk %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk());
+ return std::string(line);
+}
+
+// TODO(hjd): Check Es status flags
+std::string FormatExt4EsLookupExtentExit(
+ const Ext4EsLookupExtentExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_es_lookup_extent_exit: dev %d,%d ino %lu found %d [%u/%u) %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.found(), event.lblk(), event.len(),
+ event.found() ? event.pblk() : 0);
+ return std::string(line);
+}
+
+std::string FormatExt4EsRemoveExtent(
+ const Ext4EsRemoveExtentFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_es_remove_extent: dev %d,%d ino %lu es [%lld/%lld)\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.len());
+ return std::string(line);
+}
+
+std::string FormatExt4EsShrink(const Ext4EsShrinkFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_es_shrink: dev %d,%d nr_shrunk %d, scan_time %llu nr_skipped "
+ "%d retried %d\\n",
+ major(event.dev()), minor(event.dev()), event.nr_shrunk(),
+ event.scan_time(), event.nr_skipped(), event.retried());
+ return std::string(line);
+}
+
+std::string FormatExt4EsShrinkCount(const Ext4EsShrinkCountFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_es_shrink_count: dev %d,%d nr_to_scan %d cache_cnt %d\\n",
+ major(event.dev()), minor(event.dev()), event.nr_to_scan(),
+ event.cache_cnt());
+ return std::string(line);
+}
+
+std::string FormatExt4EsShrinkScanEnter(
+ const Ext4EsShrinkScanEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_es_shrink_scan_enter: dev %d,%d nr_to_scan %d cache_cnt %d\\n",
+ major(event.dev()), minor(event.dev()), event.nr_to_scan(),
+ event.cache_cnt());
+ return std::string(line);
+}
+
+std::string FormatExt4EsShrinkScanExit(
+ const Ext4EsShrinkScanExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_es_shrink_scan_exit: dev %d,%d nr_shrunk %d cache_cnt %d\\n",
+ major(event.dev()), minor(event.dev()), event.nr_shrunk(),
+ event.cache_cnt());
+ return std::string(line);
+}
+
+std::string FormatExt4EvictInode(const Ext4EvictInodeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_evict_inode: dev %d,%d ino %lu nlink %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.nlink());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtConvertToInitializedEnter(
+ const Ext4ExtConvertToInitializedEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_ext_convert_to_initialized_enter: dev %d,%d ino %lu m_lblk %u "
+ "m_len %u u_lblk %u u_len %u u_pblk %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.m_lblk(), event.m_len(), event.u_lblk(), event.u_len(),
+ event.u_pblk());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtConvertToInitializedFastpath(
+ const Ext4ExtConvertToInitializedFastpathFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_ext_convert_to_initialized_fastpath: dev %d,%d ino %lu m_lblk "
+ "%u m_len %u u_lblk %u u_len %u u_pblk %llu i_lblk %u i_len %u "
+ "i_pblk %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.m_lblk(), event.m_len(), event.u_lblk(), event.u_len(),
+ event.u_pblk(), event.i_lblk(), event.i_len(), event.i_pblk());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtHandleUnwrittenExtents(
+ const Ext4ExtHandleUnwrittenExtentsFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_ext_handle_unwritten_extents: dev %d,%d ino %lu m_lblk %u "
+ "m_pblk %llu m_len %u flags %s allocated %d newblock %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.lblk(), (unsigned long long)event.pblk(), event.len(),
+ GetExt4ExtFlag(event.flags()), (unsigned int)event.allocated(),
+ (unsigned long long)event.newblk());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtInCache(const Ext4ExtInCacheFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_ext_in_cache: dev %d,%d ino %lu lblk %u ret %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.lblk(), event.ret());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtLoadExtent(const Ext4ExtLoadExtentFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_ext_load_extent: dev %d,%d ino %lu lblk %u pblk %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.pblk());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtMapBlocksEnter(
+ const Ext4ExtMapBlocksEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_ext_map_blocks_enter: dev %d,%d ino %lu lblk %u len %u flags %s\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.len(), GetExt4ExtFlag(event.flags()));
+ return std::string(line);
+}
+
+std::string FormatExt4ExtMapBlocksExit(
+ const Ext4ExtMapBlocksExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_ext_map_blocks_exit: dev %d,%d ino %lu lblk %u pblk %llu len "
+ "%u flags %x ret %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.pblk(), event.len(), event.flags(), event.ret());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtPutInCache(const Ext4ExtPutInCacheFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_ext_put_in_cache: dev %d,%d ino %lu lblk %u len %u start %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.lblk(), event.len(), (unsigned long long)event.start());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtRemoveSpace(
+ const Ext4ExtRemoveSpaceFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_ext_remove_space: dev %d,%d ino %lu since %u end %u depth %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.start(), (unsigned)event.end(), event.depth());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtRemoveSpaceDone(
+ const Ext4ExtRemoveSpaceDoneFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_ext_remove_space_done: dev %d,%d ino %lu since %u end %u depth "
+ "%d partial %lld remaining_entries %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.start(), (unsigned)event.end(), event.depth(),
+ (long long)event.partial(), (unsigned short)event.eh_entries());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtRmIdx(const Ext4ExtRmIdxFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_ext_rm_idx: dev %d,%d ino %lu index_pblk %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long long)event.pblk());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtRmLeaf(const Ext4ExtRmLeafFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_ext_rm_leaf: dev %d,%d ino %lu start_lblk %u last_extent "
+ "[%u(%llu), %u]partial_cluster %lld\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.start(), (unsigned)event.ee_lblk(),
+ (unsigned long long)event.ee_pblk(), (unsigned short)event.ee_len(),
+ (long long)event.partial());
+ return std::string(line);
+}
+
+std::string FormatExt4ExtShowExtent(const Ext4ExtShowExtentFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_ext_show_extent: dev %d,%d ino %lu lblk %u pblk %llu len %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.lblk(), (unsigned long long)event.pblk(),
+ (unsigned short)event.len());
+ return std::string(line);
+}
+
+std::string FormatExt4FallocateEnter(
+ const Ext4FallocateEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_fallocate_enter: dev %d,%d ino %lu offset %lld len %lld mode %s\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
+ return std::string(line);
+}
+
+std::string FormatExt4FallocateExit(const Ext4FallocateExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_fallocate_exit: dev %d,%d ino %lu pos %lld blocks %u ret %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.pos(), event.blocks(), event.ret());
+ return std::string(line);
+}
+
+std::string FormatExt4FindDelallocRange(
+ const Ext4FindDelallocRangeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_find_delalloc_range: dev %d,%d ino %lu from %u to %u reverse "
+ "%d found %d (blk = %u)\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.from(), (unsigned)event.to(), event.reverse(),
+ event.found(), (unsigned)event.found_blk());
+ return std::string(line);
+}
+
+std::string FormatExt4Forget(const Ext4ForgetFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_forget: dev %d,%d ino %lu mode 0%o is_metadata %d block %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.mode(), event.is_metadata(), event.block());
+ return std::string(line);
+}
+
+std::string FormatExt4FreeBlocks(const Ext4FreeBlocksFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_free_blocks: dev %d,%d ino %lu mode 0%o block %llu count %lu "
+ "flags %s\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.mode(), event.block(), (unsigned long)event.count(),
+ GetExt4FreeBlocksFlag(event.flags()));
+ return std::string(line);
+}
+
+std::string FormatExt4FreeInode(const Ext4FreeInodeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_free_inode: dev %d,%d ino %lu mode 0%o uid %u gid %u blocks "
+ "%llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.mode(), event.uid(), event.gid(), event.blocks());
+ return std::string(line);
+}
+
+std::string FormatExt4GetImpliedClusterAllocExit(
+ const Ext4GetImpliedClusterAllocExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_get_implied_cluster_alloc_exit: dev %d,%d m_lblk %u m_pblk "
+ "%llu m_len %u m_flags %u ret %d\\n",
+ major(event.dev()), minor(event.dev()), event.lblk(),
+ (unsigned long long)event.pblk(), event.len(), event.flags(),
+ event.ret());
+ return std::string(line);
+}
+
+std::string FormatExt4GetReservedClusterAlloc(
+ const Ext4GetReservedClusterAllocFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_get_reserved_cluster_alloc: dev %d,%d ino %lu lblk %u len %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.lblk(), event.len());
+ return std::string(line);
+}
+
+std::string FormatExt4IndMapBlocksEnter(
+ const Ext4IndMapBlocksEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_ind_map_blocks_enter: dev %d,%d ino %lu lblk %u len %u flags %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.len(), event.flags());
+ return std::string(line);
+}
+
+std::string FormatExt4IndMapBlocksExit(
+ const Ext4IndMapBlocksExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_ind_map_blocks_exit: dev %d,%d ino %lu lblk %u pblk %llu len "
+ "%u flags %x ret %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.lblk(), event.pblk(), event.len(), event.flags(), event.ret());
+ return std::string(line);
+}
+
+std::string FormatExt4InsertRange(const Ext4InsertRangeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_insert_range: dev %d,%d ino %lu offset %lld len %lld\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.offset(), event.len());
+ return std::string(line);
+}
+
+std::string FormatExt4Invalidatepage(
+ const Ext4InvalidatepageFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_invalidatepage: dev %d,%d ino %lu page_index %lu offset %u "
+ "length %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long)event.index(), event.offset(), event.length());
+ return std::string(line);
+}
+
+std::string FormatExt4JournalStart(const Ext4JournalStartFtraceEvent& event) {
+ char line[2048];
+ sprintf(
+ line,
+ "ext4_journal_start: dev %d,%d blocks, %d rsv_blocks, %d caller %pS\\n",
+ major(event.dev()), minor(event.dev()), event.blocks(),
+ event.rsv_blocks(), (void*)event.ip());
+ return std::string(line);
+}
+
+std::string FormatExt4JournalStartReserved(
+ const Ext4JournalStartReservedFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_journal_start_reserved: dev %d,%d blocks, %d caller %pS\\n",
+ major(event.dev()), minor(event.dev()), event.blocks(),
+ (void*)event.ip());
+ return std::string(line);
+}
+
+std::string FormatExt4JournalledInvalidatepage(
+ const Ext4JournalledInvalidatepageFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_journalled_invalidatepage: dev %d,%d ino %lu page_index %lu "
+ "offset %u length %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long)event.index(), event.offset(), event.length());
+ return std::string(line);
+}
+
+std::string FormatExt4JournalledWriteEnd(
+ const Ext4JournalledWriteEndFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_journalled_write_end: dev %d,%d ino %lu pos %lld len %u copied "
+ "%u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.pos(), event.len(), event.copied());
+ return std::string(line);
+}
+
+std::string FormatExt4LoadInode(const Ext4LoadInodeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_load_inode: dev %d,%d ino %ld\\n", major(event.dev()),
+ minor(event.dev()), (unsigned long)event.ino());
+ return std::string(line);
+}
+
+std::string FormatExt4LoadInodeBitmap(
+ const Ext4LoadInodeBitmapFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_load_inode_bitmap: dev %d,%d group %u\\n",
+ major(event.dev()), minor(event.dev()), event.group());
+ return std::string(line);
+}
+
+std::string FormatExt4MarkInodeDirty(
+ const Ext4MarkInodeDirtyFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_mark_inode_dirty: dev %d,%d ino %lu caller %pS\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (void*)event.ip());
+ return std::string(line);
+}
+
+std::string FormatExt4MbBitmapLoad(const Ext4MbBitmapLoadFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_mb_bitmap_load: dev %d,%d group %u\\n",
+ major(event.dev()), minor(event.dev()), event.group());
+ return std::string(line);
+}
+
+std::string FormatExt4MbBuddyBitmapLoad(
+ const Ext4MbBuddyBitmapLoadFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_mb_buddy_bitmap_load: dev %d,%d group %u\\n",
+ major(event.dev()), minor(event.dev()), event.group());
+ return std::string(line);
+}
+
+std::string FormatExt4MbDiscardPreallocations(
+ const Ext4MbDiscardPreallocationsFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_mb_discard_preallocations: dev %d,%d needed %d\\n",
+ major(event.dev()), minor(event.dev()), event.needed());
+ return std::string(line);
+}
+
+std::string FormatExt4MbNewGroupPa(const Ext4MbNewGroupPaFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_mb_new_group_pa: dev %d,%d ino %lu pstart %llu len %u lstart "
+ "%llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.pa_pstart(), event.pa_len(), event.pa_lstart());
+ return std::string(line);
+}
+
+std::string FormatExt4MbNewInodePa(const Ext4MbNewInodePaFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_mb_new_inode_pa: dev %d,%d ino %lu pstart %llu len %u lstart "
+ "%llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.pa_pstart(), event.pa_len(), event.pa_lstart());
+ return std::string(line);
+}
+
+std::string FormatExt4MbReleaseGroupPa(
+ const Ext4MbReleaseGroupPaFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_mb_release_group_pa: dev %d,%d pstart %llu len %u\\n",
+ major(event.dev()), minor(event.dev()), event.pa_pstart(),
+ event.pa_len());
+ return std::string(line);
+}
+
+std::string FormatExt4MbReleaseInodePa(
+ const Ext4MbReleaseInodePaFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_mb_release_inode_pa: dev %d,%d ino %lu block %llu count %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.block(), event.count());
+ return std::string(line);
+}
+
+std::string FormatExt4MballocAlloc(const Ext4MballocAllocFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_mballoc_alloc: dev %d,%d inode %lu orig %u/%d/%u@%u goal "
+ "%u/%d/%u@%u result %u/%d/%u@%u blks %u grps %u cr %u flags %s tail "
+ "%u broken %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.orig_group(), event.orig_start(), event.orig_len(),
+ event.orig_logical(), event.goal_group(), event.goal_start(),
+ event.goal_len(), event.goal_logical(), event.result_group(),
+ event.result_start(), event.result_len(), event.result_logical(),
+ event.found(), event.groups(), event.cr(),
+ GetExt4HintFlag(event.flags()), event.tail(),
+ event.buddy() ? 1 << event.buddy() : 0);
+ return std::string(line);
+}
+
+std::string FormatExt4MballocDiscard(
+ const Ext4MballocDiscardFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_mballoc_discard: dev %d,%d inode %lu extent %u/%d/%d \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.result_group(), event.result_start(), event.result_len());
+ return std::string(line);
+}
+
+std::string FormatExt4MballocFree(const Ext4MballocFreeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_mballoc_free: dev %d,%d inode %lu extent %u/%d/%d \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.result_group(), event.result_start(), event.result_len());
+ return std::string(line);
+}
+
+std::string FormatExt4MballocPrealloc(
+ const Ext4MballocPreallocFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_mballoc_prealloc: dev %d,%d inode %lu orig %u/%d/%u@%u result "
+ "%u/%d/%u@%u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.orig_group(), event.orig_start(), event.orig_len(),
+ event.orig_logical(), event.result_group(), event.result_start(),
+ event.result_len(), event.result_logical());
+ return std::string(line);
+}
+
+std::string FormatExt4OtherInodeUpdateTime(
+ const Ext4OtherInodeUpdateTimeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_other_inode_update_time: dev %d,%d orig_ino %lu ino %lu mode "
+ "0%o uid %u gid %u\\n",
+ major(event.dev()), minor(event.dev()),
+ (unsigned long)event.orig_ino(), (unsigned long)event.ino(),
+ event.mode(), event.uid(), event.gid());
+ return std::string(line);
+}
+
+std::string FormatExt4PunchHole(const Ext4PunchHoleFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_punch_hole: dev %d,%d ino %lu offset %lld len %lld mode %s\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
+ return std::string(line);
+}
+
+std::string FormatExt4ReadBlockBitmapLoad(
+ const Ext4ReadBlockBitmapLoadFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_read_block_bitmap_load: dev %d,%d group %u\\n",
+ major(event.dev()), minor(event.dev()), event.group());
+ return std::string(line);
+}
+
+std::string FormatExt4Readpage(const Ext4ReadpageFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_readpage: dev %d,%d ino %lu page_index %lu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long)event.index());
+ return std::string(line);
+}
+
+std::string FormatExt4Releasepage(const Ext4ReleasepageFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_releasepage: dev %d,%d ino %lu page_index %lu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long)event.index());
+ return std::string(line);
+}
+
+std::string FormatExt4RemoveBlocks(const Ext4RemoveBlocksFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_remove_blocks: dev %d,%d ino %lu extent [%u(%llu), %u]from %u "
+ "to %u partial_cluster %lld\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned)event.ee_lblk(), (unsigned long long)event.ee_pblk(),
+ (unsigned short)event.ee_len(), (unsigned)event.from(),
+ (unsigned)event.to(), (long long)event.partial());
+ return std::string(line);
+}
+
+std::string FormatExt4RequestBlocks(const Ext4RequestBlocksFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_request_blocks: dev %d,%d ino %lu flags %s len %u lblk %u goal "
+ "%llu lleft %u lright %u pleft %llu pright %llu \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ GetExt4HintFlag(event.flags()), event.len(), event.logical(),
+ event.goal(), event.lleft(), event.lright(), event.pleft(),
+ event.pright());
+ return std::string(line);
+}
+
+std::string FormatExt4RequestInode(const Ext4RequestInodeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_request_inode: dev %d,%d dir %lu mode 0%o\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.dir(),
+ event.mode());
+ return std::string(line);
+}
+
+std::string FormatExt4SyncFs(const Ext4SyncFsFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_sync_fs: dev %d,%d wait %d\\n", major(event.dev()),
+ minor(event.dev()), event.wait());
+ return std::string(line);
+}
+
+std::string FormatExt4TrimAllFree(const Ext4TrimAllFreeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_trim_all_free: dev %d,%d group %u, start %d, len %d\\n",
+ event.dev_major(), event.dev_minor(), event.group(), event.start(),
+ event.len());
+ return std::string(line);
+}
+
+std::string FormatExt4TrimExtent(const Ext4TrimExtentFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_trim_extent: dev %d,%d group %u, start %d, len %d\\n",
+ event.dev_major(), event.dev_minor(), event.group(), event.start(),
+ event.len());
+ return std::string(line);
+}
+
+std::string FormatExt4TruncateEnter(const Ext4TruncateEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_truncate_enter: dev %d,%d ino %lu blocks %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.blocks());
+ return std::string(line);
+}
+
+std::string FormatExt4TruncateExit(const Ext4TruncateExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_truncate_exit: dev %d,%d ino %lu blocks %llu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.blocks());
+ return std::string(line);
+}
+
+std::string FormatExt4UnlinkEnter(const Ext4UnlinkEnterFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_unlink_enter: dev %d,%d ino %lu size %lld parent %lu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.size(), (unsigned long)event.parent());
+ return std::string(line);
+}
+
+std::string FormatExt4UnlinkExit(const Ext4UnlinkExitFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_unlink_exit: dev %d,%d ino %lu ret %d\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.ret());
+ return std::string(line);
+}
+
+std::string FormatExt4WriteBegin(const Ext4WriteBeginFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_write_begin: dev %d,%d ino %lu pos %lld len %u flags %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.pos(), event.len(), event.flags());
+ return std::string(line);
+}
+
+std::string FormatExt4WriteEnd(const Ext4WriteEndFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_write_end: %d,%d ino %lu pos %lld len %u copied %u\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.pos(), event.len(), event.copied());
+ return std::string(line);
+}
+
+std::string FormatExt4Writepage(const Ext4WritepageFtraceEvent& event) {
+ char line[2048];
+ sprintf(line, "ext4_writepage: dev %d,%d ino %lu page_index %lu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (unsigned long)event.index());
+ return std::string(line);
+}
+
+std::string FormatExt4Writepages(const Ext4WritepagesFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_writepages: dev %d,%d ino %lu nr_to_write %ld pages_skipped "
+ "%ld range_start %lld range_end %lld sync_mode %d for_kupdate %d "
+ "range_cyclic %d writeback_index %lu\\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ (long)event.nr_to_write(), (long)event.pages_skipped(),
+ event.range_start(), event.range_end(), event.sync_mode(),
+ event.for_kupdate(), event.range_cyclic(),
+ (unsigned long)event.writeback_index());
+ return std::string(line);
+}
+
+std::string FormatExt4WritepagesResult(
+ const Ext4WritepagesResultFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_writepages_result: dev %d,%d ino %lu ret %d pages_written %d "
+ "pages_skipped %ld sync_mode %d writeback_index %lu \\n",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.ret(), event.pages_written(), (long)event.pages_skipped(),
+ event.sync_mode(), (unsigned long)event.writeback_index());
+ return std::string(line);
+}
+
+std::string FormatExt4ZeroRange(const Ext4ZeroRangeFtraceEvent& event) {
+ char line[2048];
+ sprintf(line,
+ "ext4_zero_range: dev %d,%d ino %lu offset %lld len %lld mode %s\\n ",
+ major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
+ event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
+ return std::string(line);
+}
+
+std::string FormatEventText(const protos::FtraceEvent& event) {
+ if (event.has_binder_lock()) {
+ const auto& inner = event.binder_lock();
+ return FormatBinderLock(inner);
+ } else if (event.has_binder_locked()) {
+ const auto& inner = event.binder_locked();
+ return FormatBinderLocked(inner);
+ } else if (event.has_binder_transaction()) {
+ const auto& inner = event.binder_transaction();
+ return FormatBinderTransaction(inner);
+ } else if (event.has_binder_transaction_received()) {
+ const auto& inner = event.binder_transaction_received();
+ return FormatBinderTransactionReceived(inner);
+ } else if (event.has_binder_unlock()) {
+ const auto& inner = event.binder_unlock();
+ return FormatBinderUnlock(inner);
+ } else if (event.has_block_bio_backmerge()) {
+ const auto& inner = event.block_bio_backmerge();
+ return FormatBlockBioBackmerge(inner);
+ } else if (event.has_block_bio_bounce()) {
+ const auto& inner = event.block_bio_bounce();
+ return FormatBlockBioBounce(inner);
+ } else if (event.has_block_bio_complete()) {
+ const auto& inner = event.block_bio_complete();
+ return FormatBlockBioComplete(inner);
+ } else if (event.has_block_bio_frontmerge()) {
+ const auto& inner = event.block_bio_frontmerge();
+ return FormatBlockBioFrontmerge(inner);
+ } else if (event.has_block_bio_queue()) {
+ const auto& inner = event.block_bio_queue();
+ return FormatBlockBioQueue(inner);
+ } else if (event.has_block_bio_remap()) {
+ const auto& inner = event.block_bio_remap();
+ return FormatBlockBioRemap(inner);
+ } else if (event.has_block_dirty_buffer()) {
+ const auto& inner = event.block_dirty_buffer();
+ return FormatBlockDirtyBuffer(inner);
+ } else if (event.has_block_getrq()) {
+ const auto& inner = event.block_getrq();
+ return FormatBlockGetrq(inner);
+ } else if (event.has_block_plug()) {
+ const auto& inner = event.block_plug();
+ return FormatBlockPlug(inner);
+ } else if (event.has_block_rq_abort()) {
+ const auto& inner = event.block_rq_abort();
+ return FormatBlockRqAbort(inner);
+ } else if (event.has_block_rq_complete()) {
+ const auto& inner = event.block_rq_complete();
+ return FormatBlockRqComplete(inner);
+ } else if (event.has_block_rq_insert()) {
+ const auto& inner = event.block_rq_insert();
+ return FormatBlockRqInsert(inner);
+ } else if (event.has_block_rq_issue()) {
+ const auto& inner = event.block_rq_issue();
+ return FormatBlockRqIssue(inner);
+ } else if (event.has_block_rq_remap()) {
+ const auto& inner = event.block_rq_remap();
+ return FormatBlockRqRemap(inner);
+ } else if (event.has_block_rq_requeue()) {
+ const auto& inner = event.block_rq_requeue();
+ return FormatBlockRqRequeue(inner);
+ } else if (event.has_block_sleeprq()) {
+ const auto& inner = event.block_sleeprq();
+ return FormatBlockSleeprq(inner);
+ } else if (event.has_block_split()) {
+ const auto& inner = event.block_split();
+ return FormatBlockSplit(inner);
+ } else if (event.has_block_touch_buffer()) {
+ const auto& inner = event.block_touch_buffer();
+ return FormatBlockTouchBuffer(inner);
+ } else if (event.has_block_unplug()) {
+ const auto& inner = event.block_unplug();
+ return FormatBlockUnplug(inner);
+ } else if (event.has_mm_compaction_begin()) {
+ const auto& inner = event.mm_compaction_begin();
+ return FormatMmCompactionBegin(inner);
+ } else if (event.has_mm_compaction_defer_compaction()) {
+ const auto& inner = event.mm_compaction_defer_compaction();
+ return FormatMmCompactionDeferCompaction(inner);
+ } else if (event.has_mm_compaction_defer_reset()) {
+ const auto& inner = event.mm_compaction_defer_reset();
+ return FormatMmCompactionDeferReset(inner);
+ } else if (event.has_mm_compaction_deferred()) {
+ const auto& inner = event.mm_compaction_deferred();
+ return FormatMmCompactionDeferred(inner);
+ } else if (event.has_mm_compaction_end()) {
+ const auto& inner = event.mm_compaction_end();
+ return FormatMmCompactionEnd(inner);
+ } else if (event.has_mm_compaction_finished()) {
+ const auto& inner = event.mm_compaction_finished();
+ return FormatMmCompactionFinished(inner);
+ } else if (event.has_mm_compaction_isolate_freepages()) {
+ const auto& inner = event.mm_compaction_isolate_freepages();
+ return FormatMmCompactionIsolateFreepages(inner);
+ } else if (event.has_mm_compaction_isolate_migratepages()) {
+ const auto& inner = event.mm_compaction_isolate_migratepages();
+ return FormatMmCompactionIsolateMigratepages(inner);
+ } else if (event.has_mm_compaction_kcompactd_sleep()) {
+ const auto& inner = event.mm_compaction_kcompactd_sleep();
+ return FormatMmCompactionKcompactdSleep(inner);
+ } else if (event.has_mm_compaction_kcompactd_wake()) {
+ const auto& inner = event.mm_compaction_kcompactd_wake();
+ return FormatMmCompactionKcompactdWake(inner);
+ } else if (event.has_mm_compaction_migratepages()) {
+ const auto& inner = event.mm_compaction_migratepages();
+ return FormatMmCompactionMigratepages(inner);
+ } else if (event.has_mm_compaction_suitable()) {
+ const auto& inner = event.mm_compaction_suitable();
+ return FormatMmCompactionSuitable(inner);
+ } else if (event.has_mm_compaction_try_to_compact_pages()) {
+ const auto& inner = event.mm_compaction_try_to_compact_pages();
+ return FormatMmCompactionTryToCompactPages(inner);
+ } else if (event.has_mm_compaction_wakeup_kcompactd()) {
+ const auto& inner = event.mm_compaction_wakeup_kcompactd();
+ return FormatMmCompactionWakeupKcompactd(inner);
+ } else if (event.has_ext4_alloc_da_blocks()) {
+ const auto& inner = event.ext4_alloc_da_blocks();
+ return FormatExt4AllocDaBlocks(inner);
+ } else if (event.has_ext4_allocate_blocks()) {
+ const auto& inner = event.ext4_allocate_blocks();
+ return FormatExt4AllocateBlocks(inner);
+ } else if (event.has_ext4_allocate_inode()) {
+ const auto& inner = event.ext4_allocate_inode();
+ return FormatExt4AllocateInode(inner);
+ } else if (event.has_ext4_begin_ordered_truncate()) {
+ const auto& inner = event.ext4_begin_ordered_truncate();
+ return FormatExt4BeginOrderedTruncate(inner);
+ } else if (event.has_ext4_collapse_range()) {
+ const auto& inner = event.ext4_collapse_range();
+ return FormatExt4CollapseRange(inner);
+ } else if (event.has_ext4_da_release_space()) {
+ const auto& inner = event.ext4_da_release_space();
+ return FormatExt4DaReleaseSpace(inner);
+ } else if (event.has_ext4_da_reserve_space()) {
+ const auto& inner = event.ext4_da_reserve_space();
+ return FormatExt4DaReserveSpace(inner);
+ } else if (event.has_ext4_da_update_reserve_space()) {
+ const auto& inner = event.ext4_da_update_reserve_space();
+ return FormatExt4DaUpdateReserveSpace(inner);
+ } else if (event.has_ext4_da_write_begin()) {
+ const auto& inner = event.ext4_da_write_begin();
+ return FormatExt4DaWriteBegin(inner);
+ } else if (event.has_ext4_da_write_end()) {
+ const auto& inner = event.ext4_da_write_end();
+ return FormatExt4DaWriteEnd(inner);
+ } else if (event.has_ext4_da_write_pages()) {
+ const auto& inner = event.ext4_da_write_pages();
+ return FormatExt4DaWritePages(inner);
+ } else if (event.has_ext4_da_write_pages_extent()) {
+ const auto& inner = event.ext4_da_write_pages_extent();
+ return FormatExt4DaWritePagesExtent(inner);
+ } else if (event.has_ext4_discard_blocks()) {
+ const auto& inner = event.ext4_discard_blocks();
+ return FormatExt4DiscardBlocks(inner);
+ } else if (event.has_ext4_discard_preallocations()) {
+ const auto& inner = event.ext4_discard_preallocations();
+ return FormatExt4DiscardPreallocations(inner);
+ } else if (event.has_ext4_drop_inode()) {
+ const auto& inner = event.ext4_drop_inode();
+ return FormatExt4DropInode(inner);
+ } else if (event.has_ext4_es_cache_extent()) {
+ const auto& inner = event.ext4_es_cache_extent();
+ return FormatExt4EsCacheExtent(inner);
+ } else if (event.has_ext4_es_find_delayed_extent_range_enter()) {
+ const auto& inner = event.ext4_es_find_delayed_extent_range_enter();
+ return FormatExt4EsFindDelayedExtentRangeEnter(inner);
+ } else if (event.has_ext4_es_find_delayed_extent_range_exit()) {
+ const auto& inner = event.ext4_es_find_delayed_extent_range_exit();
+ return FormatExt4EsFindDelayedExtentRangeExit(inner);
+ } else if (event.has_ext4_es_insert_extent()) {
+ const auto& inner = event.ext4_es_insert_extent();
+ return FormatExt4EsInsertExtent(inner);
+ } else if (event.has_ext4_es_lookup_extent_enter()) {
+ const auto& inner = event.ext4_es_lookup_extent_enter();
+ return FormatExt4EsLookupExtentEnter(inner);
+ } else if (event.has_ext4_es_lookup_extent_exit()) {
+ const auto& inner = event.ext4_es_lookup_extent_exit();
+ return FormatExt4EsLookupExtentExit(inner);
+ } else if (event.has_ext4_es_remove_extent()) {
+ const auto& inner = event.ext4_es_remove_extent();
+ return FormatExt4EsRemoveExtent(inner);
+ } else if (event.has_ext4_es_shrink()) {
+ const auto& inner = event.ext4_es_shrink();
+ return FormatExt4EsShrink(inner);
+ } else if (event.has_ext4_es_shrink_count()) {
+ const auto& inner = event.ext4_es_shrink_count();
+ return FormatExt4EsShrinkCount(inner);
+ } else if (event.has_ext4_es_shrink_scan_enter()) {
+ const auto& inner = event.ext4_es_shrink_scan_enter();
+ return FormatExt4EsShrinkScanEnter(inner);
+ } else if (event.has_ext4_es_shrink_scan_exit()) {
+ const auto& inner = event.ext4_es_shrink_scan_exit();
+ return FormatExt4EsShrinkScanExit(inner);
+ } else if (event.has_ext4_evict_inode()) {
+ const auto& inner = event.ext4_evict_inode();
+ return FormatExt4EvictInode(inner);
+ } else if (event.has_ext4_ext_convert_to_initialized_enter()) {
+ const auto& inner = event.ext4_ext_convert_to_initialized_enter();
+ return FormatExt4ExtConvertToInitializedEnter(inner);
+ } else if (event.has_ext4_ext_convert_to_initialized_fastpath()) {
+ const auto& inner = event.ext4_ext_convert_to_initialized_fastpath();
+ return FormatExt4ExtConvertToInitializedFastpath(inner);
+ } else if (event.has_ext4_ext_handle_unwritten_extents()) {
+ const auto& inner = event.ext4_ext_handle_unwritten_extents();
+ return FormatExt4ExtHandleUnwrittenExtents(inner);
+ } else if (event.has_ext4_ext_in_cache()) {
+ const auto& inner = event.ext4_ext_in_cache();
+ return FormatExt4ExtInCache(inner);
+ } else if (event.has_ext4_ext_load_extent()) {
+ const auto& inner = event.ext4_ext_load_extent();
+ return FormatExt4ExtLoadExtent(inner);
+ } else if (event.has_ext4_ext_map_blocks_enter()) {
+ const auto& inner = event.ext4_ext_map_blocks_enter();
+ return FormatExt4ExtMapBlocksEnter(inner);
+ } else if (event.has_ext4_ext_map_blocks_exit()) {
+ const auto& inner = event.ext4_ext_map_blocks_exit();
+ return FormatExt4ExtMapBlocksExit(inner);
+ } else if (event.has_ext4_ext_put_in_cache()) {
+ const auto& inner = event.ext4_ext_put_in_cache();
+ return FormatExt4ExtPutInCache(inner);
+ } else if (event.has_ext4_ext_remove_space()) {
+ const auto& inner = event.ext4_ext_remove_space();
+ return FormatExt4ExtRemoveSpace(inner);
+ } else if (event.has_ext4_ext_remove_space_done()) {
+ const auto& inner = event.ext4_ext_remove_space_done();
+ return FormatExt4ExtRemoveSpaceDone(inner);
+ } else if (event.has_ext4_ext_rm_idx()) {
+ const auto& inner = event.ext4_ext_rm_idx();
+ return FormatExt4ExtRmIdx(inner);
+ } else if (event.has_ext4_ext_rm_leaf()) {
+ const auto& inner = event.ext4_ext_rm_leaf();
+ return FormatExt4ExtRmLeaf(inner);
+ } else if (event.has_ext4_ext_show_extent()) {
+ const auto& inner = event.ext4_ext_show_extent();
+ return FormatExt4ExtShowExtent(inner);
+ } else if (event.has_ext4_fallocate_enter()) {
+ const auto& inner = event.ext4_fallocate_enter();
+ return FormatExt4FallocateEnter(inner);
+ } else if (event.has_ext4_fallocate_exit()) {
+ const auto& inner = event.ext4_fallocate_exit();
+ return FormatExt4FallocateExit(inner);
+ } else if (event.has_ext4_find_delalloc_range()) {
+ const auto& inner = event.ext4_find_delalloc_range();
+ return FormatExt4FindDelallocRange(inner);
+ } else if (event.has_ext4_forget()) {
+ const auto& inner = event.ext4_forget();
+ return FormatExt4Forget(inner);
+ } else if (event.has_ext4_free_blocks()) {
+ const auto& inner = event.ext4_free_blocks();
+ return FormatExt4FreeBlocks(inner);
+ } else if (event.has_ext4_free_inode()) {
+ const auto& inner = event.ext4_free_inode();
+ return FormatExt4FreeInode(inner);
+ } else if (event.has_ext4_get_implied_cluster_alloc_exit()) {
+ const auto& inner = event.ext4_get_implied_cluster_alloc_exit();
+ return FormatExt4GetImpliedClusterAllocExit(inner);
+ } else if (event.has_ext4_get_reserved_cluster_alloc()) {
+ const auto& inner = event.ext4_get_reserved_cluster_alloc();
+ return FormatExt4GetReservedClusterAlloc(inner);
+ } else if (event.has_ext4_ind_map_blocks_enter()) {
+ const auto& inner = event.ext4_ind_map_blocks_enter();
+ return FormatExt4IndMapBlocksEnter(inner);
+ } else if (event.has_ext4_ind_map_blocks_exit()) {
+ const auto& inner = event.ext4_ind_map_blocks_exit();
+ return FormatExt4IndMapBlocksExit(inner);
+ } else if (event.has_ext4_insert_range()) {
+ const auto& inner = event.ext4_insert_range();
+ return FormatExt4InsertRange(inner);
+ } else if (event.has_ext4_invalidatepage()) {
+ const auto& inner = event.ext4_invalidatepage();
+ return FormatExt4Invalidatepage(inner);
+ } else if (event.has_ext4_journal_start()) {
+ const auto& inner = event.ext4_journal_start();
+ return FormatExt4JournalStart(inner);
+ } else if (event.has_ext4_journal_start_reserved()) {
+ const auto& inner = event.ext4_journal_start_reserved();
+ return FormatExt4JournalStartReserved(inner);
+ } else if (event.has_ext4_journalled_invalidatepage()) {
+ const auto& inner = event.ext4_journalled_invalidatepage();
+ return FormatExt4JournalledInvalidatepage(inner);
+ } else if (event.has_ext4_journalled_write_end()) {
+ const auto& inner = event.ext4_journalled_write_end();
+ return FormatExt4JournalledWriteEnd(inner);
+ } else if (event.has_ext4_load_inode()) {
+ const auto& inner = event.ext4_load_inode();
+ return FormatExt4LoadInode(inner);
+ } else if (event.has_ext4_load_inode_bitmap()) {
+ const auto& inner = event.ext4_load_inode_bitmap();
+ return FormatExt4LoadInodeBitmap(inner);
+ } else if (event.has_ext4_mark_inode_dirty()) {
+ const auto& inner = event.ext4_mark_inode_dirty();
+ return FormatExt4MarkInodeDirty(inner);
+ } else if (event.has_ext4_mb_bitmap_load()) {
+ const auto& inner = event.ext4_mb_bitmap_load();
+ return FormatExt4MbBitmapLoad(inner);
+ } else if (event.has_ext4_mb_buddy_bitmap_load()) {
+ const auto& inner = event.ext4_mb_buddy_bitmap_load();
+ return FormatExt4MbBuddyBitmapLoad(inner);
+ } else if (event.has_ext4_mb_discard_preallocations()) {
+ const auto& inner = event.ext4_mb_discard_preallocations();
+ return FormatExt4MbDiscardPreallocations(inner);
+ } else if (event.has_ext4_mb_new_group_pa()) {
+ const auto& inner = event.ext4_mb_new_group_pa();
+ return FormatExt4MbNewGroupPa(inner);
+ } else if (event.has_ext4_mb_new_inode_pa()) {
+ const auto& inner = event.ext4_mb_new_inode_pa();
+ return FormatExt4MbNewInodePa(inner);
+ } else if (event.has_ext4_mb_release_group_pa()) {
+ const auto& inner = event.ext4_mb_release_group_pa();
+ return FormatExt4MbReleaseGroupPa(inner);
+ } else if (event.has_ext4_mb_release_inode_pa()) {
+ const auto& inner = event.ext4_mb_release_inode_pa();
+ return FormatExt4MbReleaseInodePa(inner);
+ } else if (event.has_ext4_mballoc_alloc()) {
+ const auto& inner = event.ext4_mballoc_alloc();
+ return FormatExt4MballocAlloc(inner);
+ } else if (event.has_ext4_mballoc_discard()) {
+ const auto& inner = event.ext4_mballoc_discard();
+ return FormatExt4MballocDiscard(inner);
+ } else if (event.has_ext4_mballoc_free()) {
+ const auto& inner = event.ext4_mballoc_free();
+ return FormatExt4MballocFree(inner);
+ } else if (event.has_ext4_mballoc_prealloc()) {
+ const auto& inner = event.ext4_mballoc_prealloc();
+ return FormatExt4MballocPrealloc(inner);
+ } else if (event.has_ext4_other_inode_update_time()) {
+ const auto& inner = event.ext4_other_inode_update_time();
+ return FormatExt4OtherInodeUpdateTime(inner);
+ } else if (event.has_ext4_punch_hole()) {
+ const auto& inner = event.ext4_punch_hole();
+ return FormatExt4PunchHole(inner);
+ } else if (event.has_ext4_read_block_bitmap_load()) {
+ const auto& inner = event.ext4_read_block_bitmap_load();
+ return FormatExt4ReadBlockBitmapLoad(inner);
+ } else if (event.has_ext4_readpage()) {
+ const auto& inner = event.ext4_readpage();
+ return FormatExt4Readpage(inner);
+ } else if (event.has_ext4_releasepage()) {
+ const auto& inner = event.ext4_releasepage();
+ return FormatExt4Releasepage(inner);
+ } else if (event.has_ext4_remove_blocks()) {
+ const auto& inner = event.ext4_remove_blocks();
+ return FormatExt4RemoveBlocks(inner);
+ } else if (event.has_ext4_request_blocks()) {
+ const auto& inner = event.ext4_request_blocks();
+ return FormatExt4RequestBlocks(inner);
+ } else if (event.has_ext4_request_inode()) {
+ const auto& inner = event.ext4_request_inode();
+ return FormatExt4RequestInode(inner);
+ } else if (event.has_ext4_sync_file_enter()) {
+ const auto& inner = event.ext4_sync_file_enter();
+ return FormatExt4SyncFileEnter(inner);
+ } else if (event.has_ext4_sync_file_exit()) {
+ const auto& inner = event.ext4_sync_file_exit();
+ return FormatExt4SyncFileExit(inner);
+ } else if (event.has_ext4_sync_fs()) {
+ const auto& inner = event.ext4_sync_fs();
+ return FormatExt4SyncFs(inner);
+ } else if (event.has_ext4_trim_all_free()) {
+ const auto& inner = event.ext4_trim_all_free();
+ return FormatExt4TrimAllFree(inner);
+ } else if (event.has_ext4_trim_extent()) {
+ const auto& inner = event.ext4_trim_extent();
+ return FormatExt4TrimExtent(inner);
+ } else if (event.has_ext4_truncate_enter()) {
+ const auto& inner = event.ext4_truncate_enter();
+ return FormatExt4TruncateEnter(inner);
+ } else if (event.has_ext4_truncate_exit()) {
+ const auto& inner = event.ext4_truncate_exit();
+ return FormatExt4TruncateExit(inner);
+ } else if (event.has_ext4_unlink_enter()) {
+ const auto& inner = event.ext4_unlink_enter();
+ return FormatExt4UnlinkEnter(inner);
+ } else if (event.has_ext4_unlink_exit()) {
+ const auto& inner = event.ext4_unlink_exit();
+ return FormatExt4UnlinkExit(inner);
+ } else if (event.has_ext4_write_begin()) {
+ const auto& inner = event.ext4_write_begin();
+ return FormatExt4WriteBegin(inner);
+ } else if (event.has_ext4_write_end()) {
+ const auto& inner = event.ext4_write_end();
+ return FormatExt4WriteEnd(inner);
+ } else if (event.has_ext4_writepage()) {
+ const auto& inner = event.ext4_writepage();
+ return FormatExt4Writepage(inner);
+ } else if (event.has_ext4_writepages()) {
+ const auto& inner = event.ext4_writepages();
+ return FormatExt4Writepages(inner);
+ } else if (event.has_ext4_writepages_result()) {
+ const auto& inner = event.ext4_writepages_result();
+ return FormatExt4WritepagesResult(inner);
+ } else if (event.has_ext4_zero_range()) {
+ const auto& inner = event.ext4_zero_range();
+ return FormatExt4ZeroRange(inner);
+ } else if (event.has_print()) {
+ const auto& inner = event.print();
+ return FormatPrint(inner);
+ } else if (event.has_i2c_read()) {
+ const auto& inner = event.i2c_read();
+ return FormatI2cRead(inner);
+ } else if (event.has_i2c_reply()) {
+ const auto& inner = event.i2c_reply();
+ return FormatI2cReply(inner);
+ } else if (event.has_i2c_result()) {
+ const auto& inner = event.i2c_result();
+ return FormatI2cResult(inner);
+ } else if (event.has_i2c_write()) {
+ const auto& inner = event.i2c_write();
+ return FormatI2cWrite(inner);
+ } else if (event.has_irq_handler_entry()) {
+ const auto& inner = event.irq_handler_entry();
+ return FormatIrqHandlerEntry(inner);
+ } else if (event.has_irq_handler_exit()) {
+ const auto& inner = event.irq_handler_exit();
+ return FormatIrqHandlerExit(inner);
+ } else if (event.has_softirq_entry()) {
+ const auto& inner = event.softirq_entry();
+ return FormatSoftirqEntry(inner);
+ } else if (event.has_softirq_exit()) {
+ const auto& inner = event.softirq_exit();
+ return FormatSoftirqExit(inner);
+ } else if (event.has_softirq_raise()) {
+ const auto& inner = event.softirq_raise();
+ return FormatSoftirqRaise(inner);
+ } else if (event.has_lowmemory_kill()) {
+ const auto& inner = event.lowmemory_kill();
+ return FormatLowmemoryKill(inner);
+ } else if (event.has_tracing_mark_write()) {
+ const auto& inner = event.tracing_mark_write();
+ return FormatTracingMarkWrite(inner);
+ } else if (event.has_clock_disable()) {
+ const auto& inner = event.clock_disable();
+ return FormatClockDisable(inner);
+ } else if (event.has_clock_enable()) {
+ const auto& inner = event.clock_enable();
+ return FormatClockEnable(inner);
+ } else if (event.has_clock_set_rate()) {
+ const auto& inner = event.clock_set_rate();
+ return FormatClockSetRate(inner);
+ } else if (event.has_cpu_frequency()) {
+ const auto& inner = event.cpu_frequency();
+ return FormatCpuFrequency(inner);
+ } else if (event.has_cpu_frequency_limits()) {
+ const auto& inner = event.cpu_frequency_limits();
+ return FormatCpuFrequencyLimits(inner);
+ } else if (event.has_cpu_idle()) {
+ const auto& inner = event.cpu_idle();
+ return FormatCpuIdle(inner);
+ } else if (event.has_suspend_resume()) {
+ const auto& inner = event.suspend_resume();
+ return FormatSuspendResume(inner);
+ } else if (event.has_regulator_disable()) {
+ const auto& inner = event.regulator_disable();
+ return FormatRegulatorDisable(inner);
+ } else if (event.has_regulator_disable_complete()) {
+ const auto& inner = event.regulator_disable_complete();
+ return FormatRegulatorDisableComplete(inner);
+ } else if (event.has_regulator_enable()) {
+ const auto& inner = event.regulator_enable();
+ return FormatRegulatorEnable(inner);
+ } else if (event.has_regulator_enable_complete()) {
+ const auto& inner = event.regulator_enable_complete();
+ return FormatRegulatorEnableComplete(inner);
+ } else if (event.has_regulator_enable_delay()) {
+ const auto& inner = event.regulator_enable_delay();
+ return FormatRegulatorEnableDelay(inner);
+ } else if (event.has_regulator_set_voltage()) {
+ const auto& inner = event.regulator_set_voltage();
+ return FormatRegulatorSetVoltage(inner);
+ } else if (event.has_regulator_set_voltage_complete()) {
+ const auto& inner = event.regulator_set_voltage_complete();
+ return FormatRegulatorSetVoltageComplete(inner);
+ } else if (event.has_sched_blocked_reason()) {
+ const auto& inner = event.sched_blocked_reason();
+ return FormatSchedBlockedReason(inner);
+ } else if (event.has_sched_cpu_hotplug()) {
+ const auto& inner = event.sched_cpu_hotplug();
+ return FormatSchedCpuHotplug(inner);
+ } else if (event.has_sched_switch()) {
+ const auto& inner = event.sched_switch();
+ return FormatSchedSwitch(inner);
+ } else if (event.has_sched_wakeup()) {
+ const auto& inner = event.sched_wakeup();
+ return FormatSchedWakeup(inner);
+ } else if (event.has_sched_wakeup_new()) {
+ const auto& inner = event.sched_wakeup_new();
+ return FormatSchedWakeupNew(inner);
+ } else if (event.has_sync_pt()) {
+ const auto& inner = event.sync_pt();
+ return FormatSyncPt(inner);
+ } else if (event.has_sync_timeline()) {
+ const auto& inner = event.sync_timeline();
+ return FormatSyncTimeline(inner);
+ } else if (event.has_sync_wait()) {
+ const auto& inner = event.sync_wait();
+ return FormatSyncWait(inner);
+ } else if (event.has_mm_vmscan_direct_reclaim_begin()) {
+ const auto& inner = event.mm_vmscan_direct_reclaim_begin();
+ return FormatMmVmscanDirectReclaimBegin(inner);
+ } else if (event.has_mm_vmscan_direct_reclaim_end()) {
+ const auto& inner = event.mm_vmscan_direct_reclaim_end();
+ return FormatMmVmscanDirectReclaimEnd(inner);
+ } else if (event.has_mm_vmscan_kswapd_sleep()) {
+ const auto& inner = event.mm_vmscan_kswapd_sleep();
+ return FormatMmVmscanKswapdSleep(inner);
+ } else if (event.has_mm_vmscan_kswapd_wake()) {
+ const auto& inner = event.mm_vmscan_kswapd_wake();
+ return FormatMmVmscanKswapdWake(inner);
+ } else if (event.has_workqueue_activate_work()) {
+ const auto& inner = event.workqueue_activate_work();
+ return FormatWorkqueueActivateWork(inner);
+ } else if (event.has_workqueue_execute_end()) {
+ const auto& inner = event.workqueue_execute_end();
+ return FormatWorkqueueExecuteEnd(inner);
+ } else if (event.has_workqueue_execute_start()) {
+ const auto& inner = event.workqueue_execute_start();
+ return FormatWorkqueueExecuteStart(inner);
+ } else if (event.has_workqueue_queue_work()) {
+ const auto& inner = event.workqueue_queue_work();
+ return FormatWorkqueueQueueWork(inner);
+ } else if (event.has_sched_process_fork()) {
+ const auto& inner = event.sched_process_fork();
+ return FormatSchedProcessFork(inner);
+ } else if (event.has_sched_process_hang()) {
+ const auto& inner = event.sched_process_hang();
+ return FormatSchedProcessHang(inner);
+ } else if (event.has_sched_process_free()) {
+ const auto& inner = event.sched_process_free();
+ return FormatSchedProcessFree(inner);
+ } else if (event.has_sched_process_exec()) {
+ const auto& inner = event.sched_process_exec();
+ return FormatSchedProcessExec(inner);
+ } else if (event.has_sched_process_exit()) {
+ const auto& inner = event.sched_process_exit();
+ return FormatSchedProcessExit(inner);
+ } else if (event.has_sched_process_wait()) {
+ const auto& inner = event.sched_process_wait();
+ return FormatSchedProcessWait(inner);
+ } else if (event.has_task_rename()) {
+ const auto& inner = event.task_rename();
+ return FormatTaskRename(inner);
+ } else if (event.has_task_newtask()) {
+ const auto& inner = event.task_newtask();
+ return FormatTaskNewtask(inner);
+ }
+ return "";
+}
+
+uint64_t TimestampToSeconds(uint64_t timestamp) {
+ return timestamp / 1000000000ul;
+}
+
+uint64_t TimestampToMicroseconds(uint64_t timestamp) {
+ return (timestamp / 1000) % 1000000ul;
+}
+
+std::string FormatPrefix(uint64_t timestamp, uint64_t cpu) {
+ char line[2048];
+ uint64_t seconds = TimestampToSeconds(timestamp);
+ uint64_t useconds = TimestampToMicroseconds(timestamp);
+ sprintf(line,
+ "<idle>-0 (-----) [%03" PRIu64 "] d..3 %" PRIu64 ".%.6" PRIu64
+ ": ",
+ cpu, seconds, useconds);
+ return std::string(line);
+}
+
+} // namespace
+
+std::string FormatFtraceEvent(uint64_t timestamp,
+ size_t cpu,
+ const protos::FtraceEvent& event) {
+ std::string line = FormatEventText(event);
+ if (line == "")
+ return "";
+ return FormatPrefix(timestamp, cpu) + line;
+}
+
+} // namespace perfetto
diff --git a/tools/trace_to_text/ftrace_event_formatter.h b/tools/trace_to_text/ftrace_event_formatter.h
new file mode 100644
index 0000000..7b76e26
--- /dev/null
+++ b/tools/trace_to_text/ftrace_event_formatter.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef TOOLS_TRACE_TO_TEXT_FTRACE_EVENT_FORMATTER_H_
+#define TOOLS_TRACE_TO_TEXT_FTRACE_EVENT_FORMATTER_H_
+
+#include "tools/trace_to_text/ftrace_event_formatter.h"
+
+#include <string>
+
+#include "perfetto/trace/trace_packet.pb.h"
+
+namespace perfetto {
+
+std::string FormatFtraceEvent(uint64_t timestamp,
+ size_t cpu,
+ const protos::FtraceEvent&);
+
+} // namespace perfetto
+
+#endif // TOOLS_TRACE_TO_TEXT_FTRACE_EVENT_FORMATTER_H_
diff --git a/tools/trace_to_text/main.cc b/tools/trace_to_text/main.cc
index e3c01fe..8769466 100644
--- a/tools/trace_to_text/main.cc
+++ b/tools/trace_to_text/main.cc
@@ -17,10 +17,14 @@
#include <inttypes.h>
#include <stdio.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
#include <algorithm>
#include <fstream>
#include <iostream>
#include <istream>
+#include <limits>
#include <map>
#include <memory>
#include <ostream>
@@ -38,6 +42,7 @@
#include "perfetto/base/logging.h"
#include "perfetto/trace/trace.pb.h"
#include "perfetto/trace/trace_packet.pb.h"
+#include "tools/trace_to_text/ftrace_event_formatter.h"
namespace perfetto {
namespace {
@@ -65,6 +70,8 @@
"# TASK-PID TGID CPU# |||| TIMESTAMP FUNCTION\\n"
"# | | | | |||| | |\\n";
+constexpr const char* inodeFileTypeArray[] = {"UNKNOWN", "FILE", "DIRECTORY"};
+
using google::protobuf::Descriptor;
using google::protobuf::DynamicMessageFactory;
using google::protobuf::FileDescriptor;
@@ -75,236 +82,6 @@
using google::protobuf::compiler::MultiFileErrorCollector;
using google::protobuf::io::OstreamOutputStream;
-using protos::BinderLockFtraceEvent;
-using protos::BinderLockedFtraceEvent;
-using protos::BinderSetPriorityFtraceEvent;
-using protos::BinderTransactionFtraceEvent;
-using protos::BinderTransactionReceivedFtraceEvent;
-using protos::BinderUnlockFtraceEvent;
-using protos::BlockBioBackmergeFtraceEvent;
-using protos::BlockBioBounceFtraceEvent;
-using protos::BlockBioCompleteFtraceEvent;
-using protos::BlockBioFrontmergeFtraceEvent;
-using protos::BlockBioQueueFtraceEvent;
-using protos::BlockBioRemapFtraceEvent;
-using protos::BlockDirtyBufferFtraceEvent;
-using protos::BlockGetrqFtraceEvent;
-using protos::BlockPlugFtraceEvent;
-using protos::BlockRqAbortFtraceEvent;
-using protos::BlockRqCompleteFtraceEvent;
-using protos::BlockRqInsertFtraceEvent;
-using protos::BlockRqIssueFtraceEvent;
-using protos::BlockRqRemapFtraceEvent;
-using protos::BlockRqRequeueFtraceEvent;
-using protos::BlockSleeprqFtraceEvent;
-using protos::BlockSplitFtraceEvent;
-using protos::BlockTouchBufferFtraceEvent;
-using protos::BlockUnplugFtraceEvent;
-using protos::CgroupAttachTaskFtraceEvent;
-using protos::CgroupDestroyRootFtraceEvent;
-using protos::CgroupMkdirFtraceEvent;
-using protos::CgroupReleaseFtraceEvent;
-using protos::CgroupRemountFtraceEvent;
-using protos::CgroupRenameFtraceEvent;
-using protos::CgroupRmdirFtraceEvent;
-using protos::CgroupSetupRootFtraceEvent;
-using protos::CgroupTransferTasksFtraceEvent;
-using protos::MmCompactionBeginFtraceEvent;
-using protos::MmCompactionDeferCompactionFtraceEvent;
-using protos::MmCompactionDeferResetFtraceEvent;
-using protos::MmCompactionDeferredFtraceEvent;
-using protos::MmCompactionEndFtraceEvent;
-using protos::MmCompactionFinishedFtraceEvent;
-using protos::MmCompactionIsolateFreepagesFtraceEvent;
-using protos::MmCompactionIsolateMigratepagesFtraceEvent;
-using protos::MmCompactionKcompactdSleepFtraceEvent;
-using protos::MmCompactionKcompactdWakeFtraceEvent;
-using protos::MmCompactionMigratepagesFtraceEvent;
-using protos::MmCompactionSuitableFtraceEvent;
-using protos::MmCompactionTryToCompactPagesFtraceEvent;
-using protos::MmCompactionWakeupKcompactdFtraceEvent;
-using protos::CpufreqInteractiveAlreadyFtraceEvent;
-using protos::CpufreqInteractiveBoostFtraceEvent;
-using protos::CpufreqInteractiveNotyetFtraceEvent;
-using protos::CpufreqInteractiveSetspeedFtraceEvent;
-using protos::CpufreqInteractiveTargetFtraceEvent;
-using protos::CpufreqInteractiveUnboostFtraceEvent;
-using protos::Ext4AllocDaBlocksFtraceEvent;
-using protos::Ext4AllocateBlocksFtraceEvent;
-using protos::Ext4AllocateInodeFtraceEvent;
-using protos::Ext4BeginOrderedTruncateFtraceEvent;
-using protos::Ext4CollapseRangeFtraceEvent;
-using protos::Ext4DaReleaseSpaceFtraceEvent;
-using protos::Ext4DaReserveSpaceFtraceEvent;
-using protos::Ext4DaUpdateReserveSpaceFtraceEvent;
-using protos::Ext4DaWriteBeginFtraceEvent;
-using protos::Ext4DaWriteEndFtraceEvent;
-using protos::Ext4DaWritePagesFtraceEvent;
-using protos::Ext4DaWritePagesExtentFtraceEvent;
-using protos::Ext4DirectIOEnterFtraceEvent;
-using protos::Ext4DirectIOExitFtraceEvent;
-using protos::Ext4DiscardBlocksFtraceEvent;
-using protos::Ext4DiscardPreallocationsFtraceEvent;
-using protos::Ext4DropInodeFtraceEvent;
-using protos::Ext4EsCacheExtentFtraceEvent;
-using protos::Ext4EsFindDelayedExtentRangeEnterFtraceEvent;
-using protos::Ext4EsFindDelayedExtentRangeExitFtraceEvent;
-using protos::Ext4EsInsertExtentFtraceEvent;
-using protos::Ext4EsLookupExtentEnterFtraceEvent;
-using protos::Ext4EsLookupExtentExitFtraceEvent;
-using protos::Ext4EsRemoveExtentFtraceEvent;
-using protos::Ext4EsShrinkFtraceEvent;
-using protos::Ext4EsShrinkCountFtraceEvent;
-using protos::Ext4EsShrinkScanEnterFtraceEvent;
-using protos::Ext4EsShrinkScanExitFtraceEvent;
-using protos::Ext4EvictInodeFtraceEvent;
-using protos::Ext4ExtConvertToInitializedEnterFtraceEvent;
-using protos::Ext4ExtConvertToInitializedFastpathFtraceEvent;
-using protos::Ext4ExtHandleUnwrittenExtentsFtraceEvent;
-using protos::Ext4ExtInCacheFtraceEvent;
-using protos::Ext4ExtLoadExtentFtraceEvent;
-using protos::Ext4ExtMapBlocksEnterFtraceEvent;
-using protos::Ext4ExtMapBlocksExitFtraceEvent;
-using protos::Ext4ExtPutInCacheFtraceEvent;
-using protos::Ext4ExtRemoveSpaceFtraceEvent;
-using protos::Ext4ExtRemoveSpaceDoneFtraceEvent;
-using protos::Ext4ExtRmIdxFtraceEvent;
-using protos::Ext4ExtRmLeafFtraceEvent;
-using protos::Ext4ExtShowExtentFtraceEvent;
-using protos::Ext4FallocateEnterFtraceEvent;
-using protos::Ext4FallocateExitFtraceEvent;
-using protos::Ext4FindDelallocRangeFtraceEvent;
-using protos::Ext4ForgetFtraceEvent;
-using protos::Ext4FreeBlocksFtraceEvent;
-using protos::Ext4FreeInodeFtraceEvent;
-using protos::Ext4GetImpliedClusterAllocExitFtraceEvent;
-using protos::Ext4GetReservedClusterAllocFtraceEvent;
-using protos::Ext4IndMapBlocksEnterFtraceEvent;
-using protos::Ext4IndMapBlocksExitFtraceEvent;
-using protos::Ext4InsertRangeFtraceEvent;
-using protos::Ext4InvalidatepageFtraceEvent;
-using protos::Ext4JournalStartFtraceEvent;
-using protos::Ext4JournalStartReservedFtraceEvent;
-using protos::Ext4JournalledInvalidatepageFtraceEvent;
-using protos::Ext4JournalledWriteEndFtraceEvent;
-using protos::Ext4LoadInodeFtraceEvent;
-using protos::Ext4LoadInodeBitmapFtraceEvent;
-using protos::Ext4MarkInodeDirtyFtraceEvent;
-using protos::Ext4MbBitmapLoadFtraceEvent;
-using protos::Ext4MbBuddyBitmapLoadFtraceEvent;
-using protos::Ext4MbDiscardPreallocationsFtraceEvent;
-using protos::Ext4MbNewGroupPaFtraceEvent;
-using protos::Ext4MbNewInodePaFtraceEvent;
-using protos::Ext4MbReleaseGroupPaFtraceEvent;
-using protos::Ext4MbReleaseInodePaFtraceEvent;
-using protos::Ext4MballocAllocFtraceEvent;
-using protos::Ext4MballocDiscardFtraceEvent;
-using protos::Ext4MballocFreeFtraceEvent;
-using protos::Ext4MballocPreallocFtraceEvent;
-using protos::Ext4OtherInodeUpdateTimeFtraceEvent;
-using protos::Ext4PunchHoleFtraceEvent;
-using protos::Ext4ReadBlockBitmapLoadFtraceEvent;
-using protos::Ext4ReadpageFtraceEvent;
-using protos::Ext4ReleasepageFtraceEvent;
-using protos::Ext4RemoveBlocksFtraceEvent;
-using protos::Ext4RequestBlocksFtraceEvent;
-using protos::Ext4RequestInodeFtraceEvent;
-using protos::Ext4SyncFileEnterFtraceEvent;
-using protos::Ext4SyncFileExitFtraceEvent;
-using protos::Ext4SyncFsFtraceEvent;
-using protos::Ext4TrimAllFreeFtraceEvent;
-using protos::Ext4TrimExtentFtraceEvent;
-using protos::Ext4TruncateEnterFtraceEvent;
-using protos::Ext4TruncateExitFtraceEvent;
-using protos::Ext4UnlinkEnterFtraceEvent;
-using protos::Ext4UnlinkExitFtraceEvent;
-using protos::Ext4WriteBeginFtraceEvent;
-using protos::Ext4WriteEndFtraceEvent;
-using protos::Ext4WritepageFtraceEvent;
-using protos::Ext4WritepagesFtraceEvent;
-using protos::Ext4WritepagesResultFtraceEvent;
-using protos::Ext4ZeroRangeFtraceEvent;
-using protos::MmFilemapAddToPageCacheFtraceEvent;
-using protos::MmFilemapDeleteFromPageCacheFtraceEvent;
-using protos::PrintFtraceEvent;
-using protos::I2cReadFtraceEvent;
-using protos::I2cReplyFtraceEvent;
-using protos::I2cResultFtraceEvent;
-using protos::I2cWriteFtraceEvent;
-using protos::SmbusReadFtraceEvent;
-using protos::SmbusReplyFtraceEvent;
-using protos::SmbusResultFtraceEvent;
-using protos::SmbusWriteFtraceEvent;
-using protos::IpiEntryFtraceEvent;
-using protos::IpiExitFtraceEvent;
-using protos::IpiRaiseFtraceEvent;
-using protos::IrqHandlerEntryFtraceEvent;
-using protos::IrqHandlerExitFtraceEvent;
-using protos::SoftirqEntryFtraceEvent;
-using protos::SoftirqExitFtraceEvent;
-using protos::SoftirqRaiseFtraceEvent;
-using protos::LowmemoryKillFtraceEvent;
-using protos::MdpCmdKickoffFtraceEvent;
-using protos::MdpCmdPingpongDoneFtraceEvent;
-using protos::MdpCmdReadptrDoneFtraceEvent;
-using protos::MdpCmdReleaseBwFtraceEvent;
-using protos::MdpCmdWaitPingpongFtraceEvent;
-using protos::MdpCommitFtraceEvent;
-using protos::MdpCompareBwFtraceEvent;
-using protos::MdpMisrCrcFtraceEvent;
-using protos::MdpMixerUpdateFtraceEvent;
-using protos::MdpPerfPrefillCalcFtraceEvent;
-using protos::MdpPerfSetOtFtraceEvent;
-using protos::MdpPerfSetPanicLutsFtraceEvent;
-using protos::MdpPerfSetQosLutsFtraceEvent;
-using protos::MdpPerfSetWmLevelsFtraceEvent;
-using protos::MdpPerfUpdateBusFtraceEvent;
-using protos::MdpSsppChangeFtraceEvent;
-using protos::MdpSsppSetFtraceEvent;
-using protos::MdpTraceCounterFtraceEvent;
-using protos::MdpVideoUnderrunDoneFtraceEvent;
-using protos::RotatorBwAoAsContextFtraceEvent;
-using protos::TracingMarkWriteFtraceEvent;
-using protos::ClockDisableFtraceEvent;
-using protos::ClockEnableFtraceEvent;
-using protos::ClockSetRateFtraceEvent;
-using protos::CpuFrequencyFtraceEvent;
-using protos::CpuFrequencyLimitsFtraceEvent;
-using protos::CpuIdleFtraceEvent;
-using protos::SuspendResumeFtraceEvent;
-using protos::RegulatorDisableFtraceEvent;
-using protos::RegulatorDisableCompleteFtraceEvent;
-using protos::RegulatorEnableFtraceEvent;
-using protos::RegulatorEnableCompleteFtraceEvent;
-using protos::RegulatorEnableDelayFtraceEvent;
-using protos::RegulatorSetVoltageFtraceEvent;
-using protos::RegulatorSetVoltageCompleteFtraceEvent;
-using protos::SchedBlockedReasonFtraceEvent;
-using protos::SchedCpuHotplugFtraceEvent;
-using protos::SchedProcessExecFtraceEvent;
-using protos::SchedProcessExitFtraceEvent;
-using protos::SchedProcessForkFtraceEvent;
-using protos::SchedProcessFreeFtraceEvent;
-using protos::SchedProcessHangFtraceEvent;
-using protos::SchedProcessWaitFtraceEvent;
-using protos::SchedSwitchFtraceEvent;
-using protos::SchedWakeupFtraceEvent;
-using protos::SchedWakeupNewFtraceEvent;
-using protos::SchedWakingFtraceEvent;
-using protos::SyncPtFtraceEvent;
-using protos::SyncTimelineFtraceEvent;
-using protos::SyncWaitFtraceEvent;
-using protos::MmVmscanDirectReclaimBeginFtraceEvent;
-using protos::MmVmscanDirectReclaimEndFtraceEvent;
-using protos::MmVmscanKswapdSleepFtraceEvent;
-using protos::MmVmscanKswapdWakeFtraceEvent;
-using protos::WorkqueueActivateWorkFtraceEvent;
-using protos::WorkqueueExecuteEndFtraceEvent;
-using protos::WorkqueueExecuteStartFtraceEvent;
-using protos::WorkqueueQueueWorkFtraceEvent;
-using protos::TaskNewtaskFtraceEvent;
-using protos::TaskRenameFtraceEvent;
-
using protos::FtraceEvent;
using protos::FtraceEventBundle;
using protos::InodeFileMap;
@@ -317,6 +94,14 @@
// TODO(hjd): Add tests.
+size_t GetWidth() {
+ if (!isatty(STDOUT_FILENO))
+ return 80;
+ struct winsize win_size;
+ ioctl(STDOUT_FILENO, TIOCGWINSZ, &win_size);
+ return win_size.ws_col;
+}
+
class MFE : public MultiFileErrorCollector {
virtual void AddError(const std::string& filename,
int line,
@@ -335,122 +120,6 @@
}
};
-const char* GetSchedSwitchFlag(int32_t state) {
- state &= 511;
- if (state & 1)
- return "S";
- if (state & 2)
- return "D";
- if (state & 4)
- return "T";
- if (state & 8)
- return "t";
- if (state & 16)
- return "Z";
- if (state & 32)
- return "X";
- if (state & 64)
- return "x";
- if (state & 128)
- return "W";
- return "R";
-}
-
-const char* GetExt4HintFlag(int32_t state) {
- if (state & 0x0001)
- return "HINT_MERGE";
- if (state & 0x0002)
- return "HINT_RESV";
- if (state & 0x0004)
- return "HINT_MDATA";
- if (state & 0x0008)
- return "HINT_FIRST";
- if (state & 0x0010)
- return "HINT_BEST";
- if (state & 0x0020)
- return "HINT_DATA";
- if (state & 0x0040)
- return "HINT_NOPREALLOC";
- if (state & 0x0080)
- return "HINT_GRP_ALLOCE";
- if (state & 0x0100)
- return "HINT_GOAL_ONLY";
- if (state & 0x0200)
- return "HINT_DATA";
- if (state & 0x0400)
- return "HINT_NOPREALLOC";
- if (state & 0x0800)
- return "HINT_GRP_ALLOCE";
- if (state & 0x2000)
- return "HINT_GOAL_ONLY";
- return "";
-}
-
-const char* GetExt4FreeBlocksFlag(int32_t state) {
- if (state & 0x0001)
- return "METADATA";
- if (state & 0x0002)
- return "FORGET";
- if (state & 0x0004)
- return "VALIDATED";
- if (state & 0x0008)
- return "NO_QUOTA";
- if (state & 0x0010)
- return "1ST_CLUSTER";
- if (state & 0x0020)
- return "LAST_CLUSTER";
- return "";
-}
-
-const char* GetExt4ModeFlag(int32_t state) {
- if (state & 0x01)
- return "KEEP_SIZE";
- if (state & 0x02)
- return "PUNCH_HOLE";
- if (state & 0x04)
- return "NO_HIDE_STALE";
- if (state & 0x08)
- return "COLLAPSE_RANGE";
- if (state & 0x10)
- return "ZERO_RANGE";
- return "";
-}
-
-const char* GetExt4ExtFlag(int32_t state) {
- if (state & 0x0001)
- return "CREATE";
- if (state & 0x0002)
- return "UNWRIT";
- if (state & 0x0004)
- return "DEALLOC";
- if (state & 0x0008)
- return "PRE_IO";
- if (state & 0x0010)
- return "CONVERT";
- if (state & 0x0020)
- return "METADATA_NOFAIL";
- if (state & 0x0040)
- return "NO_NORMALIZE";
- if (state & 0x0080)
- return "KEEP_SIZE";
- if (state & 0x0100)
- return "NO_LOCK";
- return "";
-}
-
-constexpr const char* MmCompactionRetArray[] = {
- "deferred", "skipped", "continue", "partial",
- "complete", "no_suitable_page", "not_suitable_zone", "contended"};
-
-constexpr const char* MmCompactionSuitableArray[] = {"DMA", "Normal",
- "Movable"};
-
-constexpr const char* SoftirqArray[] = {
- "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK",
- "BLOCK_IOPOLL", "TASKLET", "SCHED", "HRTIMER", "RCU"};
-
-constexpr const char* inodeFileTypeArray[] = {"UNKNOWN", "FILE", "DIRECTORY"};
-
uint64_t TimestampToSeconds(uint64_t timestamp) {
return timestamp / 1000000000ul;
}
@@ -470,1693 +139,6 @@
return std::string(line);
}
-std::string FormatSchedSwitch(const SchedSwitchFtraceEvent& sched_switch) {
- char line[2048];
- sprintf(line,
- "sched_switch: prev_comm=%s "
- "prev_pid=%d prev_prio=%d prev_state=%s ==> next_comm=%s next_pid=%d "
- "next_prio=%d\\n",
- sched_switch.prev_comm().c_str(), sched_switch.prev_pid(),
- sched_switch.prev_prio(),
- GetSchedSwitchFlag(sched_switch.prev_state()),
- sched_switch.next_comm().c_str(), sched_switch.next_pid(),
- sched_switch.next_prio());
- return std::string(line);
-}
-
-std::string FormatSchedWakeup(const SchedWakeupFtraceEvent& sched_wakeup) {
- char line[2048];
- sprintf(line,
- "sched_wakeup: comm=%s "
- "pid=%d prio=%d success=%d target_cpu=%03d\\n",
- sched_wakeup.comm().c_str(), sched_wakeup.pid(), sched_wakeup.prio(),
- sched_wakeup.success(), sched_wakeup.target_cpu());
- return std::string(line);
-}
-
-std::string FormatSchedBlockedReason(
- const SchedBlockedReasonFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sched_blocked_reason: pid=%d iowait=%d caller=%llxS\\n",
- event.pid(), event.io_wait(), event.caller());
- return std::string(line);
-}
-
-std::string FormatPrint(const PrintFtraceEvent& print) {
- char line[2048];
- std::string msg = print.buf();
- // Remove any newlines in the message. It's not entirely clear what the right
- // behaviour is here. Maybe we should escape them instead?
- msg.erase(std::remove(msg.begin(), msg.end(), '\n'), msg.end());
- sprintf(line, "tracing_mark_write: %s\\n", msg.c_str());
- return std::string(line);
-}
-
-std::string FormatCpuFrequency(const CpuFrequencyFtraceEvent& event) {
- char line[2048];
- sprintf(line, "cpu_frequency: state=%" PRIu32 " cpu_id=%" PRIu32 "\\n",
- event.state(), event.cpu_id());
- return std::string(line);
-}
-
-std::string FormatCpuFrequencyLimits(
- const CpuFrequencyLimitsFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "cpu_frequency_limits: min_freq=%" PRIu32 "max_freq=%" PRIu32
- " cpu_id=%" PRIu32 "\\n",
- event.min_freq(), event.max_freq(), event.cpu_id());
- return std::string(line);
-}
-
-std::string FormatCpuIdle(const CpuIdleFtraceEvent& event) {
- char line[2048];
- sprintf(line, "cpu_idle: state=%" PRIu32 " cpu_id=%" PRIu32 "\\n",
- event.state(), event.cpu_id());
- return std::string(line);
-}
-
-std::string FormatClockSetRate(const ClockSetRateFtraceEvent& event) {
- char line[2048];
- sprintf(line, "clock_set_rate: %s state=%llu cpu_id=%llu\\n",
- event.name().empty() ? "todo" : event.name().c_str(), event.state(),
- event.cpu_id());
- return std::string(line);
-}
-
-std::string FormatClockEnable(const ClockEnableFtraceEvent& event) {
- char line[2048];
- sprintf(line, "clock_enable: %s state=%llu cpu_id=%llu\\n",
- event.name().empty() ? "todo" : event.name().c_str(), event.state(),
- event.cpu_id());
- return std::string(line);
-}
-
-std::string FormatClockDisable(const ClockDisableFtraceEvent& event) {
- char line[2048];
- sprintf(line, "clock_disable: %s state=%llu cpu_id=%llu\\n",
- event.name().empty() ? "todo" : event.name().c_str(), event.state(),
- event.cpu_id());
- return std::string(line);
-}
-
-std::string FormatTracingMarkWrite(const TracingMarkWriteFtraceEvent& event) {
- char line[2048];
- sprintf(line, "tracing_mark_write: %s|%d|%s\\n",
- event.trace_begin() ? "B" : "E", event.pid(),
- event.trace_name().c_str());
- return std::string(line);
-}
-
-std::string FormatBinderLocked(const BinderLockedFtraceEvent& event) {
- char line[2048];
- sprintf(line, "binder_locked: tag=%s\\n", event.tag().c_str());
- return std::string(line);
-}
-
-std::string FormatBinderUnlock(const BinderUnlockFtraceEvent& event) {
- char line[2048];
- sprintf(line, "binder_unlock: tag=%s\\n", event.tag().c_str());
- return std::string(line);
-}
-
-std::string FormatBinderLock(const BinderLockFtraceEvent& event) {
- char line[2048];
- sprintf(line, "binder_lock: tag=%s\\n", event.tag().c_str());
- return std::string(line);
-}
-
-std::string FormatBinderTransaction(const BinderTransactionFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "binder_transaction: transaction=%d dest_node=%d dest_proc=%d "
- "dest_thread=%d reply=%d flags=0x%x code=0x%x\\n",
- event.debug_id(), event.target_node(), event.to_proc(),
- event.to_thread(), event.reply(), event.flags(), event.code());
- return std::string(line);
-}
-
-std::string FormatBinderTransactionReceived(
- const BinderTransactionReceivedFtraceEvent& event) {
- char line[2048];
- sprintf(line, "binder_transaction_received: transaction=%d\\n",
- event.debug_id());
- return std::string(line);
-}
-
-std::string FormatExt4SyncFileEnter(const Ext4SyncFileEnterFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_sync_file_enter: dev %d,%d ino %lu parent %lu datasync %d \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long)event.parent(), event.datasync());
- return std::string(line);
-}
-
-std::string FormatExt4SyncFileExit(const Ext4SyncFileExitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_sync_file_exit: dev %d,%d ino %lu ret %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.ret());
- return std::string(line);
-}
-
-std::string FormatExt4DaWriteBegin(const Ext4DaWriteBeginFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_da_write_begin: dev %d,%d ino %lu pos %lld len %u flags %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.pos(), event.len(), event.flags());
- return std::string(line);
-}
-
-std::string FormatExt4DaWriteEnd(const Ext4DaWriteEndFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_da_write_end: dev %d,%d ino %lu pos %lld len %u copied %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.pos(), event.len(), event.copied());
- return std::string(line);
-}
-
-std::string FormatBlockRqIssue(const BlockRqIssueFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_rq_issue: %d,%d %s %u (%s) %llu + %u [%s]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- event.bytes(), event.cmd().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatI2cRead(const I2cReadFtraceEvent& event) {
- char line[2048];
- sprintf(line, "i2c_read: i2c-%d #%u a=%03x f=%04x l=%u\\n",
- event.adapter_nr(), event.msg_nr(), event.addr(), event.flags(),
- event.len());
- return std::string(line);
-}
-
-std::string FormatI2cResult(const I2cResultFtraceEvent& event) {
- char line[2048];
- sprintf(line, "i2c_result: i2c-%d n=%u ret=%d\\n", event.adapter_nr(),
- event.nr_msgs(), event.ret());
- return std::string(line);
-}
-
-std::string FormatIrqHandlerEntry(const IrqHandlerEntryFtraceEvent& event) {
- char line[2048];
- sprintf(line, "irq_handler_entry: irq=%d name=%s\\n", event.irq(),
- event.name().c_str());
- return std::string(line);
-}
-
-std::string FormatIrqHandlerExit(const IrqHandlerExitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "irq_handler_exit: irq=%d ret=%s\\n", event.irq(),
- event.ret() ? "handled" : "unhandled");
- return std::string(line);
-}
-
-std::string FormatMmVmscanKswapdWake(
- const MmVmscanKswapdWakeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "mm_vmscan_kswapd_wake: nid=%d order=%d\\n", event.nid(),
- event.order());
- return std::string(line);
-}
-
-std::string FormatMmVmscanKswapdSleep(
- const MmVmscanKswapdSleepFtraceEvent& event) {
- char line[2048];
- sprintf(line, "mm_vmscan_kswapd_sleep: nid=%d\\n", event.nid());
- return std::string(line);
-}
-
-std::string FormatRegulatorEnable(const RegulatorEnableFtraceEvent& event) {
- char line[2048];
- sprintf(line, "regulator_enable: name=%s\\n", event.name().c_str());
- return std::string(line);
-}
-
-std::string FormatRegulatorEnableDelay(
- const RegulatorEnableDelayFtraceEvent& event) {
- char line[2048];
- sprintf(line, "regulator_enable_delay: name=%s\\n", event.name().c_str());
- return std::string(line);
-}
-
-std::string FormatRegulatorEnableComplete(
- const RegulatorEnableCompleteFtraceEvent& event) {
- char line[2048];
- sprintf(line, "regulator_enable_complete: name=%s\\n", event.name().c_str());
- return std::string(line);
-}
-
-std::string FormatRegulatorDisable(const RegulatorDisableFtraceEvent& event) {
- char line[2048];
- sprintf(line, "regulator_disable: name=%s\\n", event.name().c_str());
- return std::string(line);
-}
-
-std::string FormatRegulatorDisableComplete(
- const RegulatorDisableCompleteFtraceEvent& event) {
- char line[2048];
- sprintf(line, "regulator_disable_complete: name=%s\\n", event.name().c_str());
- return std::string(line);
-}
-
-std::string FormatRegulatorSetVoltage(
- const RegulatorSetVoltageFtraceEvent& event) {
- char line[2048];
- sprintf(line, "regulator_set_voltage: name=%s (%d-%d)\\n",
- event.name().c_str(), event.min(), event.max());
- return std::string(line);
-}
-
-std::string FormatRegulatorSetVoltageComplete(
- const RegulatorSetVoltageCompleteFtraceEvent& event) {
- char line[2048];
- sprintf(line, "regulator_set_voltage_complete: name=%s, val=%u\\n",
- event.name().c_str(), event.val());
- return std::string(line);
-}
-
-std::string FormatSchedCpuHotplug(const SchedCpuHotplugFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sched_cpu_hotplug: cpu %d %s error=%d\\n",
- event.affected_cpu(), event.status() ? "online" : "offline",
- event.error());
- return std::string(line);
-}
-
-std::string FormatSyncTimeline(const SyncTimelineFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sync_timeline: name=%s value=%s\\n", event.name().c_str(),
- event.value().c_str());
- return std::string(line);
-}
-
-std::string FormatSyncWait(const SyncWaitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sync_wait: %s name=%s state=%d\\n",
- event.begin() ? "begin" : "end", event.name().c_str(),
- event.status());
- return std::string(line);
-}
-
-std::string FormatSyncPt(const SyncPtFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sync_pt: name=%s value=%s\\n", event.timeline().c_str(),
- event.value().c_str());
- return std::string(line);
-}
-
-int TraceToText(std::istream* input, std::ostream* output) {
- DiskSourceTree dst;
- dst.MapPath("perfetto", "protos/perfetto");
- MFE mfe;
- Importer importer(&dst, &mfe);
- const FileDescriptor* parsed_file =
- importer.Import("perfetto/trace/trace.proto");
-
- DynamicMessageFactory dmf;
- const Descriptor* trace_descriptor = parsed_file->message_type(0);
- const Message* msg_root = dmf.GetPrototype(trace_descriptor);
- Message* msg = msg_root->New();
-
- if (!msg->ParseFromIstream(input)) {
- PERFETTO_ELOG("Could not parse input.");
- return 1;
- }
- OstreamOutputStream zero_copy_output(output);
- TextFormat::Print(*msg, &zero_copy_output);
- return 0;
-}
-
-std::string FormatSoftirqRaise(const SoftirqRaiseFtraceEvent& event) {
- char line[2048];
- sprintf(line, "softirq_raise: vec=%u [action=%s]\\n", event.vec(),
- SoftirqArray[event.vec()]);
- return std::string(line);
-}
-
-std::string FormatSoftirqEntry(const SoftirqEntryFtraceEvent& event) {
- char line[2048];
- sprintf(line, "softirq_entry: vec=%u [action=%s]\\n", event.vec(),
- SoftirqArray[event.vec()]);
- return std::string(line);
-}
-
-std::string FormatSoftirqExit(const SoftirqExitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "softirq_exit: vec=%u [action=%s]\\n", event.vec(),
- SoftirqArray[event.vec()]);
- return std::string(line);
-}
-
-std::string FormatI2cWrite(const I2cWriteFtraceEvent& event) {
- char line[2048];
- // TODO(hjd): Check event.buf().
- sprintf(line, "i2c_write: i2c-%d #%u a=%03x f=%04x l=%u\\n",
- event.adapter_nr(), event.msg_nr(), event.addr(), event.flags(),
- event.len());
- return std::string(line);
-}
-
-std::string FormatI2cReply(const I2cReplyFtraceEvent& event) {
- char line[2048];
- // TODO(hjd): Check event.buf().
- sprintf(line, "i2c_reply: i2c-%d #%u a=%03x f=%04x l=%u\\n",
- event.adapter_nr(), event.msg_nr(), event.addr(), event.flags(),
- event.len());
- return std::string(line);
-}
-
-// TODO(hjd): Check gfp_flags
-std::string FormatMmVmscanDirectReclaimBegin(
- const MmVmscanDirectReclaimBeginFtraceEvent& event) {
- char line[2048];
- sprintf(line, "mm_vmscan_direct_reclaim_begin: order=%d may_writepage=%d\\n",
- event.order(), event.may_writepage());
- return std::string(line);
-}
-
-std::string FormatMmVmscanDirectReclaimEnd(
- const MmVmscanDirectReclaimEndFtraceEvent& event) {
- char line[2048];
- sprintf(line, "mm_vmscan_direct_reclaim_end: nr_reclaimed=%llu\\n",
- event.nr_reclaimed());
- return std::string(line);
-}
-
-std::string FormatLowmemoryKill(const LowmemoryKillFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "lowmemory_kill: %s (%d), page cache %lldkB (limit %lldkB), free "
- "%lldKb\\n",
- event.comm().c_str(), event.pid(), event.pagecache_size(),
- event.pagecache_limit(), event.free());
- return std::string(line);
-}
-
-std::string FormatWorkqueueExecuteStart(
- const WorkqueueExecuteStartFtraceEvent& event) {
- char line[2048];
- sprintf(line, "workqueue_execute_start: work struct %llx: function %llxf\\n",
- event.work(), event.function());
- return std::string(line);
-}
-
-std::string FormatWorkqueueExecuteEnd(
- const WorkqueueExecuteEndFtraceEvent& event) {
- char line[2048];
- sprintf(line, "workqueue_execute_end: work struct %llx\\n", event.work());
- return std::string(line);
-}
-
-std::string FormatWorkqueueQueueWork(
- const WorkqueueQueueWorkFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "workqueue_queue_work: work struct=%llx function=%llxf workqueue=%llx "
- "req_cpu=%u cpu=%u\\n",
- event.work(), event.function(), event.workqueue(), event.req_cpu(),
- event.cpu());
- return std::string(line);
-}
-
-std::string FormatWorkqueueActivateWork(
- const WorkqueueActivateWorkFtraceEvent& event) {
- char line[2048];
- sprintf(line, "workqueue_activate_work: work struct %llx\\n", event.work());
- return std::string(line);
-}
-
-std::string FormatMmCompactionBegin(const MmCompactionBeginFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_begin: zone_start=0x%llx migrate_pfn=0x%llx "
- "free_pfn=0x%llx zone_end=0x%llx, mode=%s\\n",
- event.zone_start(), event.migrate_pfn(), event.free_pfn(),
- event.zone_end(), event.sync() ? "sync" : "async");
- return std::string(line);
-}
-
-std::string FormatMmCompactionDeferCompaction(
- const MmCompactionDeferCompactionFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_defer_compaction: node=%d zone=%-8s order=%d "
- "order_failed=%d consider=%u limit=%lu\\n",
- event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
- event.order_failed(), event.considered(), 1UL << event.defer_shift());
- return std::string(line);
-}
-
-std::string FormatMmCompactionDeferred(
- const MmCompactionDeferredFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_deferred: node=%d zone=%-8s order=%d order_failed=%d "
- "consider=%u limit=%lu\\n",
- event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
- event.order_failed(), event.considered(), 1UL << event.defer_shift());
- return std::string(line);
-}
-
-std::string FormatMmCompactionDeferReset(
- const MmCompactionDeferResetFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_defer_reset: node=%d zone=%-8s order=%d "
- "order_failed=%d consider=%u limit=%lu\\n",
- event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
- event.order_failed(), event.considered(), 1UL << event.defer_shift());
- return std::string(line);
-}
-
-std::string FormatMmCompactionEnd(const MmCompactionEndFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_end: zone_start=0x%llx migrate_pfn=0x%llx "
- "free_pfn=0x%llx zone_end=0x%llx, mode=%s status=%s\\n",
- event.zone_start(), event.migrate_pfn(), event.free_pfn(),
- event.zone_end(), event.sync() ? "sync" : "aysnc",
- MmCompactionRetArray[event.status()]);
- return std::string(line);
-}
-
-std::string FormatMmCompactionFinished(
- const MmCompactionFinishedFtraceEvent& event) {
- char line[2048];
- sprintf(line, "mm_compaction_finished: node=%d zone=%-8s order=%d ret=%s\\n",
- event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
- MmCompactionRetArray[event.ret()]);
- return std::string(line);
-}
-
-std::string FormatMmCompactionIsolateFreepages(
- const MmCompactionIsolateFreepagesFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_isolate_freepages: range=(0x%llx ~ 0x%llx) "
- "nr_scanned=%llu nr_taken=%llu\\n",
- event.start_pfn(), event.end_pfn(), event.nr_scanned(),
- event.nr_taken());
- return std::string(line);
-}
-
-std::string FormatMmCompactionIsolateMigratepages(
- const MmCompactionIsolateMigratepagesFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_isolate_migratepages: range=(0x%llx ~ 0x%llx) "
- "nr_scanned=%llu nr_taken=%llu\\n",
- event.start_pfn(), event.end_pfn(), event.nr_scanned(),
- event.nr_taken());
- return std::string(line);
-}
-
-std::string FormatMmCompactionKcompactdSleep(
- const MmCompactionKcompactdSleepFtraceEvent& event) {
- char line[2048];
- sprintf(line, "mm_compaction_kcompactd_sleep: nid=%d\\n", event.nid());
- return std::string(line);
-}
-
-std::string FormatMmCompactionKcompactdWake(
- const MmCompactionKcompactdWakeFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_kcompactd_wake: nid=%d order=%d classzone_idx=%-8s\\n",
- event.nid(), event.order(),
- MmCompactionSuitableArray[event.classzone_idx()]);
- return std::string(line);
-}
-
-std::string FormatMmCompactionMigratepages(
- const MmCompactionMigratepagesFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "mm_compaction_migratepages: nr_migrated=%llu nr_failed=%llu\\n",
- event.nr_migrated(), event.nr_failed());
- return std::string(line);
-}
-
-std::string FormatMmCompactionSuitable(
- const MmCompactionSuitableFtraceEvent& event) {
- char line[2048];
- sprintf(line, "mm_compaction_suitable: node=%d zone=%-8s order=%d ret=%s\\n",
- event.nid(), MmCompactionSuitableArray[event.idx()], event.order(),
- MmCompactionRetArray[event.ret()]);
- return std::string(line);
-}
-
-std::string FormatMmCompactionTryToCompactPages(
- const MmCompactionTryToCompactPagesFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "mm_compaction_try_to_compact_pages: order=%d gfp_mask=0x%x mode=%d\\n",
- event.order(), event.gfp_mask(),
- event.mode()); // convert to int?
- return std::string(line);
-}
-
-std::string FormatMmCompactionWakeupKcompactd(
- const MmCompactionWakeupKcompactdFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "mm_compaction_wakeup_kcompactd: nid=%d order=%d classzone_idx=%-8s\\n",
- event.nid(), event.order(),
- MmCompactionSuitableArray[event.classzone_idx()]);
- return std::string(line);
-}
-
-std::string FormatSuspendResume(const SuspendResumeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "suspend_resume: %s[%u] %s\\n", event.action().c_str(),
- event.val(), event.start() ? "begin" : "end");
- return std::string(line);
-}
-
-std::string FormatSchedWakeupNew(const SchedWakeupNewFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sched_wakeup_new: comm=%s pid=%d prio=%d target_cpu=%03d\\n",
- event.comm().c_str(), event.pid(), event.prio(), event.target_cpu());
- return std::string(line);
-}
-
-std::string FormatSchedProcessExec(const SchedProcessExecFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sched_process_exec: filename=%s pid=%d old_pid=%d\\n",
- event.filename().c_str(), event.pid(), event.old_pid());
- return std::string(line);
-}
-std::string FormatSchedProcessExit(const SchedProcessExitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sched_process_exit: comm=%s pid=%d tgid=%d prio=%d\\n",
- event.comm().c_str(), event.pid(), event.tgid(), event.prio());
- return std::string(line);
-}
-std::string FormatSchedProcessFork(const SchedProcessForkFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "sched_process_fork: parent_comm=%s parent_pid=%d child_comm=%s "
- "child_pid=%d\\n",
- event.parent_comm().c_str(), event.parent_pid(),
- event.child_comm().c_str(), event.child_pid());
- return std::string(line);
-}
-std::string FormatSchedProcessFree(const SchedProcessFreeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sched_process_free: comm=%s pid=%d prio=%d\\n",
- event.comm().c_str(), event.pid(), event.prio());
- return std::string(line);
-}
-std::string FormatSchedProcessHang(const SchedProcessHangFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sched_process_hang: comm=%s pid=%d\\n", event.comm().c_str(),
- event.pid());
- return std::string(line);
-}
-
-std::string FormatSchedProcessWait(const SchedProcessWaitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "sched_process_wait: comm=%s pid=%d\\n", event.comm().c_str(),
- event.pid());
- return std::string(line);
-}
-
-std::string FormatTaskNewtask(const TaskNewtaskFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "task_newtask: comm=%s pid=%d clone_flags=%llu oom_score_adj=%d\\n",
- event.comm().c_str(), event.pid(), event.clone_flags(),
- event.oom_score_adj());
- return std::string(line);
-}
-
-std::string FormatTaskRename(const TaskRenameFtraceEvent& event) {
- char line[2048];
- sprintf(line, "task_rename: pid=%d oldcomm=%s newcomm=%s oom_score_adj=%d\\n",
- event.pid(), event.newcomm().c_str(), event.oldcomm().c_str(),
- event.oom_score_adj());
- return std::string(line);
-}
-
-std::string FormatBlockBioBackmerge(const BlockBioBackmergeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_bio_backmerge: %d,%d %s %llu + %u [%s]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockBioBounce(const BlockBioBounceFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "block_bio_bounce:"
- "%d,%d %s %llu + %u [%s]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockBioComplete(const BlockBioCompleteFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_bio_complete: %d,%d %s %llu + %u [%d]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(), event.error());
- return std::string(line);
-}
-
-std::string FormatBlockBioFrontmerge(
- const BlockBioFrontmergeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_bio_frontmerge: %d,%d %s %llu + %u [%s]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockBioQueue(const BlockBioQueueFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_bio_queue: %d,%d %s %llu + %u [%s]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockBioRemap(const BlockBioRemapFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_bio_remap: %d,%d %s %llu + %u <- (%d,%d) %llu\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- major(event.dev()), minor(event.dev()),
- (unsigned long long)event.old_sector());
- return std::string(line);
-}
-
-std::string FormatBlockDirtyBuffer(const BlockDirtyBufferFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_dirty_buffer: %d,%d sector=%llu size=%zu\\n",
- major(event.dev()), minor(event.dev()),
- (unsigned long long)event.sector(), (unsigned long)event.size());
- return std::string(line);
-}
-
-std::string FormatBlockGetrq(const BlockGetrqFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_getrq: %d,%d %s %llu + %u [%s]\\n", major(event.dev()),
- minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockPlug(const BlockPlugFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_plug: comm=[%s]\\n", event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockRqAbort(const BlockRqAbortFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_rq_abort: %d,%d %s (%s) %llu + %u [%d]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- event.cmd().c_str(), (unsigned long long)event.sector(),
- event.nr_sector(), event.errors());
- return std::string(line);
-}
-
-std::string FormatBlockRqComplete(const BlockRqCompleteFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_rq_complete: %d,%d %s (%s) %llu + %u [%d]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- event.cmd().c_str(), (unsigned long long)event.sector(),
- event.nr_sector(), event.errors());
- return std::string(line);
-}
-
-std::string FormatBlockRqInsert(const BlockRqInsertFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_rq_insert: %d,%d %s %u (%s) %llu + %u [%s]\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- event.bytes(), event.cmd().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockRqRemap(const BlockRqRemapFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_rq_remap: %d,%d %s %llu + %u <- (%d,%d) %llu %u\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- major(event.dev()), minor(event.dev()),
- (unsigned long long)event.old_sector(), event.nr_bios());
- return std::string(line);
-}
-
-std::string FormatBlockRqRequeue(const BlockRqRequeueFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_rq_requeue: %d,%d %s (%s) %llu + %u [%d\\n",
- major(event.dev()), minor(event.dev()), event.rwbs().c_str(),
- event.cmd().c_str(), (unsigned long long)event.sector(),
- event.nr_sector(), event.errors());
- return std::string(line);
-}
-
-std::string FormatBlockSleeprq(const BlockSleeprqFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_sleeprq: %d,%d %s %llu + %u [%s]\\n", major(event.dev()),
- minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(), event.nr_sector(),
- event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockSplit(const BlockSplitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_split: %d,%d %s %llu / %llu [%s]\\n", major(event.dev()),
- minor(event.dev()), event.rwbs().c_str(),
- (unsigned long long)event.sector(),
- (unsigned long long)event.new_sector(), event.comm().c_str());
- return std::string(line);
-}
-
-std::string FormatBlockTouchBuffer(const BlockTouchBufferFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_touch_buffer: %d,%d sector=%llu size=%zu\\n",
- major(event.dev()), minor(event.dev()),
- (unsigned long long)event.sector(), (unsigned long)event.size());
- return std::string(line);
-}
-
-std::string FormatBlockUnplug(const BlockUnplugFtraceEvent& event) {
- char line[2048];
- sprintf(line, "block_unplug: [%s] %d\\n", event.comm().c_str(),
- event.nr_rq());
- return std::string(line);
-}
-
-std::string FormatExt4AllocDaBlocks(const Ext4AllocDaBlocksFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_alloc_da_blocks: dev %d,%d ino %lu data_blocks %u meta_blocks "
- "%u \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.data_blocks(), event.meta_blocks());
- return std::string(line);
-}
-
-std::string FormatExt4AllocateBlocks(
- const Ext4AllocateBlocksFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_allocate_blocks: dev %d,%d ino %lu flags %s len %u block %llu "
- "lblk %u goal %llu lleft %u lright %u pleft %llu pright %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- GetExt4HintFlag(event.flags()), event.len(), event.block(),
- event.logical(), event.goal(), event.lleft(), event.lright(),
- event.pleft(), event.pright());
- return std::string(line);
-}
-
-std::string FormatExt4AllocateInode(const Ext4AllocateInodeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_allocate_inode: dev %d,%d ino %lu dir %lu mode 0%o\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long)event.dir(), event.mode());
- return std::string(line);
-}
-
-std::string FormatExt4BeginOrderedTruncate(
- const Ext4BeginOrderedTruncateFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_begin_ordered_truncate: dev %d,%d ino %lu new_size %lld\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.new_size());
- return std::string(line);
-}
-
-std::string FormatExt4CollapseRange(const Ext4CollapseRangeFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_collapse_range: dev %d,%d ino %lu offset %lld len %lld\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.offset(), event.len());
- return std::string(line);
-}
-
-std::string FormatExt4DaReleaseSpace(
- const Ext4DaReleaseSpaceFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_da_release_space: dev %d,%d ino %lu mode 0%o i_blocks %llu "
- "freed_blocks %d reserved_data_blocks %d reserved_meta_blocks %d "
- "allocated_meta_blocks %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.mode(), event.i_blocks(), event.freed_blocks(),
- event.reserved_data_blocks(), event.reserved_meta_blocks(),
- event.allocated_meta_blocks());
- return std::string(line);
-}
-
-std::string FormatExt4DaReserveSpace(
- const Ext4DaReserveSpaceFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_da_reserve_space:dev %d,%d ino %lu mode 0%o i_blocks %llu "
- "reserved_data_blocks %d reserved_meta_blocks %d \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.mode(), event.i_blocks(), event.reserved_data_blocks(),
- event.reserved_meta_blocks());
- return std::string(line);
-}
-
-std::string FormatExt4DaUpdateReserveSpace(
- const Ext4DaUpdateReserveSpaceFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_da_update_reserve_space: dev %d,%d ino %lu mode 0%o i_blocks "
- "%llu used_blocks %d reserved_data_blocks %d reserved_meta_blocks %d "
- "allocated_meta_blocks %d quota_claim %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.mode(), event.i_blocks(), event.used_blocks(),
- event.reserved_data_blocks(), event.reserved_meta_blocks(),
- event.allocated_meta_blocks(), event.quota_claim());
- return std::string(line);
-}
-
-std::string FormatExt4DaWritePages(const Ext4DaWritePagesFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_da_write_pages: dev %d,%d ino %lu first_page %lu nr_to_write "
- "%ld sync_mode %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long)event.first_page(), (long)event.nr_to_write(),
- event.sync_mode());
- return std::string(line);
-}
-
-// TODO(hjd): Check flags
-std::string FormatExt4DaWritePagesExtent(
- const Ext4DaWritePagesExtentFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_da_write_pages_extent: dev %d,%d ino %lu lblk %llu len %u \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.len());
- return std::string(line);
-}
-
-std::string FormatExt4DiscardBlocks(const Ext4DiscardBlocksFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_discard_blocks: dev %d,%d blk %llu count %llu\\n",
- major(event.dev()), minor(event.dev()), event.blk(), event.count());
- return std::string(line);
-}
-
-std::string FormatExt4DiscardPreallocations(
- const Ext4DiscardPreallocationsFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_discard_preallocations: dev %d,%d ino %lu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino());
- return std::string(line);
-}
-
-std::string FormatExt4DropInode(const Ext4DropInodeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_drop_inode: dev %d,%d ino %lu drop %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.drop());
- return std::string(line);
-}
-
-// TODO(hjd): Check Es status flags
-std::string FormatExt4EsCacheExtent(const Ext4EsCacheExtentFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_es_cache_extent: dev %d,%d ino %lu es [%u/%u) mapped %llu \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.len(), event.pblk());
- return std::string(line);
-}
-
-std::string FormatExt4EsFindDelayedExtentRangeEnter(
- const Ext4EsFindDelayedExtentRangeEnterFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_es_find_delayed_extent_range_enter: dev %d,%d ino %lu lblk %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk());
- return std::string(line);
-}
-
-// TODO(hjd): Check Es status flags
-std::string FormatExt4EsFindDelayedExtentRangeExit(
- const Ext4EsFindDelayedExtentRangeExitFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_es_find_delayed_extent_range_exit: dev %d,%d ino %lu es "
- "[%u/%u) mapped %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.len(), event.pblk());
- return std::string(line);
-}
-
-// TODO(hjd): Check Es status flags
-std::string FormatExt4EsInsertExtent(
- const Ext4EsInsertExtentFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_es_insert_extent: dev %d,%d ino %lu es [%u/%u) mapped %llu \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.len(), event.pblk());
- return std::string(line);
-}
-
-std::string FormatExt4EsLookupExtentEnter(
- const Ext4EsLookupExtentEnterFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_es_lookup_extent_enter: dev %d,%d ino %lu lblk %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk());
- return std::string(line);
-}
-
-// TODO(hjd): Check Es status flags
-std::string FormatExt4EsLookupExtentExit(
- const Ext4EsLookupExtentExitFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_es_lookup_extent_exit: dev %d,%d ino %lu found %d [%u/%u) %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.found(), event.lblk(), event.len(),
- event.found() ? event.pblk() : 0);
- return std::string(line);
-}
-
-std::string FormatExt4EsRemoveExtent(
- const Ext4EsRemoveExtentFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_es_remove_extent: dev %d,%d ino %lu es [%lld/%lld)\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.len());
- return std::string(line);
-}
-
-std::string FormatExt4EsShrink(const Ext4EsShrinkFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_es_shrink: dev %d,%d nr_shrunk %d, scan_time %llu nr_skipped "
- "%d retried %d\\n",
- major(event.dev()), minor(event.dev()), event.nr_shrunk(),
- event.scan_time(), event.nr_skipped(), event.retried());
- return std::string(line);
-}
-
-std::string FormatExt4EsShrinkCount(const Ext4EsShrinkCountFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_es_shrink_count: dev %d,%d nr_to_scan %d cache_cnt %d\\n",
- major(event.dev()), minor(event.dev()), event.nr_to_scan(),
- event.cache_cnt());
- return std::string(line);
-}
-
-std::string FormatExt4EsShrinkScanEnter(
- const Ext4EsShrinkScanEnterFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_es_shrink_scan_enter: dev %d,%d nr_to_scan %d cache_cnt %d\\n",
- major(event.dev()), minor(event.dev()), event.nr_to_scan(),
- event.cache_cnt());
- return std::string(line);
-}
-
-std::string FormatExt4EsShrinkScanExit(
- const Ext4EsShrinkScanExitFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_es_shrink_scan_exit: dev %d,%d nr_shrunk %d cache_cnt %d\\n",
- major(event.dev()), minor(event.dev()), event.nr_shrunk(),
- event.cache_cnt());
- return std::string(line);
-}
-
-std::string FormatExt4EvictInode(const Ext4EvictInodeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_evict_inode: dev %d,%d ino %lu nlink %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.nlink());
- return std::string(line);
-}
-
-std::string FormatExt4ExtConvertToInitializedEnter(
- const Ext4ExtConvertToInitializedEnterFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_ext_convert_to_initialized_enter: dev %d,%d ino %lu m_lblk %u "
- "m_len %u u_lblk %u u_len %u u_pblk %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.m_lblk(), event.m_len(), event.u_lblk(), event.u_len(),
- event.u_pblk());
- return std::string(line);
-}
-
-std::string FormatExt4ExtConvertToInitializedFastpath(
- const Ext4ExtConvertToInitializedFastpathFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_ext_convert_to_initialized_fastpath: dev %d,%d ino %lu m_lblk "
- "%u m_len %u u_lblk %u u_len %u u_pblk %llu i_lblk %u i_len %u "
- "i_pblk %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.m_lblk(), event.m_len(), event.u_lblk(), event.u_len(),
- event.u_pblk(), event.i_lblk(), event.i_len(), event.i_pblk());
- return std::string(line);
-}
-
-std::string FormatExt4ExtHandleUnwrittenExtents(
- const Ext4ExtHandleUnwrittenExtentsFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_ext_handle_unwritten_extents: dev %d,%d ino %lu m_lblk %u "
- "m_pblk %llu m_len %u flags %s allocated %d newblock %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.lblk(), (unsigned long long)event.pblk(), event.len(),
- GetExt4ExtFlag(event.flags()), (unsigned int)event.allocated(),
- (unsigned long long)event.newblk());
- return std::string(line);
-}
-
-std::string FormatExt4ExtInCache(const Ext4ExtInCacheFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_ext_in_cache: dev %d,%d ino %lu lblk %u ret %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.lblk(), event.ret());
- return std::string(line);
-}
-
-std::string FormatExt4ExtLoadExtent(const Ext4ExtLoadExtentFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_ext_load_extent: dev %d,%d ino %lu lblk %u pblk %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.pblk());
- return std::string(line);
-}
-
-std::string FormatExt4ExtMapBlocksEnter(
- const Ext4ExtMapBlocksEnterFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_ext_map_blocks_enter: dev %d,%d ino %lu lblk %u len %u flags %s\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.len(), GetExt4ExtFlag(event.flags()));
- return std::string(line);
-}
-
-std::string FormatExt4ExtMapBlocksExit(
- const Ext4ExtMapBlocksExitFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_ext_map_blocks_exit: dev %d,%d ino %lu lblk %u pblk %llu len "
- "%u flags %x ret %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.pblk(), event.len(), event.flags(), event.ret());
- return std::string(line);
-}
-
-std::string FormatExt4ExtPutInCache(const Ext4ExtPutInCacheFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_ext_put_in_cache: dev %d,%d ino %lu lblk %u len %u start %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.lblk(), event.len(), (unsigned long long)event.start());
- return std::string(line);
-}
-
-std::string FormatExt4ExtRemoveSpace(
- const Ext4ExtRemoveSpaceFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_ext_remove_space: dev %d,%d ino %lu since %u end %u depth %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.start(), (unsigned)event.end(), event.depth());
- return std::string(line);
-}
-
-std::string FormatExt4ExtRemoveSpaceDone(
- const Ext4ExtRemoveSpaceDoneFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_ext_remove_space_done: dev %d,%d ino %lu since %u end %u depth "
- "%d partial %lld remaining_entries %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.start(), (unsigned)event.end(), event.depth(),
- (long long)event.partial(), (unsigned short)event.eh_entries());
- return std::string(line);
-}
-
-std::string FormatExt4ExtRmIdx(const Ext4ExtRmIdxFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_ext_rm_idx: dev %d,%d ino %lu index_pblk %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long long)event.pblk());
- return std::string(line);
-}
-
-std::string FormatExt4ExtRmLeaf(const Ext4ExtRmLeafFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_ext_rm_leaf: dev %d,%d ino %lu start_lblk %u last_extent "
- "[%u(%llu), %u]partial_cluster %lld\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.start(), (unsigned)event.ee_lblk(),
- (unsigned long long)event.ee_pblk(), (unsigned short)event.ee_len(),
- (long long)event.partial());
- return std::string(line);
-}
-
-std::string FormatExt4ExtShowExtent(const Ext4ExtShowExtentFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_ext_show_extent: dev %d,%d ino %lu lblk %u pblk %llu len %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.lblk(), (unsigned long long)event.pblk(),
- (unsigned short)event.len());
- return std::string(line);
-}
-
-std::string FormatExt4FallocateEnter(
- const Ext4FallocateEnterFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_fallocate_enter: dev %d,%d ino %lu offset %lld len %lld mode %s\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
- return std::string(line);
-}
-
-std::string FormatExt4FallocateExit(const Ext4FallocateExitFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_fallocate_exit: dev %d,%d ino %lu pos %lld blocks %u ret %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.pos(), event.blocks(), event.ret());
- return std::string(line);
-}
-
-std::string FormatExt4FindDelallocRange(
- const Ext4FindDelallocRangeFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_find_delalloc_range: dev %d,%d ino %lu from %u to %u reverse "
- "%d found %d (blk = %u)\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.from(), (unsigned)event.to(), event.reverse(),
- event.found(), (unsigned)event.found_blk());
- return std::string(line);
-}
-
-std::string FormatExt4Forget(const Ext4ForgetFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_forget: dev %d,%d ino %lu mode 0%o is_metadata %d block %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.mode(), event.is_metadata(), event.block());
- return std::string(line);
-}
-
-std::string FormatExt4FreeBlocks(const Ext4FreeBlocksFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_free_blocks: dev %d,%d ino %lu mode 0%o block %llu count %lu "
- "flags %s\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.mode(), event.block(), (unsigned long)event.count(),
- GetExt4FreeBlocksFlag(event.flags()));
- return std::string(line);
-}
-
-std::string FormatExt4FreeInode(const Ext4FreeInodeFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_free_inode: dev %d,%d ino %lu mode 0%o uid %u gid %u blocks "
- "%llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.mode(), event.uid(), event.gid(), event.blocks());
- return std::string(line);
-}
-
-std::string FormatExt4GetImpliedClusterAllocExit(
- const Ext4GetImpliedClusterAllocExitFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_get_implied_cluster_alloc_exit: dev %d,%d m_lblk %u m_pblk "
- "%llu m_len %u m_flags %u ret %d\\n",
- major(event.dev()), minor(event.dev()), event.lblk(),
- (unsigned long long)event.pblk(), event.len(), event.flags(),
- event.ret());
- return std::string(line);
-}
-
-std::string FormatExt4GetReservedClusterAlloc(
- const Ext4GetReservedClusterAllocFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_get_reserved_cluster_alloc: dev %d,%d ino %lu lblk %u len %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.lblk(), event.len());
- return std::string(line);
-}
-
-std::string FormatExt4IndMapBlocksEnter(
- const Ext4IndMapBlocksEnterFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_ind_map_blocks_enter: dev %d,%d ino %lu lblk %u len %u flags %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.len(), event.flags());
- return std::string(line);
-}
-
-std::string FormatExt4IndMapBlocksExit(
- const Ext4IndMapBlocksExitFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_ind_map_blocks_exit: dev %d,%d ino %lu lblk %u pblk %llu len "
- "%u flags %x ret %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.lblk(), event.pblk(), event.len(), event.flags(), event.ret());
- return std::string(line);
-}
-
-std::string FormatExt4InsertRange(const Ext4InsertRangeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_insert_range: dev %d,%d ino %lu offset %lld len %lld\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.offset(), event.len());
- return std::string(line);
-}
-
-std::string FormatExt4Invalidatepage(
- const Ext4InvalidatepageFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_invalidatepage: dev %d,%d ino %lu page_index %lu offset %u "
- "length %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long)event.index(), event.offset(), event.length());
- return std::string(line);
-}
-
-std::string FormatExt4JournalStart(const Ext4JournalStartFtraceEvent& event) {
- char line[2048];
- sprintf(
- line,
- "ext4_journal_start: dev %d,%d blocks, %d rsv_blocks, %d caller %pS\\n",
- major(event.dev()), minor(event.dev()), event.blocks(),
- event.rsv_blocks(), (void*)event.ip());
- return std::string(line);
-}
-
-std::string FormatExt4JournalStartReserved(
- const Ext4JournalStartReservedFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_journal_start_reserved: dev %d,%d blocks, %d caller %pS\\n",
- major(event.dev()), minor(event.dev()), event.blocks(),
- (void*)event.ip());
- return std::string(line);
-}
-
-std::string FormatExt4JournalledInvalidatepage(
- const Ext4JournalledInvalidatepageFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_journalled_invalidatepage: dev %d,%d ino %lu page_index %lu "
- "offset %u length %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long)event.index(), event.offset(), event.length());
- return std::string(line);
-}
-
-std::string FormatExt4JournalledWriteEnd(
- const Ext4JournalledWriteEndFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_journalled_write_end: dev %d,%d ino %lu pos %lld len %u copied "
- "%u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.pos(), event.len(), event.copied());
- return std::string(line);
-}
-
-std::string FormatExt4LoadInode(const Ext4LoadInodeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_load_inode: dev %d,%d ino %ld\\n", major(event.dev()),
- minor(event.dev()), (unsigned long)event.ino());
- return std::string(line);
-}
-
-std::string FormatExt4LoadInodeBitmap(
- const Ext4LoadInodeBitmapFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_load_inode_bitmap: dev %d,%d group %u\\n",
- major(event.dev()), minor(event.dev()), event.group());
- return std::string(line);
-}
-
-std::string FormatExt4MarkInodeDirty(
- const Ext4MarkInodeDirtyFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_mark_inode_dirty: dev %d,%d ino %lu caller %pS\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (void*)event.ip());
- return std::string(line);
-}
-
-std::string FormatExt4MbBitmapLoad(const Ext4MbBitmapLoadFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_mb_bitmap_load: dev %d,%d group %u\\n",
- major(event.dev()), minor(event.dev()), event.group());
- return std::string(line);
-}
-
-std::string FormatExt4MbBuddyBitmapLoad(
- const Ext4MbBuddyBitmapLoadFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_mb_buddy_bitmap_load: dev %d,%d group %u\\n",
- major(event.dev()), minor(event.dev()), event.group());
- return std::string(line);
-}
-
-std::string FormatExt4MbDiscardPreallocations(
- const Ext4MbDiscardPreallocationsFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_mb_discard_preallocations: dev %d,%d needed %d\\n",
- major(event.dev()), minor(event.dev()), event.needed());
- return std::string(line);
-}
-
-std::string FormatExt4MbNewGroupPa(const Ext4MbNewGroupPaFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_mb_new_group_pa: dev %d,%d ino %lu pstart %llu len %u lstart "
- "%llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.pa_pstart(), event.pa_len(), event.pa_lstart());
- return std::string(line);
-}
-
-std::string FormatExt4MbNewInodePa(const Ext4MbNewInodePaFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_mb_new_inode_pa: dev %d,%d ino %lu pstart %llu len %u lstart "
- "%llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.pa_pstart(), event.pa_len(), event.pa_lstart());
- return std::string(line);
-}
-
-std::string FormatExt4MbReleaseGroupPa(
- const Ext4MbReleaseGroupPaFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_mb_release_group_pa: dev %d,%d pstart %llu len %u\\n",
- major(event.dev()), minor(event.dev()), event.pa_pstart(),
- event.pa_len());
- return std::string(line);
-}
-
-std::string FormatExt4MbReleaseInodePa(
- const Ext4MbReleaseInodePaFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_mb_release_inode_pa: dev %d,%d ino %lu block %llu count %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.block(), event.count());
- return std::string(line);
-}
-
-std::string FormatExt4MballocAlloc(const Ext4MballocAllocFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_mballoc_alloc: dev %d,%d inode %lu orig %u/%d/%u@%u goal "
- "%u/%d/%u@%u result %u/%d/%u@%u blks %u grps %u cr %u flags %s tail "
- "%u broken %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.orig_group(), event.orig_start(), event.orig_len(),
- event.orig_logical(), event.goal_group(), event.goal_start(),
- event.goal_len(), event.goal_logical(), event.result_group(),
- event.result_start(), event.result_len(), event.result_logical(),
- event.found(), event.groups(), event.cr(),
- GetExt4HintFlag(event.flags()), event.tail(),
- event.buddy() ? 1 << event.buddy() : 0);
- return std::string(line);
-}
-
-std::string FormatExt4MballocDiscard(
- const Ext4MballocDiscardFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_mballoc_discard: dev %d,%d inode %lu extent %u/%d/%d \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.result_group(), event.result_start(), event.result_len());
- return std::string(line);
-}
-
-std::string FormatExt4MballocFree(const Ext4MballocFreeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_mballoc_free: dev %d,%d inode %lu extent %u/%d/%d \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.result_group(), event.result_start(), event.result_len());
- return std::string(line);
-}
-
-std::string FormatExt4MballocPrealloc(
- const Ext4MballocPreallocFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_mballoc_prealloc: dev %d,%d inode %lu orig %u/%d/%u@%u result "
- "%u/%d/%u@%u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.orig_group(), event.orig_start(), event.orig_len(),
- event.orig_logical(), event.result_group(), event.result_start(),
- event.result_len(), event.result_logical());
- return std::string(line);
-}
-
-std::string FormatExt4OtherInodeUpdateTime(
- const Ext4OtherInodeUpdateTimeFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_other_inode_update_time: dev %d,%d orig_ino %lu ino %lu mode "
- "0%o uid %u gid %u\\n",
- major(event.dev()), minor(event.dev()),
- (unsigned long)event.orig_ino(), (unsigned long)event.ino(),
- event.mode(), event.uid(), event.gid());
- return std::string(line);
-}
-
-std::string FormatExt4PunchHole(const Ext4PunchHoleFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_punch_hole: dev %d,%d ino %lu offset %lld len %lld mode %s\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
- return std::string(line);
-}
-
-std::string FormatExt4ReadBlockBitmapLoad(
- const Ext4ReadBlockBitmapLoadFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_read_block_bitmap_load: dev %d,%d group %u\\n",
- major(event.dev()), minor(event.dev()), event.group());
- return std::string(line);
-}
-
-std::string FormatExt4Readpage(const Ext4ReadpageFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_readpage: dev %d,%d ino %lu page_index %lu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long)event.index());
- return std::string(line);
-}
-
-std::string FormatExt4Releasepage(const Ext4ReleasepageFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_releasepage: dev %d,%d ino %lu page_index %lu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long)event.index());
- return std::string(line);
-}
-
-std::string FormatExt4RemoveBlocks(const Ext4RemoveBlocksFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_remove_blocks: dev %d,%d ino %lu extent [%u(%llu), %u]from %u "
- "to %u partial_cluster %lld\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned)event.ee_lblk(), (unsigned long long)event.ee_pblk(),
- (unsigned short)event.ee_len(), (unsigned)event.from(),
- (unsigned)event.to(), (long long)event.partial());
- return std::string(line);
-}
-
-std::string FormatExt4RequestBlocks(const Ext4RequestBlocksFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_request_blocks: dev %d,%d ino %lu flags %s len %u lblk %u goal "
- "%llu lleft %u lright %u pleft %llu pright %llu \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- GetExt4HintFlag(event.flags()), event.len(), event.logical(),
- event.goal(), event.lleft(), event.lright(), event.pleft(),
- event.pright());
- return std::string(line);
-}
-
-std::string FormatExt4RequestInode(const Ext4RequestInodeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_request_inode: dev %d,%d dir %lu mode 0%o\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.dir(),
- event.mode());
- return std::string(line);
-}
-
-std::string FormatExt4SyncFs(const Ext4SyncFsFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_sync_fs: dev %d,%d wait %d\\n", major(event.dev()),
- minor(event.dev()), event.wait());
- return std::string(line);
-}
-
-std::string FormatExt4TrimAllFree(const Ext4TrimAllFreeFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_trim_all_free: dev %d,%d group %u, start %d, len %d\\n",
- event.dev_major(), event.dev_minor(), event.group(), event.start(),
- event.len());
- return std::string(line);
-}
-
-std::string FormatExt4TrimExtent(const Ext4TrimExtentFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_trim_extent: dev %d,%d group %u, start %d, len %d\\n",
- event.dev_major(), event.dev_minor(), event.group(), event.start(),
- event.len());
- return std::string(line);
-}
-
-std::string FormatExt4TruncateEnter(const Ext4TruncateEnterFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_truncate_enter: dev %d,%d ino %lu blocks %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.blocks());
- return std::string(line);
-}
-
-std::string FormatExt4TruncateExit(const Ext4TruncateExitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_truncate_exit: dev %d,%d ino %lu blocks %llu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.blocks());
- return std::string(line);
-}
-
-std::string FormatExt4UnlinkEnter(const Ext4UnlinkEnterFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_unlink_enter: dev %d,%d ino %lu size %lld parent %lu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.size(), (unsigned long)event.parent());
- return std::string(line);
-}
-
-std::string FormatExt4UnlinkExit(const Ext4UnlinkExitFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_unlink_exit: dev %d,%d ino %lu ret %d\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.ret());
- return std::string(line);
-}
-
-std::string FormatExt4WriteBegin(const Ext4WriteBeginFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_write_begin: dev %d,%d ino %lu pos %lld len %u flags %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.pos(), event.len(), event.flags());
- return std::string(line);
-}
-
-std::string FormatExt4WriteEnd(const Ext4WriteEndFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_write_end: %d,%d ino %lu pos %lld len %u copied %u\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.pos(), event.len(), event.copied());
- return std::string(line);
-}
-
-std::string FormatExt4Writepage(const Ext4WritepageFtraceEvent& event) {
- char line[2048];
- sprintf(line, "ext4_writepage: dev %d,%d ino %lu page_index %lu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (unsigned long)event.index());
- return std::string(line);
-}
-
-std::string FormatExt4Writepages(const Ext4WritepagesFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_writepages: dev %d,%d ino %lu nr_to_write %ld pages_skipped "
- "%ld range_start %lld range_end %lld sync_mode %d for_kupdate %d "
- "range_cyclic %d writeback_index %lu\\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- (long)event.nr_to_write(), (long)event.pages_skipped(),
- event.range_start(), event.range_end(), event.sync_mode(),
- event.for_kupdate(), event.range_cyclic(),
- (unsigned long)event.writeback_index());
- return std::string(line);
-}
-
-std::string FormatExt4WritepagesResult(
- const Ext4WritepagesResultFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_writepages_result: dev %d,%d ino %lu ret %d pages_written %d "
- "pages_skipped %ld sync_mode %d writeback_index %lu \\n",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.ret(), event.pages_written(), (long)event.pages_skipped(),
- event.sync_mode(), (unsigned long)event.writeback_index());
- return std::string(line);
-}
-
-std::string FormatExt4ZeroRange(const Ext4ZeroRangeFtraceEvent& event) {
- char line[2048];
- sprintf(line,
- "ext4_zero_range: dev %d,%d ino %lu offset %lld len %lld mode %s\\n ",
- major(event.dev()), minor(event.dev()), (unsigned long)event.ino(),
- event.offset(), event.len(), GetExt4ModeFlag(event.mode()));
- return std::string(line);
-}
-
// TODO(taylori): Confirm correct format for this.
// Calling this breaks loading into chrome://tracing
std::string FormatProcess(const Process& process) {
@@ -2193,8 +175,9 @@
return output;
}
-int TraceToSystrace(std::istream* input, std::ostream* output) {
- std::multimap<uint64_t, std::string> sorted;
+void ForEachPacketInTrace(
+ std::istream* input,
+ const std::function<void(const protos::TracePacket&)>& f) {
size_t bytes_processed = 0;
// The trace stream can be very large. We cannot just pass it in one go to
// libprotobuf as that will refuse to parse messages > 64MB. However we know
@@ -2233,562 +216,26 @@
protos::TracePacket packet;
PERFETTO_CHECK(packet.ParseFromArray(buf.get(), field_size));
+ f(packet);
+ }
+}
+
+int TraceToSystrace(std::istream* input, std::ostream* output) {
+ std::multimap<uint64_t, std::string> sorted;
+
+ ForEachPacketInTrace(input, [&sorted](const protos::TracePacket& packet) {
if (!packet.has_ftrace_events())
- continue;
+ return;
const FtraceEventBundle& bundle = packet.ftrace_events();
for (const FtraceEvent& event : bundle.event()) {
- std::string line;
- if (event.has_binder_lock()) {
- const auto& inner = event.binder_lock();
- line = FormatBinderLock(inner);
- } else if (event.has_binder_locked()) {
- const auto& inner = event.binder_locked();
- line = FormatBinderLocked(inner);
- } else if (event.has_binder_transaction()) {
- const auto& inner = event.binder_transaction();
- line = FormatBinderTransaction(inner);
- } else if (event.has_binder_transaction_received()) {
- const auto& inner = event.binder_transaction_received();
- line = FormatBinderTransactionReceived(inner);
- } else if (event.has_binder_unlock()) {
- const auto& inner = event.binder_unlock();
- line = FormatBinderUnlock(inner);
- } else if (event.has_block_bio_backmerge()) {
- const auto& inner = event.block_bio_backmerge();
- line = FormatBlockBioBackmerge(inner);
- } else if (event.has_block_bio_bounce()) {
- const auto& inner = event.block_bio_bounce();
- line = FormatBlockBioBounce(inner);
- } else if (event.has_block_bio_complete()) {
- const auto& inner = event.block_bio_complete();
- line = FormatBlockBioComplete(inner);
- } else if (event.has_block_bio_frontmerge()) {
- const auto& inner = event.block_bio_frontmerge();
- line = FormatBlockBioFrontmerge(inner);
- } else if (event.has_block_bio_queue()) {
- const auto& inner = event.block_bio_queue();
- line = FormatBlockBioQueue(inner);
- } else if (event.has_block_bio_remap()) {
- const auto& inner = event.block_bio_remap();
- line = FormatBlockBioRemap(inner);
- } else if (event.has_block_dirty_buffer()) {
- const auto& inner = event.block_dirty_buffer();
- line = FormatBlockDirtyBuffer(inner);
- } else if (event.has_block_getrq()) {
- const auto& inner = event.block_getrq();
- line = FormatBlockGetrq(inner);
- } else if (event.has_block_plug()) {
- const auto& inner = event.block_plug();
- line = FormatBlockPlug(inner);
- } else if (event.has_block_rq_abort()) {
- const auto& inner = event.block_rq_abort();
- line = FormatBlockRqAbort(inner);
- } else if (event.has_block_rq_complete()) {
- const auto& inner = event.block_rq_complete();
- line = FormatBlockRqComplete(inner);
- } else if (event.has_block_rq_insert()) {
- const auto& inner = event.block_rq_insert();
- line = FormatBlockRqInsert(inner);
- } else if (event.has_block_rq_issue()) {
- const auto& inner = event.block_rq_issue();
- line = FormatBlockRqIssue(inner);
- } else if (event.has_block_rq_remap()) {
- const auto& inner = event.block_rq_remap();
- line = FormatBlockRqRemap(inner);
- } else if (event.has_block_rq_requeue()) {
- const auto& inner = event.block_rq_requeue();
- line = FormatBlockRqRequeue(inner);
- } else if (event.has_block_sleeprq()) {
- const auto& inner = event.block_sleeprq();
- line = FormatBlockSleeprq(inner);
- } else if (event.has_block_split()) {
- const auto& inner = event.block_split();
- line = FormatBlockSplit(inner);
- } else if (event.has_block_touch_buffer()) {
- const auto& inner = event.block_touch_buffer();
- line = FormatBlockTouchBuffer(inner);
- } else if (event.has_block_unplug()) {
- const auto& inner = event.block_unplug();
- line = FormatBlockUnplug(inner);
- } else if (event.has_mm_compaction_begin()) {
- const auto& inner = event.mm_compaction_begin();
- line = FormatMmCompactionBegin(inner);
- } else if (event.has_mm_compaction_defer_compaction()) {
- const auto& inner = event.mm_compaction_defer_compaction();
- line = FormatMmCompactionDeferCompaction(inner);
- } else if (event.has_mm_compaction_defer_reset()) {
- const auto& inner = event.mm_compaction_defer_reset();
- line = FormatMmCompactionDeferReset(inner);
- } else if (event.has_mm_compaction_deferred()) {
- const auto& inner = event.mm_compaction_deferred();
- line = FormatMmCompactionDeferred(inner);
- } else if (event.has_mm_compaction_end()) {
- const auto& inner = event.mm_compaction_end();
- line = FormatMmCompactionEnd(inner);
- } else if (event.has_mm_compaction_finished()) {
- const auto& inner = event.mm_compaction_finished();
- line = FormatMmCompactionFinished(inner);
- } else if (event.has_mm_compaction_isolate_freepages()) {
- const auto& inner = event.mm_compaction_isolate_freepages();
- line = FormatMmCompactionIsolateFreepages(inner);
- } else if (event.has_mm_compaction_isolate_migratepages()) {
- const auto& inner = event.mm_compaction_isolate_migratepages();
- line = FormatMmCompactionIsolateMigratepages(inner);
- } else if (event.has_mm_compaction_kcompactd_sleep()) {
- const auto& inner = event.mm_compaction_kcompactd_sleep();
- line = FormatMmCompactionKcompactdSleep(inner);
- } else if (event.has_mm_compaction_kcompactd_wake()) {
- const auto& inner = event.mm_compaction_kcompactd_wake();
- line = FormatMmCompactionKcompactdWake(inner);
- } else if (event.has_mm_compaction_migratepages()) {
- const auto& inner = event.mm_compaction_migratepages();
- line = FormatMmCompactionMigratepages(inner);
- } else if (event.has_mm_compaction_suitable()) {
- const auto& inner = event.mm_compaction_suitable();
- line = FormatMmCompactionSuitable(inner);
- } else if (event.has_mm_compaction_try_to_compact_pages()) {
- const auto& inner = event.mm_compaction_try_to_compact_pages();
- line = FormatMmCompactionTryToCompactPages(inner);
- } else if (event.has_mm_compaction_wakeup_kcompactd()) {
- const auto& inner = event.mm_compaction_wakeup_kcompactd();
- line = FormatMmCompactionWakeupKcompactd(inner);
- } else if (event.has_ext4_alloc_da_blocks()) {
- const auto& inner = event.ext4_alloc_da_blocks();
- line = FormatExt4AllocDaBlocks(inner);
- } else if (event.has_ext4_allocate_blocks()) {
- const auto& inner = event.ext4_allocate_blocks();
- line = FormatExt4AllocateBlocks(inner);
- } else if (event.has_ext4_allocate_inode()) {
- const auto& inner = event.ext4_allocate_inode();
- line = FormatExt4AllocateInode(inner);
- } else if (event.has_ext4_begin_ordered_truncate()) {
- const auto& inner = event.ext4_begin_ordered_truncate();
- line = FormatExt4BeginOrderedTruncate(inner);
- } else if (event.has_ext4_collapse_range()) {
- const auto& inner = event.ext4_collapse_range();
- line = FormatExt4CollapseRange(inner);
- } else if (event.has_ext4_da_release_space()) {
- const auto& inner = event.ext4_da_release_space();
- line = FormatExt4DaReleaseSpace(inner);
- } else if (event.has_ext4_da_reserve_space()) {
- const auto& inner = event.ext4_da_reserve_space();
- line = FormatExt4DaReserveSpace(inner);
- } else if (event.has_ext4_da_update_reserve_space()) {
- const auto& inner = event.ext4_da_update_reserve_space();
- line = FormatExt4DaUpdateReserveSpace(inner);
- } else if (event.has_ext4_da_write_begin()) {
- const auto& inner = event.ext4_da_write_begin();
- line = FormatExt4DaWriteBegin(inner);
- } else if (event.has_ext4_da_write_end()) {
- const auto& inner = event.ext4_da_write_end();
- line = FormatExt4DaWriteEnd(inner);
- } else if (event.has_ext4_da_write_pages()) {
- const auto& inner = event.ext4_da_write_pages();
- line = FormatExt4DaWritePages(inner);
- } else if (event.has_ext4_da_write_pages_extent()) {
- const auto& inner = event.ext4_da_write_pages_extent();
- line = FormatExt4DaWritePagesExtent(inner);
- } else if (event.has_ext4_discard_blocks()) {
- const auto& inner = event.ext4_discard_blocks();
- line = FormatExt4DiscardBlocks(inner);
- } else if (event.has_ext4_discard_preallocations()) {
- const auto& inner = event.ext4_discard_preallocations();
- line = FormatExt4DiscardPreallocations(inner);
- } else if (event.has_ext4_drop_inode()) {
- const auto& inner = event.ext4_drop_inode();
- line = FormatExt4DropInode(inner);
- } else if (event.has_ext4_es_cache_extent()) {
- const auto& inner = event.ext4_es_cache_extent();
- line = FormatExt4EsCacheExtent(inner);
- } else if (event.has_ext4_es_find_delayed_extent_range_enter()) {
- const auto& inner = event.ext4_es_find_delayed_extent_range_enter();
- line = FormatExt4EsFindDelayedExtentRangeEnter(inner);
- } else if (event.has_ext4_es_find_delayed_extent_range_exit()) {
- const auto& inner = event.ext4_es_find_delayed_extent_range_exit();
- line = FormatExt4EsFindDelayedExtentRangeExit(inner);
- } else if (event.has_ext4_es_insert_extent()) {
- const auto& inner = event.ext4_es_insert_extent();
- line = FormatExt4EsInsertExtent(inner);
- } else if (event.has_ext4_es_lookup_extent_enter()) {
- const auto& inner = event.ext4_es_lookup_extent_enter();
- line = FormatExt4EsLookupExtentEnter(inner);
- } else if (event.has_ext4_es_lookup_extent_exit()) {
- const auto& inner = event.ext4_es_lookup_extent_exit();
- line = FormatExt4EsLookupExtentExit(inner);
- } else if (event.has_ext4_es_remove_extent()) {
- const auto& inner = event.ext4_es_remove_extent();
- line = FormatExt4EsRemoveExtent(inner);
- } else if (event.has_ext4_es_shrink()) {
- const auto& inner = event.ext4_es_shrink();
- line = FormatExt4EsShrink(inner);
- } else if (event.has_ext4_es_shrink_count()) {
- const auto& inner = event.ext4_es_shrink_count();
- line = FormatExt4EsShrinkCount(inner);
- } else if (event.has_ext4_es_shrink_scan_enter()) {
- const auto& inner = event.ext4_es_shrink_scan_enter();
- line = FormatExt4EsShrinkScanEnter(inner);
- } else if (event.has_ext4_es_shrink_scan_exit()) {
- const auto& inner = event.ext4_es_shrink_scan_exit();
- line = FormatExt4EsShrinkScanExit(inner);
- } else if (event.has_ext4_evict_inode()) {
- const auto& inner = event.ext4_evict_inode();
- line = FormatExt4EvictInode(inner);
- } else if (event.has_ext4_ext_convert_to_initialized_enter()) {
- const auto& inner = event.ext4_ext_convert_to_initialized_enter();
- line = FormatExt4ExtConvertToInitializedEnter(inner);
- } else if (event.has_ext4_ext_convert_to_initialized_fastpath()) {
- const auto& inner = event.ext4_ext_convert_to_initialized_fastpath();
- line = FormatExt4ExtConvertToInitializedFastpath(inner);
- } else if (event.has_ext4_ext_handle_unwritten_extents()) {
- const auto& inner = event.ext4_ext_handle_unwritten_extents();
- line = FormatExt4ExtHandleUnwrittenExtents(inner);
- } else if (event.has_ext4_ext_in_cache()) {
- const auto& inner = event.ext4_ext_in_cache();
- line = FormatExt4ExtInCache(inner);
- } else if (event.has_ext4_ext_load_extent()) {
- const auto& inner = event.ext4_ext_load_extent();
- line = FormatExt4ExtLoadExtent(inner);
- } else if (event.has_ext4_ext_map_blocks_enter()) {
- const auto& inner = event.ext4_ext_map_blocks_enter();
- line = FormatExt4ExtMapBlocksEnter(inner);
- } else if (event.has_ext4_ext_map_blocks_exit()) {
- const auto& inner = event.ext4_ext_map_blocks_exit();
- line = FormatExt4ExtMapBlocksExit(inner);
- } else if (event.has_ext4_ext_put_in_cache()) {
- const auto& inner = event.ext4_ext_put_in_cache();
- line = FormatExt4ExtPutInCache(inner);
- } else if (event.has_ext4_ext_remove_space()) {
- const auto& inner = event.ext4_ext_remove_space();
- line = FormatExt4ExtRemoveSpace(inner);
- } else if (event.has_ext4_ext_remove_space_done()) {
- const auto& inner = event.ext4_ext_remove_space_done();
- line = FormatExt4ExtRemoveSpaceDone(inner);
- } else if (event.has_ext4_ext_rm_idx()) {
- const auto& inner = event.ext4_ext_rm_idx();
- line = FormatExt4ExtRmIdx(inner);
- } else if (event.has_ext4_ext_rm_leaf()) {
- const auto& inner = event.ext4_ext_rm_leaf();
- line = FormatExt4ExtRmLeaf(inner);
- } else if (event.has_ext4_ext_show_extent()) {
- const auto& inner = event.ext4_ext_show_extent();
- line = FormatExt4ExtShowExtent(inner);
- } else if (event.has_ext4_fallocate_enter()) {
- const auto& inner = event.ext4_fallocate_enter();
- line = FormatExt4FallocateEnter(inner);
- } else if (event.has_ext4_fallocate_exit()) {
- const auto& inner = event.ext4_fallocate_exit();
- line = FormatExt4FallocateExit(inner);
- } else if (event.has_ext4_find_delalloc_range()) {
- const auto& inner = event.ext4_find_delalloc_range();
- line = FormatExt4FindDelallocRange(inner);
- } else if (event.has_ext4_forget()) {
- const auto& inner = event.ext4_forget();
- line = FormatExt4Forget(inner);
- } else if (event.has_ext4_free_blocks()) {
- const auto& inner = event.ext4_free_blocks();
- line = FormatExt4FreeBlocks(inner);
- } else if (event.has_ext4_free_inode()) {
- const auto& inner = event.ext4_free_inode();
- line = FormatExt4FreeInode(inner);
- } else if (event.has_ext4_get_implied_cluster_alloc_exit()) {
- const auto& inner = event.ext4_get_implied_cluster_alloc_exit();
- line = FormatExt4GetImpliedClusterAllocExit(inner);
- } else if (event.has_ext4_get_reserved_cluster_alloc()) {
- const auto& inner = event.ext4_get_reserved_cluster_alloc();
- line = FormatExt4GetReservedClusterAlloc(inner);
- } else if (event.has_ext4_ind_map_blocks_enter()) {
- const auto& inner = event.ext4_ind_map_blocks_enter();
- line = FormatExt4IndMapBlocksEnter(inner);
- } else if (event.has_ext4_ind_map_blocks_exit()) {
- const auto& inner = event.ext4_ind_map_blocks_exit();
- line = FormatExt4IndMapBlocksExit(inner);
- } else if (event.has_ext4_insert_range()) {
- const auto& inner = event.ext4_insert_range();
- line = FormatExt4InsertRange(inner);
- } else if (event.has_ext4_invalidatepage()) {
- const auto& inner = event.ext4_invalidatepage();
- line = FormatExt4Invalidatepage(inner);
- } else if (event.has_ext4_journal_start()) {
- const auto& inner = event.ext4_journal_start();
- line = FormatExt4JournalStart(inner);
- } else if (event.has_ext4_journal_start_reserved()) {
- const auto& inner = event.ext4_journal_start_reserved();
- line = FormatExt4JournalStartReserved(inner);
- } else if (event.has_ext4_journalled_invalidatepage()) {
- const auto& inner = event.ext4_journalled_invalidatepage();
- line = FormatExt4JournalledInvalidatepage(inner);
- } else if (event.has_ext4_journalled_write_end()) {
- const auto& inner = event.ext4_journalled_write_end();
- line = FormatExt4JournalledWriteEnd(inner);
- } else if (event.has_ext4_load_inode()) {
- const auto& inner = event.ext4_load_inode();
- line = FormatExt4LoadInode(inner);
- } else if (event.has_ext4_load_inode_bitmap()) {
- const auto& inner = event.ext4_load_inode_bitmap();
- line = FormatExt4LoadInodeBitmap(inner);
- } else if (event.has_ext4_mark_inode_dirty()) {
- const auto& inner = event.ext4_mark_inode_dirty();
- line = FormatExt4MarkInodeDirty(inner);
- } else if (event.has_ext4_mb_bitmap_load()) {
- const auto& inner = event.ext4_mb_bitmap_load();
- line = FormatExt4MbBitmapLoad(inner);
- } else if (event.has_ext4_mb_buddy_bitmap_load()) {
- const auto& inner = event.ext4_mb_buddy_bitmap_load();
- line = FormatExt4MbBuddyBitmapLoad(inner);
- } else if (event.has_ext4_mb_discard_preallocations()) {
- const auto& inner = event.ext4_mb_discard_preallocations();
- line = FormatExt4MbDiscardPreallocations(inner);
- } else if (event.has_ext4_mb_new_group_pa()) {
- const auto& inner = event.ext4_mb_new_group_pa();
- line = FormatExt4MbNewGroupPa(inner);
- } else if (event.has_ext4_mb_new_inode_pa()) {
- const auto& inner = event.ext4_mb_new_inode_pa();
- line = FormatExt4MbNewInodePa(inner);
- } else if (event.has_ext4_mb_release_group_pa()) {
- const auto& inner = event.ext4_mb_release_group_pa();
- line = FormatExt4MbReleaseGroupPa(inner);
- } else if (event.has_ext4_mb_release_inode_pa()) {
- const auto& inner = event.ext4_mb_release_inode_pa();
- line = FormatExt4MbReleaseInodePa(inner);
- } else if (event.has_ext4_mballoc_alloc()) {
- const auto& inner = event.ext4_mballoc_alloc();
- line = FormatExt4MballocAlloc(inner);
- } else if (event.has_ext4_mballoc_discard()) {
- const auto& inner = event.ext4_mballoc_discard();
- line = FormatExt4MballocDiscard(inner);
- } else if (event.has_ext4_mballoc_free()) {
- const auto& inner = event.ext4_mballoc_free();
- line = FormatExt4MballocFree(inner);
- } else if (event.has_ext4_mballoc_prealloc()) {
- const auto& inner = event.ext4_mballoc_prealloc();
- line = FormatExt4MballocPrealloc(inner);
- } else if (event.has_ext4_other_inode_update_time()) {
- const auto& inner = event.ext4_other_inode_update_time();
- line = FormatExt4OtherInodeUpdateTime(inner);
- } else if (event.has_ext4_punch_hole()) {
- const auto& inner = event.ext4_punch_hole();
- line = FormatExt4PunchHole(inner);
- } else if (event.has_ext4_read_block_bitmap_load()) {
- const auto& inner = event.ext4_read_block_bitmap_load();
- line = FormatExt4ReadBlockBitmapLoad(inner);
- } else if (event.has_ext4_readpage()) {
- const auto& inner = event.ext4_readpage();
- line = FormatExt4Readpage(inner);
- } else if (event.has_ext4_releasepage()) {
- const auto& inner = event.ext4_releasepage();
- line = FormatExt4Releasepage(inner);
- } else if (event.has_ext4_remove_blocks()) {
- const auto& inner = event.ext4_remove_blocks();
- line = FormatExt4RemoveBlocks(inner);
- } else if (event.has_ext4_request_blocks()) {
- const auto& inner = event.ext4_request_blocks();
- line = FormatExt4RequestBlocks(inner);
- } else if (event.has_ext4_request_inode()) {
- const auto& inner = event.ext4_request_inode();
- line = FormatExt4RequestInode(inner);
- } else if (event.has_ext4_sync_file_enter()) {
- const auto& inner = event.ext4_sync_file_enter();
- line = FormatExt4SyncFileEnter(inner);
- } else if (event.has_ext4_sync_file_exit()) {
- const auto& inner = event.ext4_sync_file_exit();
- line = FormatExt4SyncFileExit(inner);
- } else if (event.has_ext4_sync_fs()) {
- const auto& inner = event.ext4_sync_fs();
- line = FormatExt4SyncFs(inner);
- } else if (event.has_ext4_trim_all_free()) {
- const auto& inner = event.ext4_trim_all_free();
- line = FormatExt4TrimAllFree(inner);
- } else if (event.has_ext4_trim_extent()) {
- const auto& inner = event.ext4_trim_extent();
- line = FormatExt4TrimExtent(inner);
- } else if (event.has_ext4_truncate_enter()) {
- const auto& inner = event.ext4_truncate_enter();
- line = FormatExt4TruncateEnter(inner);
- } else if (event.has_ext4_truncate_exit()) {
- const auto& inner = event.ext4_truncate_exit();
- line = FormatExt4TruncateExit(inner);
- } else if (event.has_ext4_unlink_enter()) {
- const auto& inner = event.ext4_unlink_enter();
- line = FormatExt4UnlinkEnter(inner);
- } else if (event.has_ext4_unlink_exit()) {
- const auto& inner = event.ext4_unlink_exit();
- line = FormatExt4UnlinkExit(inner);
- } else if (event.has_ext4_write_begin()) {
- const auto& inner = event.ext4_write_begin();
- line = FormatExt4WriteBegin(inner);
- } else if (event.has_ext4_write_end()) {
- const auto& inner = event.ext4_write_end();
- line = FormatExt4WriteEnd(inner);
- } else if (event.has_ext4_writepage()) {
- const auto& inner = event.ext4_writepage();
- line = FormatExt4Writepage(inner);
- } else if (event.has_ext4_writepages()) {
- const auto& inner = event.ext4_writepages();
- line = FormatExt4Writepages(inner);
- } else if (event.has_ext4_writepages_result()) {
- const auto& inner = event.ext4_writepages_result();
- line = FormatExt4WritepagesResult(inner);
- } else if (event.has_ext4_zero_range()) {
- const auto& inner = event.ext4_zero_range();
- line = FormatExt4ZeroRange(inner);
- } else if (event.has_print()) {
- const auto& inner = event.print();
- line = FormatPrint(inner);
- } else if (event.has_i2c_read()) {
- const auto& inner = event.i2c_read();
- line = FormatI2cRead(inner);
- } else if (event.has_i2c_reply()) {
- const auto& inner = event.i2c_reply();
- line = FormatI2cReply(inner);
- } else if (event.has_i2c_result()) {
- const auto& inner = event.i2c_result();
- line = FormatI2cResult(inner);
- } else if (event.has_i2c_write()) {
- const auto& inner = event.i2c_write();
- line = FormatI2cWrite(inner);
- } else if (event.has_irq_handler_entry()) {
- const auto& inner = event.irq_handler_entry();
- line = FormatIrqHandlerEntry(inner);
- } else if (event.has_irq_handler_exit()) {
- const auto& inner = event.irq_handler_exit();
- line = FormatIrqHandlerExit(inner);
- } else if (event.has_softirq_entry()) {
- const auto& inner = event.softirq_entry();
- line = FormatSoftirqEntry(inner);
- } else if (event.has_softirq_exit()) {
- const auto& inner = event.softirq_exit();
- line = FormatSoftirqExit(inner);
- } else if (event.has_softirq_raise()) {
- const auto& inner = event.softirq_raise();
- line = FormatSoftirqRaise(inner);
- } else if (event.has_lowmemory_kill()) {
- const auto& inner = event.lowmemory_kill();
- line = FormatLowmemoryKill(inner);
- } else if (event.has_tracing_mark_write()) {
- const auto& inner = event.tracing_mark_write();
- line = FormatTracingMarkWrite(inner);
- } else if (event.has_clock_disable()) {
- const auto& inner = event.clock_disable();
- line = FormatClockDisable(inner);
- } else if (event.has_clock_enable()) {
- const auto& inner = event.clock_enable();
- line = FormatClockEnable(inner);
- } else if (event.has_clock_set_rate()) {
- const auto& inner = event.clock_set_rate();
- line = FormatClockSetRate(inner);
- } else if (event.has_cpu_frequency()) {
- const auto& inner = event.cpu_frequency();
- line = FormatCpuFrequency(inner);
- } else if (event.has_cpu_frequency_limits()) {
- const auto& inner = event.cpu_frequency_limits();
- line = FormatCpuFrequencyLimits(inner);
- } else if (event.has_cpu_idle()) {
- const auto& inner = event.cpu_idle();
- line = FormatCpuIdle(inner);
- } else if (event.has_suspend_resume()) {
- const auto& inner = event.suspend_resume();
- line = FormatSuspendResume(inner);
- } else if (event.has_regulator_disable()) {
- const auto& inner = event.regulator_disable();
- line = FormatRegulatorDisable(inner);
- } else if (event.has_regulator_disable_complete()) {
- const auto& inner = event.regulator_disable_complete();
- line = FormatRegulatorDisableComplete(inner);
- } else if (event.has_regulator_enable()) {
- const auto& inner = event.regulator_enable();
- line = FormatRegulatorEnable(inner);
- } else if (event.has_regulator_enable_complete()) {
- const auto& inner = event.regulator_enable_complete();
- line = FormatRegulatorEnableComplete(inner);
- } else if (event.has_regulator_enable_delay()) {
- const auto& inner = event.regulator_enable_delay();
- line = FormatRegulatorEnableDelay(inner);
- } else if (event.has_regulator_set_voltage()) {
- const auto& inner = event.regulator_set_voltage();
- line = FormatRegulatorSetVoltage(inner);
- } else if (event.has_regulator_set_voltage_complete()) {
- const auto& inner = event.regulator_set_voltage_complete();
- line = FormatRegulatorSetVoltageComplete(inner);
- } else if (event.has_sched_blocked_reason()) {
- const auto& inner = event.sched_blocked_reason();
- line = FormatSchedBlockedReason(inner);
- } else if (event.has_sched_cpu_hotplug()) {
- const auto& inner = event.sched_cpu_hotplug();
- line = FormatSchedCpuHotplug(inner);
- } else if (event.has_sched_switch()) {
- const auto& inner = event.sched_switch();
- line = FormatSchedSwitch(inner);
- } else if (event.has_sched_wakeup()) {
- const auto& inner = event.sched_wakeup();
- line = FormatSchedWakeup(inner);
- } else if (event.has_sched_wakeup_new()) {
- const auto& inner = event.sched_wakeup_new();
- line = FormatSchedWakeupNew(inner);
- } else if (event.has_sync_pt()) {
- const auto& inner = event.sync_pt();
- line = FormatSyncPt(inner);
- } else if (event.has_sync_timeline()) {
- const auto& inner = event.sync_timeline();
- line = FormatSyncTimeline(inner);
- } else if (event.has_sync_wait()) {
- const auto& inner = event.sync_wait();
- line = FormatSyncWait(inner);
- } else if (event.has_mm_vmscan_direct_reclaim_begin()) {
- const auto& inner = event.mm_vmscan_direct_reclaim_begin();
- line = FormatMmVmscanDirectReclaimBegin(inner);
- } else if (event.has_mm_vmscan_direct_reclaim_end()) {
- const auto& inner = event.mm_vmscan_direct_reclaim_end();
- line = FormatMmVmscanDirectReclaimEnd(inner);
- } else if (event.has_mm_vmscan_kswapd_sleep()) {
- const auto& inner = event.mm_vmscan_kswapd_sleep();
- line = FormatMmVmscanKswapdSleep(inner);
- } else if (event.has_mm_vmscan_kswapd_wake()) {
- const auto& inner = event.mm_vmscan_kswapd_wake();
- line = FormatMmVmscanKswapdWake(inner);
- } else if (event.has_workqueue_activate_work()) {
- const auto& inner = event.workqueue_activate_work();
- line = FormatWorkqueueActivateWork(inner);
- } else if (event.has_workqueue_execute_end()) {
- const auto& inner = event.workqueue_execute_end();
- line = FormatWorkqueueExecuteEnd(inner);
- } else if (event.has_workqueue_execute_start()) {
- const auto& inner = event.workqueue_execute_start();
- line = FormatWorkqueueExecuteStart(inner);
- } else if (event.has_workqueue_queue_work()) {
- const auto& inner = event.workqueue_queue_work();
- line = FormatWorkqueueQueueWork(inner);
- } else if (event.has_sched_process_fork()) {
- const auto& inner = event.sched_process_fork();
- line = FormatSchedProcessFork(inner);
- } else if (event.has_sched_process_hang()) {
- const auto& inner = event.sched_process_hang();
- line = FormatSchedProcessHang(inner);
- } else if (event.has_sched_process_free()) {
- const auto& inner = event.sched_process_free();
- line = FormatSchedProcessFree(inner);
- } else if (event.has_sched_process_exec()) {
- const auto& inner = event.sched_process_exec();
- line = FormatSchedProcessExec(inner);
- } else if (event.has_sched_process_exit()) {
- const auto& inner = event.sched_process_exit();
- line = FormatSchedProcessExit(inner);
- } else if (event.has_sched_process_wait()) {
- const auto& inner = event.sched_process_wait();
- line = FormatSchedProcessWait(inner);
- } else if (event.has_task_rename()) {
- const auto& inner = event.task_rename();
- line = FormatTaskRename(inner);
- } else if (event.has_task_newtask()) {
- const auto& inner = event.task_newtask();
- line = FormatTaskNewtask(inner);
- } else {
+ std::string line =
+ FormatFtraceEvent(event.timestamp(), bundle.cpu(), event);
+ if (line == "")
continue;
- }
- sorted.emplace(event.timestamp(),
- FormatPrefix(event.timestamp(), bundle.cpu()) + line);
+ sorted.emplace(event.timestamp(), line);
}
- }
+ });
*output << kTraceHeader;
*output << kFtraceHeader;
@@ -2810,13 +257,89 @@
return 0;
}
+int TraceToText(std::istream* input, std::ostream* output) {
+ DiskSourceTree dst;
+ dst.MapPath("perfetto", "protos/perfetto");
+ MFE mfe;
+ Importer importer(&dst, &mfe);
+ const FileDescriptor* parsed_file =
+ importer.Import("perfetto/trace/trace.proto");
+
+ DynamicMessageFactory dmf;
+ const Descriptor* trace_descriptor = parsed_file->message_type(0);
+ const Message* msg_root = dmf.GetPrototype(trace_descriptor);
+ Message* msg = msg_root->New();
+
+ if (!msg->ParseFromIstream(input)) {
+ PERFETTO_ELOG("Could not parse input.");
+ return 1;
+ }
+ OstreamOutputStream zero_copy_output(output);
+ TextFormat::Print(*msg, &zero_copy_output);
+ return 0;
+}
+
+int TraceToSummary(std::istream* input, std::ostream* output) {
+ uint64_t start = std::numeric_limits<uint64_t>::max();
+ uint64_t end = 0;
+ std::multiset<uint64_t> ftrace_timestamps;
+
+ ForEachPacketInTrace(input, [&start, &end, &ftrace_timestamps](
+ const protos::TracePacket& packet) {
+ if (!packet.has_ftrace_events())
+ return;
+
+ const FtraceEventBundle& bundle = packet.ftrace_events();
+
+ for (const FtraceEvent& event : bundle.event()) {
+ if (event.timestamp()) {
+ start = std::min<uint64_t>(start, event.timestamp());
+ end = std::max<uint64_t>(end, event.timestamp());
+ ftrace_timestamps.insert(event.timestamp());
+ }
+ }
+ });
+
+ fprintf(stderr, "\n");
+
+ char line[2048];
+ sprintf(line, "Duration: %" PRIu64 "ms\n", (end - start) / (1000 * 1000));
+ *output << std::string(line);
+
+ constexpr char kFtraceTrackName[] = "ftrace ";
+ size_t width = GetWidth();
+ size_t bucket_count = width - strlen(kFtraceTrackName);
+ size_t bucket_size = (end - start) / bucket_count;
+ size_t max = 0;
+ std::vector<size_t> buckets(bucket_count);
+ for (size_t i = 0; i < bucket_count; i++) {
+ auto low = ftrace_timestamps.lower_bound(i * bucket_size + start);
+ auto high = ftrace_timestamps.upper_bound((i + 1) * bucket_size + start);
+ buckets[i] = std::distance(low, high);
+ max = std::max(max, buckets[i]);
+ }
+
+ std::vector<std::string> out =
+ std::vector<std::string>({" ", "▁", "▂", "▃", "▄", "▅", "▆", "▇"});
+ *output << kFtraceTrackName;
+ for (size_t i = 0; i < bucket_count; i++) {
+ sprintf(
+ line, "%s",
+ out[std::min(buckets[i] / (max / out.size()), out.size() - 1)].c_str());
+ *output << std::string(line);
+ }
+ *output << "\n";
+ return 0;
+}
+
} // namespace
} // namespace perfetto
namespace {
int Usage(int argc, char** argv) {
- printf("Usage: %s [systrace|text] < trace.proto > trace.txt\n", argv[0]);
+ printf("Usage: %s [systrace|text|summary] < trace.proto > trace.txt\n",
+ argv[0]);
return 1;
}
@@ -2828,14 +351,15 @@
std::string format(argv[1]);
- if (format != "systrace" && format != "text")
- return Usage(argc, argv);
+ bool is_systrace = format == "systrace";
+ bool is_text = format == "text";
+ bool is_summary = format == "summary";
- bool systrace = format == "systrace";
-
- if (systrace) {
+ if (is_systrace)
return perfetto::TraceToSystrace(&std::cin, &std::cout);
- } else {
+ if (is_text)
return perfetto::TraceToText(&std::cin, &std::cout);
- }
+ if (is_summary)
+ return perfetto::TraceToSummary(&std::cin, &std::cout);
+ return Usage(argc, argv);
}