// Copyright (C) 2018 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include "src/tracing/service/packet_stream_validator.h" #include "perfetto/ext/tracing/core/slice.h" #include "perfetto/protozero/scattered_heap_buffer.h" #include "protos/perfetto/trace/ftrace/ftrace_event.pbzero.h" #include "protos/perfetto/trace/ftrace/ftrace_event_bundle.pbzero.h" #include "protos/perfetto/trace/ftrace/sched.pbzero.h" #include "protos/perfetto/trace/test_event.pbzero.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" namespace { static void BM_PacketStreamValidator(benchmark::State& state) { using namespace perfetto; // Create a packet that resembles a ftrace sched bundle. A ftrace page is // 4KB and typically contains ~64 sched events of 64 bytes each. protozero::HeapBuffered packet; auto* bundle = packet->set_ftrace_events(); bundle->set_cpu(1); for (size_t events = 0; events < 64; events++) { auto* ftrace_evt = bundle->add_event(); ftrace_evt->set_pid(12345); ftrace_evt->set_timestamp(1000ull * 1000 * 1000 * 3600 * 24 * 365); auto* sched_switch = ftrace_evt->set_sched_switch(); sched_switch->set_prev_comm("thread_name_1"); sched_switch->set_prev_pid(12345); sched_switch->set_prev_state(42); sched_switch->set_next_comm("thread_name_2"); sched_switch->set_next_pid(67890); } std::vector buf = packet.SerializeAsArray(); // Append 10 packets like the one above, splitting each packet into slices // of 512B each. Slices slices; static constexpr size_t kSliceSize = 512; for (size_t num_packets = 0; num_packets < 10; num_packets++) { for (size_t pos = 0; pos < buf.size(); pos += kSliceSize) { size_t slice_size = std::min(kSliceSize, buf.size() - pos); Slice slice = Slice::Allocate(slice_size); memcpy(slice.own_data(), &buf[pos], slice_size); slices.emplace_back(std::move(slice)); } } bool res = true; while (state.KeepRunning()) { res &= PacketStreamValidator::Validate(slices); } PERFETTO_CHECK(res); } } // namespace BENCHMARK(BM_PacketStreamValidator);