aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrimiano Tucci <primiano@google.com>2018-04-30 16:48:41 +0100
committerPrimiano Tucci <primiano@google.com>2018-05-01 10:15:38 +0100
commit18bee92239d27fe178ab7fe520de237a17e0b264 (patch)
treeb08e07fcc7a57150a9e252a534ddb644d77462de
parente81a3eda4818e0b6fce302c89eaaeb99459afa2a (diff)
downloadperfetto-18bee92239d27fe178ab7fe520de237a17e0b264.tar.gz
perfetto: bump max cpu buffer size in ftrace
Turns out 2MB is too small and we can get overwrites in the ftrace kernel buffer in this situation. Bump to prevent potential issues from happening. Bug: 78765090 Change-Id: If80ff33e39b7c6938a652c90cd988fd77bd853b8 Merged-In: If80ff33e39b7c6938a652c90cd988fd77bd853b8 (cherry picked from commit a7828e63b82d0876a47272a750a8d258e2b0787c)
-rw-r--r--src/ftrace_reader/ftrace_config_muxer.cc12
-rw-r--r--src/ftrace_reader/ftrace_config_muxer_unittest.cc7
-rw-r--r--src/ftrace_reader/ftrace_controller_unittest.cc10
3 files changed, 17 insertions, 12 deletions
diff --git a/src/ftrace_reader/ftrace_config_muxer.cc b/src/ftrace_reader/ftrace_config_muxer.cc
index 81c4bc3a7..331ddc334 100644
--- a/src/ftrace_reader/ftrace_config_muxer.cc
+++ b/src/ftrace_reader/ftrace_config_muxer.cc
@@ -33,8 +33,8 @@ namespace {
// trace_clocks in preference order.
constexpr const char* kClocks[] = {"boot", "global", "local"};
-constexpr int kDefaultPerCpuBufferSizeKb = 512; // 512kb
-constexpr int kMaxPerCpuBufferSizeKb = 2 * 1024; // 2mb
+constexpr int kDefaultPerCpuBufferSizeKb = 512; // 512kb
+constexpr int kMaxPerCpuBufferSizeKb = 64 * 1024; // 64mb
std::vector<std::string> difference(const std::set<std::string>& a,
const std::set<std::string>& b) {
@@ -209,8 +209,12 @@ std::set<std::string> GetFtraceEvents(const FtraceConfig& request,
size_t ComputeCpuBufferSizeInPages(size_t requested_buffer_size_kb) {
if (requested_buffer_size_kb == 0)
requested_buffer_size_kb = kDefaultPerCpuBufferSizeKb;
- if (requested_buffer_size_kb > kMaxPerCpuBufferSizeKb)
- requested_buffer_size_kb = kDefaultPerCpuBufferSizeKb;
+ if (requested_buffer_size_kb > kMaxPerCpuBufferSizeKb) {
+ PERFETTO_ELOG(
+ "The requested ftrace buf size (%zu KB) is too big, capping to %d KB",
+ requested_buffer_size_kb, kMaxPerCpuBufferSizeKb);
+ requested_buffer_size_kb = kMaxPerCpuBufferSizeKb;
+ }
size_t pages = requested_buffer_size_kb / (base::kPageSize / 1024);
if (pages == 0)
diff --git a/src/ftrace_reader/ftrace_config_muxer_unittest.cc b/src/ftrace_reader/ftrace_config_muxer_unittest.cc
index 673422c8a..804211701 100644
--- a/src/ftrace_reader/ftrace_config_muxer_unittest.cc
+++ b/src/ftrace_reader/ftrace_config_muxer_unittest.cc
@@ -134,12 +134,13 @@ std::unique_ptr<ProtoTranslationTable> CreateFakeTable() {
}
TEST(FtraceConfigMuxerTest, ComputeCpuBufferSizeInPages) {
+ static constexpr size_t kMaxBufSizeInPages = 16 * 1024u;
// No buffer size given: good default (128 pages = 512kb).
EXPECT_EQ(ComputeCpuBufferSizeInPages(0), 128u);
// Buffer size given way too big: good default.
- EXPECT_EQ(ComputeCpuBufferSizeInPages(10 * 1024 * 1024), 128u);
- // The limit is 2mb per CPU, 3mb is too much.
- EXPECT_EQ(ComputeCpuBufferSizeInPages(3 * 1024), 128u);
+ 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.
diff --git a/src/ftrace_reader/ftrace_controller_unittest.cc b/src/ftrace_reader/ftrace_controller_unittest.cc
index 5e3163d9e..361c0a635 100644
--- a/src/ftrace_reader/ftrace_controller_unittest.cc
+++ b/src/ftrace_reader/ftrace_controller_unittest.cc
@@ -516,21 +516,21 @@ TEST(FtraceControllerTest, BufferSize) {
}
{
- // Way too big buffer size -> good default.
+ // Way too big buffer size -> max size.
EXPECT_CALL(*controller->procfs(),
- WriteToFile("/root/buffer_size_kb", "512"));
+ WriteToFile("/root/buffer_size_kb", "65536"));
FtraceConfig config = CreateFtraceConfig({"foo"});
config.set_buffer_size_kb(10 * 1024 * 1024);
auto sink = controller->CreateSink(config, &delegate);
}
{
- // The limit is 8mb, 9mb is too much.
+ // The limit is 64mb, 65mb is too much.
EXPECT_CALL(*controller->procfs(),
- WriteToFile("/root/buffer_size_kb", "512"));
+ WriteToFile("/root/buffer_size_kb", "65536"));
FtraceConfig config = CreateFtraceConfig({"foo"});
ON_CALL(*controller->procfs(), NumberOfCpus()).WillByDefault(Return(2));
- config.set_buffer_size_kb(9 * 1024);
+ config.set_buffer_size_kb(65 * 1024);
auto sink = controller->CreateSink(config, &delegate);
}