[coastguard skipped] Merge sparse cherrypicks from sparse-11499594-L82800030002180385 into udc-d2-release.
COASTGUARD_SKIP: I66a38a7244c0fd5841e24283b16f5ff9db265933
COASTGUARD_SKIP: Ie53ee2b854cf2da488d115623dbdcf959fbacade
Change-Id: I99b80579c0afc888368e7e0ddfa2849e4c5573da
diff --git a/src/tracing/core/trace_buffer.cc b/src/tracing/core/trace_buffer.cc
index e25aaf6..baa6a34 100644
--- a/src/tracing/core/trace_buffer.cc
+++ b/src/tracing/core/trace_buffer.cc
@@ -75,7 +75,6 @@
return false;
}
size_ = size;
- used_size_ = 0;
stats_.set_buffer_size(size);
max_chunk_size_ = std::min(size, ChunkRecord::kMaxSize);
wptr_ = begin();
@@ -915,8 +914,8 @@
// The assignments below must be done after Initialize().
- EnsureCommitted(src.used_size_);
- memcpy(data_.Get(), src.data_.Get(), src.used_size_);
+ data_.EnsureCommitted(data_.size());
+ memcpy(data_.Get(), src.data_.Get(), src.data_.size());
last_chunk_id_written_ = src.last_chunk_id_written_;
stats_ = src.stats_;
diff --git a/src/tracing/core/trace_buffer.h b/src/tracing/core/trace_buffer.h
index ca58957..f6994ba 100644
--- a/src/tracing/core/trace_buffer.h
+++ b/src/tracing/core/trace_buffer.h
@@ -284,7 +284,6 @@
const WriterStatsMap& writer_stats() const { return writer_stats_; }
const TraceStats::BufferStats& stats() const { return stats_; }
size_t size() const { return size_; }
- size_t used_size() const { return used_size_; }
private:
friend class TraceBufferTest;
@@ -610,16 +609,11 @@
ChunkRecord* GetChunkRecordAt(uint8_t* ptr) {
DcheckIsAlignedAndWithinBounds(ptr);
// We may be accessing a new (empty) record.
- EnsureCommitted(static_cast<size_t>(ptr + sizeof(ChunkRecord) - begin()));
+ data_.EnsureCommitted(
+ static_cast<size_t>(ptr + sizeof(ChunkRecord) - begin()));
return reinterpret_cast<ChunkRecord*>(ptr);
}
- void EnsureCommitted(size_t size) {
- PERFETTO_DCHECK(size <= size_);
- data_.EnsureCommitted(size);
- used_size_ = std::max(used_size_, size);
- }
-
void DiscardWrite();
// |src| can be nullptr (in which case |size| must be ==
@@ -641,7 +635,7 @@
DcheckIsAlignedAndWithinBounds(wptr);
// We may be writing to this area for the first time.
- EnsureCommitted(static_cast<size_t>(wptr + record.size - begin()));
+ data_.EnsureCommitted(static_cast<size_t>(wptr + record.size - begin()));
// Deliberately not a *D*CHECK.
PERFETTO_CHECK(wptr + sizeof(record) + size <= end());
@@ -678,12 +672,6 @@
base::PagedMemory data_;
size_t size_ = 0; // Size in bytes of |data_|.
-
- // High watermark. The number of bytes (<= |size_|) written into the buffer
- // before the first wraparound. This increases as data is written into the
- // buffer and then saturates at |size_|. Used for CloneReadOnly().
- size_t used_size_ = 0;
-
size_t max_chunk_size_ = 0; // Max size in bytes allowed for a chunk.
uint8_t* wptr_ = nullptr; // Write pointer.
diff --git a/src/tracing/core/trace_buffer_unittest.cc b/src/tracing/core/trace_buffer_unittest.cc
index 44847dd..38d343d 100644
--- a/src/tracing/core/trace_buffer_unittest.cc
+++ b/src/tracing/core/trace_buffer_unittest.cc
@@ -26,7 +26,6 @@
#include "perfetto/ext/tracing/core/shared_memory_abi.h"
#include "perfetto/ext/tracing/core/trace_packet.h"
#include "perfetto/protozero/proto_utils.h"
-#include "src/base/test/vm_test_utils.h"
#include "src/tracing/core/trace_buffer.h"
#include "src/tracing/test/fake_packet.h"
#include "test/gtest_and_gmock.h"
@@ -50,22 +49,6 @@
static constexpr uint8_t kChunkNeedsPatching =
SharedMemoryABI::ChunkHeader::kChunkNeedsPatching;
- void TearDown() override {
- // Test that the used_size() logic works and that all the data after that
- // is zero-filled.
- if (trace_buffer_) {
- const size_t used_size = trace_buffer_->used_size();
- ASSERT_LE(used_size, trace_buffer_->size());
- trace_buffer_->EnsureCommitted(trace_buffer_->size());
- bool zero_padded = true;
- for (size_t i = used_size; i < trace_buffer_->size(); ++i) {
- bool is_zero = static_cast<char*>(trace_buffer_->data_.Get())[i] == 0;
- zero_padded = zero_padded && is_zero;
- }
- ASSERT_TRUE(zero_padded);
- }
- }
-
FakeChunk CreateChunk(ProducerID p, WriterID w, ChunkID c) {
return FakeChunk(trace_buffer_.get(), p, w, c);
}
@@ -161,7 +144,6 @@
return keys;
}
- uint8_t* GetBufData(const TraceBuffer& buf) { return buf.begin(); }
TraceBuffer* trace_buffer() { return trace_buffer_.get(); }
size_t size_to_end() { return trace_buffer_->size_to_end(); }
@@ -1872,8 +1854,6 @@
.CopyIntoTraceBuffer());
}
- ASSERT_EQ(trace_buffer()->used_size(), 32u * kNumWriters);
-
// Make some reads *before* cloning. This is to check that the behaviour of
// CloneReadOnly() is not affected by reads made before cloning.
// On every round (|num_pre_reads|), read a different number of packets.
@@ -1886,7 +1866,6 @@
// Now create a snapshot and make sure we always read all the packets.
std::unique_ptr<TraceBuffer> snap = trace_buffer()->CloneReadOnly();
- ASSERT_EQ(snap->used_size(), 32u * kNumWriters);
snap->BeginRead();
for (char i = 'A'; i < 'A' + kNumWriters; i++) {
auto frags = ReadPacket(snap);
@@ -1950,69 +1929,4 @@
ASSERT_THAT(ReadPacket(snap), IsEmpty());
}
-TEST_F(TraceBufferTest, Clone_Wrapping) {
- ResetBuffer(4096);
- const size_t kFrgSize = 1024 - 16; // For perfect wrapping every 4 fragments.
- for (WriterID i = 0; i < 6; i++) {
- CreateChunk(ProducerID(1), WriterID(i), ChunkID(0))
- .AddPacket(kFrgSize, static_cast<char>('a' + i))
- .CopyIntoTraceBuffer();
- }
- std::unique_ptr<TraceBuffer> snap = trace_buffer()->CloneReadOnly();
- ASSERT_EQ(snap->used_size(), snap->size());
- snap->BeginRead();
- ASSERT_THAT(ReadPacket(snap), ElementsAre(FakePacketFragment(kFrgSize, 'c')));
- ASSERT_THAT(ReadPacket(snap), ElementsAre(FakePacketFragment(kFrgSize, 'd')));
- ASSERT_THAT(ReadPacket(snap), ElementsAre(FakePacketFragment(kFrgSize, 'e')));
- ASSERT_THAT(ReadPacket(snap), ElementsAre(FakePacketFragment(kFrgSize, 'f')));
- ASSERT_THAT(ReadPacket(snap), IsEmpty());
-}
-
-TEST_F(TraceBufferTest, Clone_WrappingWithPadding) {
- ResetBuffer(4096);
- // First create one 2KB chunk, so the contents are [aaaaaaaa00000000].
- CreateChunk(ProducerID(1), WriterID(0), ChunkID(0))
- .AddPacket(2048, static_cast<char>('a'))
- .CopyIntoTraceBuffer();
-
- // Then write a 3KB chunk that fits in the buffer, but requires zero padding
- // and restarting from the beginning, so the contents are [bbbbbbbbbbbb0000].
- CreateChunk(ProducerID(1), WriterID(1), ChunkID(0))
- .AddPacket(3192, static_cast<char>('b'))
- .CopyIntoTraceBuffer();
-
- ASSERT_EQ(trace_buffer()->used_size(), trace_buffer()->size());
- std::unique_ptr<TraceBuffer> snap = trace_buffer()->CloneReadOnly();
- ASSERT_EQ(snap->used_size(), snap->size());
- snap->BeginRead();
- ASSERT_THAT(ReadPacket(snap), ElementsAre(FakePacketFragment(3192, 'b')));
- ASSERT_THAT(ReadPacket(snap), IsEmpty());
-}
-
-TEST_F(TraceBufferTest, Clone_CommitOnlyUsedSize) {
- const size_t kPages = 32;
- const size_t kPageSize = base::GetSysPageSize();
- ResetBuffer(kPageSize * 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);
- return first_mapped && !rest_mapped;
- };
-
- // If the test doesn't work as expected until here, there is no point checking
- // that the same assumptions hold true on the cloned buffer. Various platforms
- // can legitimately pre-fetch memory even if we don't page fault (also asan).
- if (!is_only_first_page_mapped(*trace_buffer()))
- GTEST_SKIP() << "VM commit detection not supported";
-
- std::unique_ptr<TraceBuffer> snap = trace_buffer()->CloneReadOnly();
- ASSERT_EQ(snap->used_size(), trace_buffer()->used_size());
- ASSERT_TRUE(is_only_first_page_mapped(*snap));
-}
-
} // namespace perfetto