Add support for 16K pages Removes base::kPageSize and make everything depend on base::GetPageSize(). There is only one thing missing that I need to figure out: the fact that this needs a: extra_target_ldflags="-Wl,-z,max-page-size=65536" to work. I need to consult with 16K experts to figure out what's the best way forward. Test: all existing tests pass. Test: manual smoke test of traced_probes & traced_perf Bug: 269635302 Change-Id: I105e02ad364f9e8daffbf5cb2235493fda8dca11
diff --git a/src/base/paged_memory_unittest.cc b/src/base/paged_memory_unittest.cc index 7e3508b..388b5b2 100644 --- a/src/base/paged_memory_unittest.cc +++ b/src/base/paged_memory_unittest.cc
@@ -35,14 +35,14 @@ TEST(PagedMemoryTest, Basic) { const size_t kNumPages = 10; - const size_t kSize = 4096 * kNumPages; + const size_t kSize = GetSysPageSize() * kNumPages; #if !PERFETTO_BUILDFLAG(PERFETTO_OS_FUCHSIA) void* ptr_raw = nullptr; #endif { PagedMemory mem = PagedMemory::Allocate(kSize); ASSERT_TRUE(mem.IsValid()); - ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(mem.Get()) % 4096); + ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(mem.Get()) % GetSysPageSize()); #if !PERFETTO_BUILDFLAG(PERFETTO_OS_FUCHSIA) ptr_raw = mem.Get(); #endif @@ -95,8 +95,8 @@ } TEST(PagedMemoryTest, Uncommitted) { - constexpr size_t kNumPages = 4096; - constexpr size_t kSize = 4096 * kNumPages; + const size_t kNumPages = 4096; + const size_t kSize = GetSysPageSize() * kNumPages; #if !PERFETTO_BUILDFLAG(PERFETTO_OS_FUCHSIA) char* ptr_raw = nullptr; #endif @@ -156,14 +156,14 @@ TEST(PagedMemoryTest, AccessUncommittedMemoryTriggersASAN) { EXPECT_DEATH_IF_SUPPORTED( { - constexpr size_t kNumPages = 4096; - constexpr size_t kSize = 4096 * kNumPages; + const size_t kNumPages = 2000; + const size_t kSize = GetSysPageSize() * kNumPages; PagedMemory mem = PagedMemory::Allocate(kSize, PagedMemory::kDontCommit); ASSERT_TRUE(mem.IsValid()); char* ptr_raw = reinterpret_cast<char*>(mem.Get()); // Only the first 1024 pages are mapped. - constexpr size_t kMappedSize = 4096 * 1024; + const size_t kMappedSize = GetSysPageSize() * 1024; ptr_raw[kMappedSize] = 'x'; abort(); },
diff --git a/src/base/utils.cc b/src/base/utils.cc index 82386fa..ab3f390 100644 --- a/src/base/utils.cc +++ b/src/base/utils.cc
@@ -136,6 +136,34 @@ namespace perfetto { namespace base { +namespace internal { + +std::atomic<uint32_t> g_cached_page_size{0}; + +uint32_t GetSysPageSizeSlowpath() { + uint32_t page_size = 0; +#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \ + PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) + const int page_size_int = getpagesize(); + // If sysconf() fails for obscure reasons (e.g. SELinux denial) assume the + // page size is 4KB. This is to avoid regressing subtle SDK usages, as old + // versions of this code had a static constant baked in. + page_size = static_cast<uint32_t>(page_size_int > 0 ? page_size_int : 4096); +#elif PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE) + page_size = static_cast<uint32_t>(vm_page_size); +#else + page_size = 4096; +#endif + + PERFETTO_CHECK(page_size > 0 && page_size % 4096 == 0); + + // Races here are fine because any thread will write the same value. + g_cached_page_size.store(page_size, std::memory_order_relaxed); + return page_size; +} + +} // namespace internal + void MaybeReleaseAllocatorMemToOS() { #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) // mallopt() on Android requires SDK level 26. Many targets and embedders @@ -153,27 +181,6 @@ #endif } -uint32_t GetSysPageSize() { - ignore_result(kPageSize); // Just to keep the amalgamated build happy. -#if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \ - PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) - static std::atomic<uint32_t> page_size{0}; - // This function might be called in hot paths. Avoid calling getpagesize() all - // the times, in many implementations getpagesize() calls sysconf() which is - // not cheap. - uint32_t cached_value = page_size.load(std::memory_order_relaxed); - if (PERFETTO_UNLIKELY(cached_value == 0)) { - cached_value = static_cast<uint32_t>(getpagesize()); - page_size.store(cached_value, std::memory_order_relaxed); - } - return cached_value; -#elif PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE) - return static_cast<uint32_t>(vm_page_size); -#else - return 4096; -#endif -} - uid_t GetCurrentUserId() { #if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) || \ PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
diff --git a/src/profiling/memory/shared_ring_buffer.cc b/src/profiling/memory/shared_ring_buffer.cc index 32d9b3c..871ea21 100644 --- a/src/profiling/memory/shared_ring_buffer.cc +++ b/src/profiling/memory/shared_ring_buffer.cc
@@ -41,18 +41,21 @@ namespace { -constexpr auto kMetaPageSize = base::kPageSize; constexpr auto kAlignment = 8; // 64 bits to use aligned memcpy(). constexpr auto kHeaderSize = kAlignment; -constexpr auto kGuardSize = base::kPageSize * 1024 * 16; // 64 MB. +constexpr auto kGuardSize = 1024 * 1024 * 64; // 64 MB. #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) constexpr auto kFDSeals = F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_SEAL; #endif +size_t meta_page_size() { + return base::GetSysPageSize(); +} + } // namespace SharedRingBuffer::SharedRingBuffer(CreateFlag, size_t size) { - size_t size_with_meta = size + kMetaPageSize; + size_t size_with_meta = size + meta_page_size(); base::ScopedFile fd; #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) bool is_memfd = false; @@ -101,7 +104,7 @@ "MetadataPage must be trivially destructible"); if (is_valid()) { - size_t outer_size = kMetaPageSize + size_ * 2 + kGuardSize; + size_t outer_size = meta_page_size() + size_ * 2 + kGuardSize; munmap(meta_, outer_size); } @@ -139,19 +142,19 @@ return; } auto size_with_meta = static_cast<size_t>(stat_buf.st_size); - auto size = size_with_meta - kMetaPageSize; + auto size = size_with_meta - meta_page_size(); // |size_with_meta| must be a power of two number of pages + 1 page (for // metadata). - if (size_with_meta < 2 * base::kPageSize || size % base::kPageSize || - (size & (size - 1))) { + if (size_with_meta < 2 * base::GetSysPageSize() || + size % base::GetSysPageSize() || (size & (size - 1))) { PERFETTO_ELOG("SharedRingBuffer size is invalid (%zu)", size_with_meta); return; } // First of all reserve the whole virtual region to fit the buffer twice // + metadata page + red zone at the end. - size_t outer_size = kMetaPageSize + size * 2 + kGuardSize; + size_t outer_size = meta_page_size() + size * 2 + kGuardSize; uint8_t* region = reinterpret_cast<uint8_t*>( mmap(nullptr, outer_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); if (region == MAP_FAILED) { @@ -167,7 +170,7 @@ // [ METADATA ] [ RING BUFFER SHMEM ] [ RING BUFFER SHMEM ] void* reg2 = mmap(region + size_with_meta, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, *mem_fd, - /*offset=*/kMetaPageSize); + /*offset=*/static_cast<ssize_t>(meta_page_size())); if (reg1 != region || reg2 != region + size_with_meta) { PERFETTO_PLOG("mmap(MAP_SHARED) failed"); @@ -176,7 +179,7 @@ } set_size(size); meta_ = reinterpret_cast<MetadataPage*>(region); - mem_ = region + kMetaPageSize; + mem_ = region + meta_page_size(); mem_fd_ = std::move(mem_fd); }
diff --git a/src/profiling/memory/shared_ring_buffer.h b/src/profiling/memory/shared_ring_buffer.h index 9bc2e26..2a49da5 100644 --- a/src/profiling/memory/shared_ring_buffer.h +++ b/src/profiling/memory/shared_ring_buffer.h
@@ -266,7 +266,7 @@ base::ScopedFile mem_fd_; MetadataPage* meta_ = nullptr; // Start of the mmaped region. - uint8_t* mem_ = nullptr; // Start of the contents (i.e. meta_ + kPageSize). + uint8_t* mem_ = nullptr; // Start of the contents (i.e. meta_ + pagesize). // Size of the ring buffer contents, without including metadata or the 2nd // mmap.
diff --git a/src/profiling/memory/shared_ring_buffer_fuzzer.cc b/src/profiling/memory/shared_ring_buffer_fuzzer.cc index 2a597a9..46990a0 100644 --- a/src/profiling/memory/shared_ring_buffer_fuzzer.cc +++ b/src/profiling/memory/shared_ring_buffer_fuzzer.cc
@@ -20,6 +20,7 @@ #include "perfetto/ext/base/file_utils.h" #include "perfetto/ext/base/temp_file.h" +#include "perfetto/ext/base/utils.h" #include "src/profiling/memory/shared_ring_buffer.h" namespace perfetto { @@ -55,7 +56,7 @@ size_t payload_size = size - sizeof(SharedRingBuffer::MetadataPage); const uint8_t* payload = data + sizeof(SharedRingBuffer::MetadataPage); size_t payload_size_pages = - (payload_size + base::kPageSize - 1) / base::kPageSize; + (payload_size + base::GetSysPageSize() - 1) / base::GetSysPageSize(); // Upsize test buffer to be 2^n data pages (precondition of the impl) + 1 page // for the metadata. size_t total_size_pages = 1 + RoundToPow2(payload_size_pages); @@ -68,9 +69,10 @@ header.spinlock.poisoned = false; PERFETTO_CHECK(ftruncate(*fd, static_cast<off_t>(total_size_pages * - base::kPageSize)) == 0); + base::GetSysPageSize())) == + 0); PERFETTO_CHECK(base::WriteAll(*fd, &header, sizeof(header)) != -1); - PERFETTO_CHECK(lseek(*fd, base::kPageSize, SEEK_SET) != -1); + PERFETTO_CHECK(lseek(*fd, base::GetSysPageSize(), SEEK_SET) != -1); PERFETTO_CHECK(base::WriteAll(*fd, payload, payload_size) != -1); auto buf = SharedRingBuffer::Attach(std::move(fd));
diff --git a/src/profiling/memory/shared_ring_buffer_unittest.cc b/src/profiling/memory/shared_ring_buffer_unittest.cc index ff533f3..5128b7a 100644 --- a/src/profiling/memory/shared_ring_buffer_unittest.cc +++ b/src/profiling/memory/shared_ring_buffer_unittest.cc
@@ -101,7 +101,7 @@ ASSERT_EQ(ToString(buf_and_size), data); rd->EndRead(std::move(buf_and_size)); } - data = std::string(base::kPageSize - sizeof(uint64_t), '#'); + data = std::string(base::GetSysPageSize() - sizeof(uint64_t), '#'); for (int i = 0; i < 4; i++) ASSERT_TRUE(TryWrite(wr, data.data(), data.size())); @@ -146,7 +146,7 @@ } TEST(SharedRingBufferTest, ReadShutdown) { - constexpr auto kBufSize = base::kPageSize * 4; + const size_t kBufSize = base::GetSysPageSize() * 4; std::optional<SharedRingBuffer> wr = SharedRingBuffer::Create(kBufSize); ASSERT_TRUE(wr); SharedRingBuffer rd = @@ -157,7 +157,7 @@ } TEST(SharedRingBufferTest, WriteShutdown) { - constexpr auto kBufSize = base::kPageSize * 4; + const size_t kBufSize = base::GetSysPageSize() * 4; std::optional<SharedRingBuffer> rd = SharedRingBuffer::Create(kBufSize); ASSERT_TRUE(rd); SharedRingBuffer wr = @@ -173,13 +173,13 @@ } TEST(SharedRingBufferTest, SingleThreadSameInstance) { - constexpr auto kBufSize = base::kPageSize * 4; + const size_t kBufSize = base::GetSysPageSize() * 4; std::optional<SharedRingBuffer> buf = SharedRingBuffer::Create(kBufSize); StructuredTest(&*buf, &*buf); } TEST(SharedRingBufferTest, SingleThreadAttach) { - constexpr auto kBufSize = base::kPageSize * 4; + const size_t kBufSize = base::GetSysPageSize() * 4; std::optional<SharedRingBuffer> buf1 = SharedRingBuffer::Create(kBufSize); std::optional<SharedRingBuffer> buf2 = SharedRingBuffer::Attach(base::ScopedFile(dup(buf1->fd()))); @@ -187,7 +187,7 @@ } TEST(SharedRingBufferTest, MultiThreadingTest) { - constexpr auto kBufSize = base::kPageSize * 1024; // 4 MB + const size_t kBufSize = base::GetSysPageSize() * 1024; // 4 MB SharedRingBuffer rd = *SharedRingBuffer::Create(kBufSize); SharedRingBuffer wr = *SharedRingBuffer::Attach(base::ScopedFile(dup(rd.fd()))); @@ -201,7 +201,7 @@ while (!writers_enabled.load()) { } std::minstd_rand0 rnd_engine(static_cast<uint32_t>(thread_id)); - std::uniform_int_distribution<size_t> dist(1, base::kPageSize * 8); + std::uniform_int_distribution<size_t> dist(1, base::GetSysPageSize() * 8); for (int i = 0; i < 1000; i++) { size_t size = dist(rnd_engine); ASSERT_GT(size, 0u); @@ -255,13 +255,13 @@ } TEST(SharedRingBufferTest, InvalidSize) { - constexpr auto kBufSize = base::kPageSize * 4 + 1; + const size_t kBufSize = base::GetSysPageSize() * 4 + 1; std::optional<SharedRingBuffer> wr = SharedRingBuffer::Create(kBufSize); EXPECT_EQ(wr, std::nullopt); } TEST(SharedRingBufferTest, EmptyWrite) { - constexpr auto kBufSize = base::kPageSize * 4; + const size_t kBufSize = base::GetSysPageSize() * 4; std::optional<SharedRingBuffer> wr = SharedRingBuffer::Create(kBufSize); ASSERT_TRUE(wr); SharedRingBuffer::Buffer buf;
diff --git a/src/profiling/memory/shared_ring_buffer_write_fuzzer.cc b/src/profiling/memory/shared_ring_buffer_write_fuzzer.cc index 62b82eb..fa81338 100644 --- a/src/profiling/memory/shared_ring_buffer_write_fuzzer.cc +++ b/src/profiling/memory/shared_ring_buffer_write_fuzzer.cc
@@ -20,6 +20,7 @@ #include "perfetto/ext/base/file_utils.h" #include "perfetto/ext/base/temp_file.h" +#include "perfetto/ext/base/utils.h" #include "src/profiling/memory/shared_ring_buffer.h" namespace perfetto { @@ -60,7 +61,7 @@ size_t payload_size = size - sizeof(FuzzingInputHeader); const uint8_t* payload = data + sizeof(FuzzingInputHeader); size_t payload_size_pages = - (payload_size + base::kPageSize - 1) / base::kPageSize; + (payload_size + base::GetSysPageSize() - 1) / base::GetSysPageSize(); // Upsize test buffer to be 2^n data pages (precondition of the impl) + 1 page // for the metadata. size_t total_size_pages = 1 + RoundToPow2(payload_size_pages); @@ -73,10 +74,11 @@ metadata_page.spinlock.poisoned = false; PERFETTO_CHECK(ftruncate(*fd, static_cast<off_t>(total_size_pages * - base::kPageSize)) == 0); + base::GetSysPageSize())) == + 0); PERFETTO_CHECK(base::WriteAll(*fd, &metadata_page, sizeof(metadata_page)) != -1); - PERFETTO_CHECK(lseek(*fd, base::kPageSize, SEEK_SET) != -1); + PERFETTO_CHECK(lseek(*fd, base::GetSysPageSize(), SEEK_SET) != -1); PERFETTO_CHECK(base::WriteAll(*fd, payload, payload_size) != -1); auto buf = SharedRingBuffer::Attach(std::move(fd));
diff --git a/src/profiling/perf/event_config.cc b/src/profiling/perf/event_config.cc index 25b05c3..79df2ce 100644 --- a/src/profiling/perf/event_config.cc +++ b/src/profiling/perf/event_config.cc
@@ -416,7 +416,7 @@ // TODO(rsavitski): for now, make an extremely conservative guess of an 8 // byte sample (stack sampling samples can be up to 64KB). This is most // likely as good as no limit in practice. - samples_per_tick_limit = *ring_buffer_pages * (base::kPageSize / 8); + samples_per_tick_limit = *ring_buffer_pages * (base::GetSysPageSize() / 8); } PERFETTO_DLOG("Capping samples (not records) per tick to [%" PRIu64 "]", samples_per_tick_limit);
diff --git a/src/profiling/perf/event_reader.cc b/src/profiling/perf/event_reader.cc index 2a40c6c..cb606f6 100644 --- a/src/profiling/perf/event_reader.cc +++ b/src/profiling/perf/event_reader.cc
@@ -119,8 +119,8 @@ PerfRingBuffer ret; // mmap request is one page larger than the buffer size (for the metadata). - ret.data_buf_sz_ = data_page_count * base::kPageSize; - ret.mmap_sz_ = ret.data_buf_sz_ + base::kPageSize; + ret.data_buf_sz_ = data_page_count * base::GetSysPageSize(); + ret.mmap_sz_ = ret.data_buf_sz_ + base::GetSysPageSize(); // If PROT_WRITE, kernel won't overwrite unread samples. void* mmap_addr = mmap(nullptr, ret.mmap_sz_, PROT_READ | PROT_WRITE, @@ -132,8 +132,8 @@ // Expected layout is [ metadata page ] [ data pages ... ] ret.metadata_page_ = reinterpret_cast<perf_event_mmap_page*>(mmap_addr); - ret.data_buf_ = reinterpret_cast<char*>(mmap_addr) + base::kPageSize; - PERFETTO_CHECK(ret.metadata_page_->data_offset == base::kPageSize); + ret.data_buf_ = reinterpret_cast<char*>(mmap_addr) + base::GetSysPageSize(); + PERFETTO_CHECK(ret.metadata_page_->data_offset == base::GetSysPageSize()); PERFETTO_CHECK(ret.metadata_page_->data_size == ret.data_buf_sz_); PERFETTO_DCHECK(IsPowerOfTwo(ret.data_buf_sz_));
diff --git a/src/traced/probes/ftrace/cpu_reader.cc b/src/traced/probes/ftrace/cpu_reader.cc index c02af04..a6bf239 100644 --- a/src/traced/probes/ftrace/cpu_reader.cc +++ b/src/traced/probes/ftrace/cpu_reader.cc
@@ -220,14 +220,14 @@ bool first_batch_in_cycle, CompactSchedBuffer* compact_sched_buf, const std::set<FtraceDataSource*>& started_data_sources) { + const auto sys_page_size = base::GetSysPageSize(); size_t pages_read = 0; { metatrace::ScopedEvent evt(metatrace::TAG_FTRACE, metatrace::FTRACE_CPU_READ_BATCH); for (; pages_read < max_pages;) { - uint8_t* curr_page = parsing_buf + (pages_read * base::kPageSize); - ssize_t res = - PERFETTO_EINTR(read(*trace_fd_, curr_page, base::kPageSize)); + uint8_t* curr_page = parsing_buf + (pages_read * sys_page_size); + ssize_t res = PERFETTO_EINTR(read(*trace_fd_, curr_page, sys_page_size)); if (res < 0) { // Expected errors: // EAGAIN: no data (since we're in non-blocking mode). @@ -253,7 +253,7 @@ PERFETTO_DLOG("[cpu%zu]: 0-sized read from ftrace pipe.", cpu_); break; } - PERFETTO_CHECK(res == static_cast<ssize_t>(base::kPageSize)); + PERFETTO_CHECK(res == static_cast<ssize_t>(sys_page_size)); pages_read += 1; @@ -267,11 +267,11 @@ // fragmentation, i.e. for the fact that the last trace event didn't fit // in the current page and hence the current page was terminated // prematurely. - static constexpr size_t kRoughlyAPage = base::kPageSize - 512; + static const size_t kRoughlyAPage = sys_page_size - 512; const uint8_t* scratch_ptr = curr_page; std::optional<PageHeader> hdr = ParsePageHeader(&scratch_ptr, table_->page_header_size_len()); - PERFETTO_DCHECK(hdr && hdr->size > 0 && hdr->size <= base::kPageSize); + PERFETTO_DCHECK(hdr && hdr->size > 0 && hdr->size <= sys_page_size); if (!hdr.has_value()) { PERFETTO_ELOG("[cpu%zu]: can't parse page header", cpu_); break; @@ -305,8 +305,8 @@ if (pages_parsed_ok != pages_read) { const size_t first_bad_page_idx = pages_parsed_ok; const uint8_t* curr_page = - parsing_buf + (first_bad_page_idx * base::kPageSize); - LogInvalidPage(curr_page, base::kPageSize); + parsing_buf + (first_bad_page_idx * sys_page_size); + LogInvalidPage(curr_page, sys_page_size); PERFETTO_FATAL("Failed to parse ftrace page"); } } @@ -423,8 +423,9 @@ size_t pages_parsed = 0; bool compact_sched_enabled = ds_config->compact_sched.enabled; for (; pages_parsed < pages_read; pages_parsed++) { - const uint8_t* curr_page = parsing_buf + (pages_parsed * base::kPageSize); - const uint8_t* curr_page_end = curr_page + base::kPageSize; + const uint8_t* curr_page = + parsing_buf + (pages_parsed * base::GetSysPageSize()); + const uint8_t* curr_page_end = curr_page + base::GetSysPageSize(); const uint8_t* parse_pos = curr_page; std::optional<PageHeader> page_header = ParsePageHeader(&parse_pos, table->page_header_size_len()); @@ -489,7 +490,7 @@ // (clearing the bit internally). constexpr static uint64_t kMissedEventsFlag = (1ull << 31); - const uint8_t* end_of_page = *ptr + base::kPageSize; + const uint8_t* end_of_page = *ptr + base::GetSysPageSize(); PageHeader page_header; if (!CpuReader::ReadAndAdvance<uint64_t>(ptr, end_of_page, &page_header.timestamp)) @@ -505,7 +506,7 @@ page_header.size = size_and_flags & kDataSizeMask; page_header.lost_events = bool(size_and_flags & kMissedEventsFlag); - PERFETTO_DCHECK(page_header.size <= base::kPageSize); + PERFETTO_DCHECK(page_header.size <= base::GetSysPageSize()); // Reject rest of the number, if applicable. On 32-bit, size_bytes - 4 will // evaluate to 0 and this will be a no-op. On 64-bit, this will advance by 4
diff --git a/src/traced/probes/ftrace/cpu_reader.h b/src/traced/probes/ftrace/cpu_reader.h index 6fc629d..474c10a 100644 --- a/src/traced/probes/ftrace/cpu_reader.h +++ b/src/traced/probes/ftrace/cpu_reader.h
@@ -64,7 +64,7 @@ void AllocateIfNeeded() { // PagedMemory stays valid as long as it was allocated once. if (!ftrace_data_.IsValid()) { - ftrace_data_ = base::PagedMemory::Allocate(base::kPageSize * + ftrace_data_ = base::PagedMemory::Allocate(base::GetSysPageSize() * kFtraceDataBufSizePages); } // Heap-allocated buffer gets freed and reallocated. @@ -96,7 +96,7 @@ } size_t ftrace_data_buf_pages() const { PERFETTO_DCHECK(ftrace_data_.size() == - base::kPageSize * kFtraceDataBufSizePages); + base::GetSysPageSize() * kFtraceDataBufSizePages); return kFtraceDataBufSizePages; } CompactSchedBuffer* compact_sched_buf() const {
diff --git a/src/traced/probes/ftrace/cpu_reader_benchmark.cc b/src/traced/probes/ftrace/cpu_reader_benchmark.cc index c7db2a1..c9c9062 100644 --- a/src/traced/probes/ftrace/cpu_reader_benchmark.cc +++ b/src/traced/probes/ftrace/cpu_reader_benchmark.cc
@@ -934,11 +934,12 @@ ProtoTranslationTable* table = GetTable(test_case.name); auto repeated_pages = - std::make_unique<uint8_t[]>(base::kPageSize * page_repetition); + std::make_unique<uint8_t[]>(base::GetSysPageSize() * page_repetition); { auto page = PageFromXxd(test_case.data); for (size_t i = 0; i < page_repetition; i++) { - memcpy(&repeated_pages[i * base::kPageSize], &page[0], base::kPageSize); + memcpy(&repeated_pages[i * base::GetSysPageSize()], &page[0], + base::GetSysPageSize()); } }
diff --git a/src/traced/probes/ftrace/cpu_reader_fuzzer.cc b/src/traced/probes/ftrace/cpu_reader_fuzzer.cc index 002fd53..0559f02 100644 --- a/src/traced/probes/ftrace/cpu_reader_fuzzer.cc +++ b/src/traced/probes/ftrace/cpu_reader_fuzzer.cc
@@ -31,15 +31,9 @@ #include "protos/perfetto/trace/ftrace/ftrace_event_bundle.pbzero.h" namespace perfetto { -namespace { - -uint8_t g_page[base::kPageSize]; - -} // namespace using perfetto::protos::pbzero::FtraceEventBundle; -void FuzzCpuReaderParsePage(const uint8_t* data, size_t size); void FuzzCpuReaderProcessPagesForDataSource(const uint8_t* data, size_t size); // TODO(rsavitski): make the fuzzer generate multi-page payloads. @@ -50,8 +44,10 @@ "Could not read table. " "This fuzzer must be run in the root directory."); } - memset(g_page, 0, base::kPageSize); - memcpy(g_page, data, std::min(base::kPageSize, size)); + + static uint8_t* g_page = new uint8_t[base::GetSysPageSize()]; + memset(g_page, 0, base::GetSysPageSize()); + memcpy(g_page, data, std::min(size_t(base::GetSysPageSize()), size)); FtraceMetadata metadata{}; FtraceDataSourceConfig ds_config{/*event_filter=*/EventFilter{},
diff --git a/src/traced/probes/ftrace/cpu_reader_unittest.cc b/src/traced/probes/ftrace/cpu_reader_unittest.cc index 1e69e3d..25fc580 100644 --- a/src/traced/probes/ftrace/cpu_reader_unittest.cc +++ b/src/traced/probes/ftrace/cpu_reader_unittest.cc
@@ -164,7 +164,9 @@ class BinaryWriter { public: BinaryWriter() - : size_(base::kPageSize), page_(new uint8_t[size_]), ptr_(page_.get()) {} + : size_(base::GetSysPageSize()), + page_(new uint8_t[size_]), + ptr_(page_.get()) {} template <typename T> void Write(T t) { @@ -443,7 +445,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_EQ(44ul, page_header->size); EXPECT_FALSE(page_header->lost_events); @@ -566,7 +568,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -609,7 +611,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -653,7 +655,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -745,7 +747,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -791,7 +793,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); ASSERT_FALSE(page_header->lost_events); ASSERT_LE(parse_pos + page_header->size, page_end); @@ -867,10 +869,12 @@ // Prepare a buffer with 8 contiguous pages, with the above contents. static constexpr size_t kTestPages = 8; - std::unique_ptr<uint8_t[]> buf(new uint8_t[base::kPageSize * kTestPages]()); + std::unique_ptr<uint8_t[]> buf( + new uint8_t[base::GetSysPageSize() * kTestPages]()); for (size_t i = 0; i < kTestPages; i++) { - void* dest = buf.get() + (i * base::kPageSize); - memcpy(dest, static_cast<const void*>(test_page_order[i]), base::kPageSize); + void* dest = buf.get() + (i * base::GetSysPageSize()); + memcpy(dest, static_cast<const void*>(test_page_order[i]), + base::GetSysPageSize()); } auto compact_sched_buf = std::make_unique<CompactSchedBuffer>(); @@ -988,7 +992,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -1037,7 +1041,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -1152,7 +1156,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -1351,7 +1355,7 @@ InvalidCompactSchedEventFormatForTesting(), printk_formats); FtraceDataSourceConfig ds_config = EmptyConfig(); - FakeEventProvider provider(base::kPageSize); + FakeEventProvider provider(base::GetSysPageSize()); BinaryWriter writer; @@ -1437,7 +1441,7 @@ auto input = writer.GetCopy(); auto length = writer.written(); - BundleProvider bundle_provider(base::kPageSize); + BundleProvider bundle_provider(base::GetSysPageSize()); FtraceMetadata metadata{}; ASSERT_TRUE(CpuReader::ParseEvent( @@ -1486,7 +1490,7 @@ auto input = writer.GetCopy(); auto length = writer.written(); - BundleProvider bundle_provider(base::kPageSize); + BundleProvider bundle_provider(base::GetSysPageSize()); FtraceMetadata metadata{}; ASSERT_TRUE(CpuReader::ParseEvent( @@ -1504,7 +1508,7 @@ } TEST(CpuReaderTest, TaskRenameEvent) { - BundleProvider bundle_provider(base::kPageSize); + BundleProvider bundle_provider(base::GetSysPageSize()); BinaryWriter writer; ProtoTranslationTable* table = GetTable("android_seed_N2F62_3.10.49"); @@ -1536,7 +1540,7 @@ // zero-terminated strings in some cases. Even though it's a kernel bug, there's // no point in rejecting that. TEST(CpuReaderTest, EventNonZeroTerminated) { - BundleProvider bundle_provider(base::kPageSize); + BundleProvider bundle_provider(base::GetSysPageSize()); BinaryWriter writer; ProtoTranslationTable* table = GetTable("android_seed_N2F62_3.10.49"); @@ -1612,10 +1616,12 @@ // Prepare a buffer with 8 contiguous pages, with the above contents. static constexpr size_t kTestPages = 8; - std::unique_ptr<uint8_t[]> buf(new uint8_t[base::kPageSize * kTestPages]()); + std::unique_ptr<uint8_t[]> buf( + new uint8_t[base::GetSysPageSize() * kTestPages]()); for (size_t i = 0; i < kTestPages; i++) { - void* dest = buf.get() + (i * base::kPageSize); - memcpy(dest, static_cast<const void*>(test_page_order[i]), base::kPageSize); + void* dest = buf.get() + (i * base::GetSysPageSize()); + memcpy(dest, static_cast<const void*>(test_page_order[i]), + base::GetSysPageSize()); } ProtoTranslationTable* table = GetTable("synthetic"); @@ -1662,10 +1668,12 @@ // Prepare a buffer with 8 contiguous pages, with the above contents. static constexpr size_t kTestPages = 8; - std::unique_ptr<uint8_t[]> buf(new uint8_t[base::kPageSize * kTestPages]()); + std::unique_ptr<uint8_t[]> buf( + new uint8_t[base::GetSysPageSize() * kTestPages]()); for (size_t i = 0; i < kTestPages; i++) { - void* dest = buf.get() + (i * base::kPageSize); - memcpy(dest, static_cast<const void*>(test_page_order[i]), base::kPageSize); + void* dest = buf.get() + (i * base::GetSysPageSize()); + memcpy(dest, static_cast<const void*>(test_page_order[i]), + base::GetSysPageSize()); } ProtoTranslationTable* table = GetTable("synthetic"); @@ -1881,7 +1889,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -2365,7 +2373,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -2888,7 +2896,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_TRUE(page_header->lost_events); // data loss EXPECT_LE(parse_pos + page_header->size, page_end); @@ -2994,7 +3002,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -3296,7 +3304,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -3341,7 +3349,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end); @@ -3395,7 +3403,7 @@ std::optional<CpuReader::PageHeader> page_header = CpuReader::ParsePageHeader(&parse_pos, table->page_header_size_len()); - const uint8_t* page_end = page.get() + base::kPageSize; + const uint8_t* page_end = page.get() + base::GetSysPageSize(); ASSERT_TRUE(page_header.has_value()); EXPECT_FALSE(page_header->lost_events); EXPECT_LE(parse_pos + page_header->size, page_end);
diff --git a/src/traced/probes/ftrace/ftrace_config_muxer.cc b/src/traced/probes/ftrace/ftrace_config_muxer.cc index 0be1842..4d6019e 100644 --- a/src/traced/probes/ftrace/ftrace_config_muxer.cc +++ b/src/traced/probes/ftrace/ftrace_config_muxer.cc
@@ -574,7 +574,7 @@ requested_buffer_size_kb = kMaxPerCpuBufferSizeKb; } - size_t pages = requested_buffer_size_kb / (base::kPageSize / 1024); + size_t pages = requested_buffer_size_kb / (base::GetSysPageSize() / 1024); if (pages == 0) return 1;
diff --git a/src/traced/probes/ftrace/ftrace_config_muxer_unittest.cc b/src/traced/probes/ftrace/ftrace_config_muxer_unittest.cc index 8e83c57..835488f 100644 --- a/src/traced/probes/ftrace/ftrace_config_muxer_unittest.cc +++ b/src/traced/probes/ftrace/ftrace_config_muxer_unittest.cc
@@ -19,6 +19,7 @@ #include <memory> #include "ftrace_config_muxer.h" +#include "perfetto/ext/base/utils.h" #include "src/traced/probes/ftrace/atrace_wrapper.h" #include "src/traced/probes/ftrace/compact_sched.h" #include "src/traced/probes/ftrace/ftrace_procfs.h" @@ -53,6 +54,10 @@ "sys_read", }; +std::string PageSizeKb() { + return std::to_string(base::GetSysPageSize() / 1024); +} + class MockFtraceProcfs : public FtraceProcfs { public: MockFtraceProcfs() : FtraceProcfs("/root/") { @@ -229,17 +234,22 @@ }; TEST_F(FtraceConfigMuxerTest, ComputeCpuBufferSizeInPages) { - static constexpr size_t kMaxBufSizeInPages = 16 * 1024u; - // No buffer size given: good default (128 pages = 2mb). - EXPECT_EQ(ComputeCpuBufferSizeInPages(0), 512u); + auto Pages = [](uint32_t kb) { return kb * 1024 / base::GetSysPageSize(); }; + const size_t kMaxBufSizeInPages = Pages(64 * 1024); + + // No buffer size given: good default (2mb). + EXPECT_EQ(ComputeCpuBufferSizeInPages(0), Pages(2048)); + // Buffer size given way too big: good default. EXPECT_EQ(ComputeCpuBufferSizeInPages(10 * 1024 * 1024), kMaxBufSizeInPages); - // The limit is 64mb per CPU, 512mb is too much. EXPECT_EQ(ComputeCpuBufferSizeInPages(512 * 1024), kMaxBufSizeInPages); + // Your size ends up with less than 1 page per cpu -> 1 page. EXPECT_EQ(ComputeCpuBufferSizeInPages(3), 1u); + // You picked a good size -> your size rounded to nearest page. - EXPECT_EQ(ComputeCpuBufferSizeInPages(42), 10u); + EXPECT_EQ(ComputeCpuBufferSizeInPages(42), + 42 * 1024 / base::GetSysPageSize()); } TEST_F(FtraceConfigMuxerTest, GenericSyscallFiltering) { @@ -613,7 +623,7 @@ EXPECT_CALL(ftrace, WriteToFile("/root/events/sched/sched_switch/enable", "0")); EXPECT_CALL(ftrace, WriteToFile("/root/tracing_on", "0")); - EXPECT_CALL(ftrace, WriteToFile("/root/buffer_size_kb", "4")); + EXPECT_CALL(ftrace, WriteToFile("/root/buffer_size_kb", PageSizeKb())); EXPECT_CALL(ftrace, WriteToFile("/root/events/enable", "0")); EXPECT_CALL(ftrace, ClearFile("/root/trace")); EXPECT_CALL(ftrace, ClearFile(MatchesRegex("/root/per_cpu/cpu[0-9]/trace"))); @@ -1128,7 +1138,7 @@ EXPECT_CALL(ftrace, AppendToFile("/root/set_event", "!cgroup:cgroup_mkdir")) .WillOnce(Return(true)); EXPECT_CALL(ftrace, WriteToFile("/root/tracing_on", "0")); - EXPECT_CALL(ftrace, WriteToFile("/root/buffer_size_kb", "4")); + EXPECT_CALL(ftrace, WriteToFile("/root/buffer_size_kb", PageSizeKb())); EXPECT_CALL(ftrace, WriteToFile("/root/events/enable", "0")); EXPECT_CALL(ftrace, ClearFile("/root/trace")); EXPECT_CALL(ftrace, ClearFile(MatchesRegex("/root/per_cpu/cpu[0-9]/trace")));
diff --git a/src/traced/probes/ftrace/ftrace_controller_unittest.cc b/src/traced/probes/ftrace/ftrace_controller_unittest.cc index 5ffc6c2..c9a5ca1 100644 --- a/src/traced/probes/ftrace/ftrace_controller_unittest.cc +++ b/src/traced/probes/ftrace/ftrace_controller_unittest.cc
@@ -58,6 +58,10 @@ constexpr char kFooEnablePath[] = "/root/events/group/foo/enable"; constexpr char kBarEnablePath[] = "/root/events/group/bar/enable"; +std::string PageSizeKb() { + return std::to_string(base::GetSysPageSize() / 1024); +} + class MockTaskRunner : public base::TaskRunner { public: MOCK_METHOD(void, PostTask, (std::function<void()>), (override)); @@ -346,7 +350,8 @@ // State clearing on tracing teardown. EXPECT_CALL(*controller->procfs(), WriteToFile(kFooEnablePath, "0")); EXPECT_CALL(*controller->procfs(), WriteToFile("/root/tracing_on", "0")); - EXPECT_CALL(*controller->procfs(), WriteToFile("/root/buffer_size_kb", "4")); + EXPECT_CALL(*controller->procfs(), + WriteToFile("/root/buffer_size_kb", PageSizeKb())); EXPECT_CALL(*controller->procfs(), WriteToFile("/root/events/enable", "0")); EXPECT_CALL(*controller->procfs(), ClearFile("/root/trace")) .WillOnce(Return(true)); @@ -401,7 +406,8 @@ EXPECT_CALL(*controller->procfs(), WriteToFile(kFooEnablePath, "0")); EXPECT_CALL(*controller->procfs(), WriteToFile(kBarEnablePath, "0")); EXPECT_CALL(*controller->procfs(), WriteToFile("/root/tracing_on", "0")); - EXPECT_CALL(*controller->procfs(), WriteToFile("/root/buffer_size_kb", "4")); + EXPECT_CALL(*controller->procfs(), + WriteToFile("/root/buffer_size_kb", PageSizeKb())); EXPECT_CALL(*controller->procfs(), WriteToFile("/root/events/enable", "0")); EXPECT_CALL(*controller->procfs(), ClearFile("/root/trace")) .WillOnce(Return(true)); @@ -435,7 +441,8 @@ // State clearing on tracing teardown. EXPECT_CALL(*controller->procfs(), WriteToFile(kFooEnablePath, "0")); EXPECT_CALL(*controller->procfs(), WriteToFile("/root/tracing_on", "0")); - EXPECT_CALL(*controller->procfs(), WriteToFile("/root/buffer_size_kb", "4")); + EXPECT_CALL(*controller->procfs(), + WriteToFile("/root/buffer_size_kb", PageSizeKb())); EXPECT_CALL(*controller->procfs(), WriteToFile("/root/events/enable", "0")); EXPECT_CALL(*controller->procfs(), ClearFile("/root/trace")) .WillOnce(Return(true)); @@ -456,7 +463,8 @@ // Every time a fake data source is destroyed, the controller will reset the // buffer size to a single page. - EXPECT_CALL(*controller->procfs(), WriteToFile("/root/buffer_size_kb", "4")) + EXPECT_CALL(*controller->procfs(), + WriteToFile("/root/buffer_size_kb", PageSizeKb())) .Times(AnyNumber()); { @@ -501,9 +509,9 @@ { // You picked a good size -> your size rounded to nearest page. EXPECT_CALL(*controller->procfs(), - WriteToFile("/root/buffer_size_kb", "40")); + WriteToFile("/root/buffer_size_kb", "64")); FtraceConfig config = CreateFtraceConfig({"group/foo"}); - config.set_buffer_size_kb(42); + config.set_buffer_size_kb(65); auto data_source = controller->AddFakeDataSource(config); ASSERT_TRUE(controller->StartDataSource(data_source.get())); } @@ -511,10 +519,10 @@ { // You picked a good size -> your size rounded to nearest page. EXPECT_CALL(*controller->procfs(), - WriteToFile("/root/buffer_size_kb", "40")); + WriteToFile("/root/buffer_size_kb", "64")); FtraceConfig config = CreateFtraceConfig({"group/foo"}); ON_CALL(*controller->procfs(), NumberOfCpus()).WillByDefault(Return(2)); - config.set_buffer_size_kb(42); + config.set_buffer_size_kb(65); auto data_source = controller->AddFakeDataSource(config); ASSERT_TRUE(controller->StartDataSource(data_source.get())); } @@ -681,8 +689,9 @@ EXPECT_CALL( *controller->GetInstanceMockProcfs("secondary"), WriteToFile("/root/instances/secondary/events/group/foo/enable", "0")); - EXPECT_CALL(*controller->GetInstanceMockProcfs("secondary"), - WriteToFile("/root/instances/secondary/buffer_size_kb", "4")); + EXPECT_CALL( + *controller->GetInstanceMockProcfs("secondary"), + WriteToFile("/root/instances/secondary/buffer_size_kb", PageSizeKb())); controller->RemoveDataSource(data_source.get());
diff --git a/src/traced/probes/ftrace/ftrace_procfs.cc b/src/traced/probes/ftrace/ftrace_procfs.cc index 396ba60..f092468 100644 --- a/src/traced/probes/ftrace/ftrace_procfs.cc +++ b/src/traced/probes/ftrace/ftrace_procfs.cc
@@ -415,12 +415,12 @@ } bool FtraceProcfs::SetCpuBufferSizeInPages(size_t pages) { - if (pages * base::kPageSize > 1 * 1024 * 1024 * 1024) { + if (pages * base::GetSysPageSize() > 1 * 1024 * 1024 * 1024) { PERFETTO_ELOG("Tried to set the per CPU buffer size to more than 1gb."); return false; } std::string path = root_ + "buffer_size_kb"; - return WriteNumberToFile(path, pages * (base::kPageSize / 1024ul)); + return WriteNumberToFile(path, pages * (base::GetSysPageSize() / 1024ul)); } bool FtraceProcfs::GetTracingOn() {
diff --git a/src/traced/probes/ftrace/test/cpu_reader_support.cc b/src/traced/probes/ftrace/test/cpu_reader_support.cc index 020298b..dc386ff 100644 --- a/src/traced/probes/ftrace/test/cpu_reader_support.cc +++ b/src/traced/probes/ftrace/test/cpu_reader_support.cc
@@ -54,9 +54,9 @@ } std::unique_ptr<uint8_t[]> PageFromXxd(const std::string& text) { - auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[base::kPageSize]); + auto buffer = std::unique_ptr<uint8_t[]>(new uint8_t[base::GetSysPageSize()]); const char* ptr = text.data(); - memset(buffer.get(), 0xfa, base::kPageSize); + memset(buffer.get(), 0xfa, base::GetSysPageSize()); uint8_t* out = buffer.get(); while (*ptr != '\0') { if (*(ptr++) != ':')
diff --git a/src/tracing/core/trace_buffer_unittest.cc b/src/tracing/core/trace_buffer_unittest.cc index 6fc36f6..b98ecf0 100644 --- a/src/tracing/core/trace_buffer_unittest.cc +++ b/src/tracing/core/trace_buffer_unittest.cc
@@ -1992,16 +1992,16 @@ TEST_F(TraceBufferTest, Clone_CommitOnlyUsedSize) { const size_t kPages = 32; - const size_t kPageSize = base::GetSysPageSize(); - ResetBuffer(kPageSize * kPages); + const size_t page_size = base::GetSysPageSize(); + ResetBuffer(page_size * kPages); CreateChunk(ProducerID(1), WriterID(0), ChunkID(0)) .AddPacket(1024, static_cast<char>('a')) .CopyIntoTraceBuffer(); using base::vm_test_utils::IsMapped; auto is_only_first_page_mapped = [&](const TraceBuffer& buf) { - bool first_mapped = IsMapped(GetBufData(buf), kPageSize); - bool rest_mapped = IsMapped(GetBufData(buf) + kPageSize, kPages - 1); + bool first_mapped = IsMapped(GetBufData(buf), page_size); + bool rest_mapped = IsMapped(GetBufData(buf) + page_size, kPages - 1); return first_mapped && !rest_mapped; };