summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2024-05-08 10:55:28 -0700
committerYabin Cui <yabinc@google.com>2024-05-08 11:16:07 -0700
commit7a59f85e59772f2de6315195bffc3290ec730b83 (patch)
treea35177f29b4916af03933b3f190eda1741f59268
parent9e247e80ae9346fe827822293e025246ac62c497 (diff)
downloadextras-7a59f85e59772f2de6315195bffc3290ec730b83.tar.gz
simpleperf: Delay processing ETM data until the buffer is half full
When using --decode-etm, the main thread is busy processing ETM data and can miss flushing ETM data. To fix this, we can delay processing ETM data after recording. This patch triggers ETM data processing when the buffer is at least half full. In the default configuration, the buffer is large enough to hold ETM data for several seconds. So effectively, this delays processing ETM data after recording. Bug: 336375740 Test: run simpleperf_unit_test Change-Id: Ib892aeea402773b1cab785f2c14886bb9f96d851
-rw-r--r--simpleperf/RecordReadThread.cpp12
-rw-r--r--simpleperf/RecordReadThread.h1
2 files changed, 13 insertions, 0 deletions
diff --git a/simpleperf/RecordReadThread.cpp b/simpleperf/RecordReadThread.cpp
index 2ab61278..2d034bc1 100644
--- a/simpleperf/RecordReadThread.cpp
+++ b/simpleperf/RecordReadThread.cpp
@@ -408,6 +408,7 @@ bool RecordReadThread::HandleAddEventFds(IOEventLoop& loop,
success = false;
break;
}
+ has_etm_events_ = true;
}
cpu_map[fd->Cpu()] = fd;
} else {
@@ -620,6 +621,9 @@ void RecordReadThread::PushRecordToRecordBuffer(KernelRecordReader* kernel_recor
}
void RecordReadThread::ReadAuxDataFromKernelBuffer(bool* has_data) {
+ if (!has_etm_events_) {
+ return;
+ }
for (auto& reader : kernel_record_readers_) {
EventFd* event_fd = reader.GetEventFd();
if (event_fd->HasAuxBuffer()) {
@@ -659,6 +663,14 @@ void RecordReadThread::ReadAuxDataFromKernelBuffer(bool* has_data) {
}
bool RecordReadThread::SendDataNotificationToMainThread() {
+ if (has_etm_events_) {
+ // For ETM recording, the default buffer size is large enough to hold ETM data for several
+ // seconds. To reduce impact of processing ETM data (especially when --decode-etm is used),
+ // delay processing ETM data until the buffer is half full.
+ if (record_buffer_.GetFreeSize() >= record_buffer_.size() / 2) {
+ return true;
+ }
+ }
if (!has_data_notification_.load(std::memory_order_relaxed)) {
has_data_notification_ = true;
char unused = 0;
diff --git a/simpleperf/RecordReadThread.h b/simpleperf/RecordReadThread.h
index c104b083..893f8234 100644
--- a/simpleperf/RecordReadThread.h
+++ b/simpleperf/RecordReadThread.h
@@ -211,6 +211,7 @@ class RecordReadThread {
std::unique_ptr<std::thread> read_thread_;
std::vector<KernelRecordReader> kernel_record_readers_;
pid_t exclude_pid_ = -1;
+ bool has_etm_events_ = false;
std::unordered_set<EventFd*> event_fds_disabled_by_kernel_;