Merge "ftrace_reader: Kernel buffer size follow up"
diff --git a/include/perfetto/ftrace_reader/ftrace_controller.h b/include/perfetto/ftrace_reader/ftrace_controller.h
index b8c30e2..e72e0d1 100644
--- a/include/perfetto/ftrace_reader/ftrace_controller.h
+++ b/include/perfetto/ftrace_reader/ftrace_controller.h
@@ -64,16 +64,16 @@
   }
   const std::set<std::string>& atrace_apps() const { return atrace_apps_; }
 
-  uint32_t total_buffer_size_kb() const { return total_buffer_size_kb_; }
+  uint32_t buffer_size_kb() const { return buffer_size_kb_; }
   uint32_t drain_period_ms() const { return drain_period_ms_; }
-  void set_total_buffer_size_kb(uint32_t v) { total_buffer_size_kb_ = v; }
+  void set_buffer_size_kb(uint32_t v) { buffer_size_kb_ = v; }
   void set_drain_period_ms(uint32_t v) { drain_period_ms_ = v; }
 
  private:
   std::set<std::string> ftrace_events_;
   std::set<std::string> atrace_categories_;
   std::set<std::string> atrace_apps_;
-  uint32_t total_buffer_size_kb_ = 0;
+  uint32_t buffer_size_kb_ = 0;
   uint32_t drain_period_ms_ = 0;
 };
 
diff --git a/include/perfetto/tracing/core/data_source_config.h b/include/perfetto/tracing/core/data_source_config.h
index 4da282b..304f107 100644
--- a/include/perfetto/tracing/core/data_source_config.h
+++ b/include/perfetto/tracing/core/data_source_config.h
@@ -87,10 +87,8 @@
       return &atrace_apps_.back();
     }
 
-    uint32_t total_buffer_size_kb() const { return total_buffer_size_kb_; }
-    void set_total_buffer_size_kb(uint32_t value) {
-      total_buffer_size_kb_ = value;
-    }
+    uint32_t buffer_size_kb() const { return buffer_size_kb_; }
+    void set_buffer_size_kb(uint32_t value) { buffer_size_kb_ = value; }
 
     uint32_t drain_period_ms() const { return drain_period_ms_; }
     void set_drain_period_ms(uint32_t value) { drain_period_ms_ = value; }
@@ -99,7 +97,7 @@
     std::vector<std::string> event_names_;
     std::vector<std::string> atrace_categories_;
     std::vector<std::string> atrace_apps_;
-    uint32_t total_buffer_size_kb_ = {};
+    uint32_t buffer_size_kb_ = {};
     uint32_t drain_period_ms_ = {};
 
     // Allows to preserve unknown protobuf fields for compatibility
diff --git a/protos/perfetto/config/data_source_config.proto b/protos/perfetto/config/data_source_config.proto
index 15bada4..8aeaaea 100644
--- a/protos/perfetto/config/data_source_config.proto
+++ b/protos/perfetto/config/data_source_config.proto
@@ -29,7 +29,8 @@
     repeated string event_names = 1;
     repeated string atrace_categories = 2;
     repeated string atrace_apps = 3;
-    optional uint32 total_buffer_size_kb = 10;
+    // *Per-CPU* buffer size.
+    optional uint32 buffer_size_kb = 10;
     optional uint32 drain_period_ms = 11;
   }
 
diff --git a/protos/perfetto/config/perfetto_config.proto b/protos/perfetto/config/perfetto_config.proto
index bcc9ef2..45958bb 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -23,7 +23,8 @@
     repeated string event_names = 1;
     repeated string atrace_categories = 2;
     repeated string atrace_apps = 3;
-    optional uint32 total_buffer_size_kb = 10;
+    // *Per-CPU* buffer size.
+    optional uint32 buffer_size_kb = 10;
     optional uint32 drain_period_ms = 11;
   }
 
diff --git a/src/ftrace_reader/ftrace_controller.cc b/src/ftrace_reader/ftrace_controller.cc
index 919254d..c324115 100644
--- a/src/ftrace_reader/ftrace_controller.cc
+++ b/src/ftrace_reader/ftrace_controller.cc
@@ -71,17 +71,15 @@
 
 // Post-conditions:
 // 1. result >= 1 (should have at least one page per CPU)
-// 2. result * num_cpus * 4 < kMaxTotalBufferSizeKb
+// 2. result * 4 < kMaxTotalBufferSizeKb
 // 3. If input is 0 output is a good default number.
-size_t ComputeCpuBufferSizeInPages(uint32_t requested_buffer_size_kb,
-                                   size_t cpu_count) {
+size_t ComputeCpuBufferSizeInPages(uint32_t requested_buffer_size_kb) {
   if (requested_buffer_size_kb == 0)
     requested_buffer_size_kb = kDefaultTotalBufferSizeKb;
   if (requested_buffer_size_kb > kMaxTotalBufferSizeKb)
     requested_buffer_size_kb = kDefaultTotalBufferSizeKb;
 
-  size_t pages =
-      (requested_buffer_size_kb / cpu_count) / (base::kPageSize / 1024);
+  size_t pages = requested_buffer_size_kb / (base::kPageSize / 1024);
   if (pages == 0)
     return 1;
 
@@ -205,13 +203,12 @@
 }
 
 uint32_t FtraceController::GetCpuBufferSizeInPages() {
-  uint32_t max_total_buffer_size_kb = 0;
+  uint32_t max_buffer_size_kb = 0;
   for (const FtraceSink* sink : sinks_) {
-    if (sink->config().total_buffer_size_kb() > max_total_buffer_size_kb)
-      max_total_buffer_size_kb = sink->config().total_buffer_size_kb();
+    if (sink->config().buffer_size_kb() > max_buffer_size_kb)
+      max_buffer_size_kb = sink->config().buffer_size_kb();
   }
-  return ComputeCpuBufferSizeInPages(max_total_buffer_size_kb,
-                                     ftrace_procfs_->NumberOfCpus());
+  return ComputeCpuBufferSizeInPages(max_buffer_size_kb);
 }
 
 void FtraceController::ClearTrace() {
diff --git a/src/ftrace_reader/ftrace_controller_unittest.cc b/src/ftrace_reader/ftrace_controller_unittest.cc
index 22717b0..7f9d6b5 100644
--- a/src/ftrace_reader/ftrace_controller_unittest.cc
+++ b/src/ftrace_reader/ftrace_controller_unittest.cc
@@ -320,7 +320,7 @@
     EXPECT_CALL(*raw_ftrace_procfs,
                 WriteToFile("/root/buffer_size_kb", "8192"));
     FtraceConfig config({"foo"});
-    config.set_total_buffer_size_kb(10 * 1024 * 1024);
+    config.set_buffer_size_kb(10 * 1024 * 1024);
     auto sink = controller.CreateSink(config, &delegate);
   }
 
@@ -328,24 +328,24 @@
     // Your size ends up with less than 1 page per cpu -> 1 page.
     EXPECT_CALL(*raw_ftrace_procfs, WriteToFile("/root/buffer_size_kb", "4"));
     FtraceConfig config({"foo"});
-    config.set_total_buffer_size_kb(1);
+    config.set_buffer_size_kb(1);
     auto sink = controller.CreateSink(config, &delegate);
   }
 
   {
-    // You picked a good size -> your size / # CPUs rounded to nearest page.
+    // You picked a good size -> your size rounded to nearest page.
     EXPECT_CALL(*raw_ftrace_procfs, WriteToFile("/root/buffer_size_kb", "40"));
     FtraceConfig config({"foo"});
-    config.set_total_buffer_size_kb(42);
+    config.set_buffer_size_kb(42);
     auto sink = controller.CreateSink(config, &delegate);
   }
 
   {
-    // You picked a good size -> your size / # CPUs rounded to nearest page.
-    EXPECT_CALL(*raw_ftrace_procfs, WriteToFile("/root/buffer_size_kb", "20"));
+    // You picked a good size -> your size rounded to nearest page.
+    EXPECT_CALL(*raw_ftrace_procfs, WriteToFile("/root/buffer_size_kb", "40"));
     FtraceConfig config({"foo"});
     ON_CALL(*raw_ftrace_procfs, NumberOfCpus()).WillByDefault(Return(2));
-    config.set_total_buffer_size_kb(42);
+    config.set_buffer_size_kb(42);
     auto sink = controller.CreateSink(config, &delegate);
   }
 }
diff --git a/src/ftrace_reader/ftrace_procfs.cc b/src/ftrace_reader/ftrace_procfs.cc
index 356a589..db5975a 100644
--- a/src/ftrace_reader/ftrace_procfs.cc
+++ b/src/ftrace_reader/ftrace_procfs.cc
@@ -30,9 +30,6 @@
 namespace perfetto {
 namespace {
 
-// TODO(b/72148971): Unify with other constants.
-static constexpr size_t kPageSize = 4096;
-
 // Reading /trace produces human readable trace output.
 // Writing to this file clears all trace buffers for all CPUS.
 
@@ -127,12 +124,12 @@
 }
 
 bool FtraceProcfs::SetCpuBufferSizeInPages(size_t pages) {
-  if (pages * kPageSize > 1 * 1024 * 1024 * 1024) {
+  if (pages * base::kPageSize > 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 * (kPageSize / 1024ul));
+  return WriteNumberToFile(path, pages * (base::kPageSize / 1024ul));
 }
 
 bool FtraceProcfs::EnableTracing() {
diff --git a/src/traced/probes/ftrace_producer.cc b/src/traced/probes/ftrace_producer.cc
index 1462a50..9467c92 100644
--- a/src/traced/probes/ftrace_producer.cc
+++ b/src/traced/probes/ftrace_producer.cc
@@ -115,7 +115,7 @@
     }
   }
 
-  config.set_total_buffer_size_kb(proto_config.total_buffer_size_kb());
+  config.set_buffer_size_kb(proto_config.buffer_size_kb());
   config.set_drain_period_ms(proto_config.drain_period_ms());
 
   // TODO(hjd): Static cast is bad, target_buffer() should return a BufferID.
diff --git a/src/tracing/core/data_source_config.cc b/src/tracing/core/data_source_config.cc
index 43ad4c7..a95d60e 100644
--- a/src/tracing/core/data_source_config.cc
+++ b/src/tracing/core/data_source_config.cc
@@ -109,11 +109,10 @@
         static_cast<decltype(atrace_apps_)::value_type>(field);
   }
 
-  static_assert(
-      sizeof(total_buffer_size_kb_) == sizeof(proto.total_buffer_size_kb()),
-      "size mismatch");
-  total_buffer_size_kb_ = static_cast<decltype(total_buffer_size_kb_)>(
-      proto.total_buffer_size_kb());
+  static_assert(sizeof(buffer_size_kb_) == sizeof(proto.buffer_size_kb()),
+                "size mismatch");
+  buffer_size_kb_ =
+      static_cast<decltype(buffer_size_kb_)>(proto.buffer_size_kb());
 
   static_assert(sizeof(drain_period_ms_) == sizeof(proto.drain_period_ms()),
                 "size mismatch");
@@ -145,12 +144,10 @@
     *entry = static_cast<decltype(proto->atrace_apps(0))>(it);
   }
 
-  static_assert(
-      sizeof(total_buffer_size_kb_) == sizeof(proto->total_buffer_size_kb()),
-      "size mismatch");
-  proto->set_total_buffer_size_kb(
-      static_cast<decltype(proto->total_buffer_size_kb())>(
-          total_buffer_size_kb_));
+  static_assert(sizeof(buffer_size_kb_) == sizeof(proto->buffer_size_kb()),
+                "size mismatch");
+  proto->set_buffer_size_kb(
+      static_cast<decltype(proto->buffer_size_kb())>(buffer_size_kb_));
 
   static_assert(sizeof(drain_period_ms_) == sizeof(proto->drain_period_ms()),
                 "size mismatch");
diff --git a/test/configs/atrace.cfg b/test/configs/atrace.cfg
index 3907ba4..7b6dd8a 100644
--- a/test/configs/atrace.cfg
+++ b/test/configs/atrace.cfg
@@ -11,7 +11,7 @@
     target_buffer: 0
     ftrace_config {
       event_names: "sched_switch"
-      total_buffer_size_kb: 1344 # 4 (page size) * 8 (# cpus) * 42
+      buffer_size_kb: 168  # 4 (page size) * 42
       drain_period_ms: 42
     }
   }
diff --git a/test/configs/ftrace.cfg b/test/configs/ftrace.cfg
index 352671e..df3082e 100644
--- a/test/configs/ftrace.cfg
+++ b/test/configs/ftrace.cfg
@@ -9,7 +9,7 @@
     name: "com.google.perfetto.ftrace"
     target_buffer: 0
     ftrace_config {
-      total_buffer_size_kb: 1344 # 4 (page size) * 8 (# cpus) * 10
+      buffer_size_kb: 40 # 4 (page size) * 10
       drain_period_ms: 200
       event_names: "cpufreq_interactive_setspeed"
       event_names: "cpufreq_interactive_target"