summaryrefslogtreecommitdiff
path: root/simpleperf/event_fd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/event_fd.cpp')
-rw-r--r--simpleperf/event_fd.cpp38
1 files changed, 26 insertions, 12 deletions
diff --git a/simpleperf/event_fd.cpp b/simpleperf/event_fd.cpp
index 2fd4d522..0002d02e 100644
--- a/simpleperf/event_fd.cpp
+++ b/simpleperf/event_fd.cpp
@@ -76,9 +76,7 @@ std::unique_ptr<EventFd> EventFd::OpenEventFile(const perf_event_attr& attr, pid
}
EventFd::~EventFd() {
- if (mmap_addr_ != nullptr) {
- munmap(mmap_addr_, mmap_len_);
- }
+ DestroyMappedBuffer();
close(perf_event_fd_);
}
@@ -115,19 +113,22 @@ bool EventFd::ReadCounter(PerfCounter* counter) const {
return true;
}
-bool EventFd::CreateMappedBuffer(size_t mmap_pages, pollfd* poll_fd) {
+bool EventFd::CreateMappedBuffer(size_t mmap_pages, pollfd* poll_fd, bool report_error) {
CHECK(IsPowerOfTwo(mmap_pages));
size_t page_size = sysconf(_SC_PAGE_SIZE);
size_t mmap_len = (mmap_pages + 1) * page_size;
void* mmap_addr = mmap(nullptr, mmap_len, PROT_READ | PROT_WRITE, MAP_SHARED, perf_event_fd_, 0);
if (mmap_addr == MAP_FAILED) {
bool is_perm_error = (errno == EPERM);
- PLOG(ERROR) << "mmap() failed for " << Name();
- if (is_perm_error) {
+ if (report_error) {
+ PLOG(ERROR) << "mmap(" << mmap_pages << ") failed for " << Name();
+ } else {
+ PLOG(DEBUG) << "mmap(" << mmap_pages << ") failed for " << Name();
+ }
+ if (report_error && is_perm_error) {
LOG(ERROR) << "It seems the kernel doesn't allow allocating enough "
- << "buffer for dumping samples, consider decreasing the number of "
- << "monitored threads(-t), or decreasing mmap pages(-m), or "
- << "decreasing the number of events(-e).";
+ << "buffer for dumping samples, consider decreasing mmap pages(-m), "
+ << "or decreasing the number of events(-e).";
}
return false;
}
@@ -145,18 +146,31 @@ bool EventFd::CreateMappedBuffer(size_t mmap_pages, pollfd* poll_fd) {
return true;
}
-bool EventFd::ShareMappedBuffer(const EventFd& event_fd) {
+bool EventFd::ShareMappedBuffer(const EventFd& event_fd, bool report_error) {
CHECK(!HasMappedBuffer());
CHECK(event_fd.HasMappedBuffer());
int result = ioctl(perf_event_fd_, PERF_EVENT_IOC_SET_OUTPUT, event_fd.perf_event_fd_);
if (result != 0) {
- PLOG(ERROR) << "failed to share mapped buffer of "
- << event_fd.perf_event_fd_ << " with " << perf_event_fd_;
+ if (report_error) {
+ PLOG(ERROR) << "failed to share mapped buffer of "
+ << event_fd.perf_event_fd_ << " with " << perf_event_fd_;
+ }
return false;
}
return true;
}
+void EventFd::DestroyMappedBuffer() {
+ if (HasMappedBuffer()) {
+ munmap(mmap_addr_, mmap_len_);
+ mmap_addr_ = nullptr;
+ mmap_len_ = 0;
+ mmap_metadata_page_ = nullptr;
+ mmap_data_buffer_ = nullptr;
+ mmap_data_buffer_size_ = 0;
+ }
+}
+
size_t EventFd::GetAvailableMmapData(char** pdata) {
if (!HasMappedBuffer()) {
return 0;