普通文本  |  164行  |  5.46 KB

// Copyright 2016 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "perf_test_files.h"

namespace perf_test_files {

const std::vector<const char*>& GetPerfDataFiles() {
  static const std::vector<const char*>* files = new std::vector<const char*>{
      // The following perf data contains the following event types, as passed
      // to perf record via the -e option:
      // - cycles
      // - instructions
      // - cache-references
      // - cache-misses
      // - branches
      // - branch-misses

      // Obtained with "perf record -- echo > /dev/null"
      "perf.data.singleprocess-3.4",

      // Obtained with "perf record -a -- sleep $N", for N in {0, 1, 5}.
      "perf.data.systemwide.0-3.4",
#ifdef TEST_LARGE_PERF_DATA
      "perf.data.systemwide.1-3.4",
      "perf.data.systemwide.5-3.4",

      // Obtained with "perf record -a -- sleep $N", for N in {0, 1, 5}.
      // While in the background, this loop is running:
      //   while true; do ls > /dev/null; done
      "perf.data.busy.0-3.4",
      "perf.data.busy.1-3.4",
      "perf.data.busy.5-3.4",
#endif  // defined(TEST_LARGE_PERF_DATA)

      // Obtained with "perf record -a -- sleep 2"
      // While in the background, this loop is running:
      //   while true; do restart powerd; sleep .2; done
      "perf.data.forkexit-3.4",

#ifdef TEST_CALLGRAPH
      // Obtained with "perf record -a -g -- sleep 2"
      "perf.data.callgraph-3.4",
#endif
      // Obtained with "perf record -a -b -- sleep 2"
      "perf.data.branch-3.4",
#ifdef TEST_CALLGRAPH
      // Obtained with "perf record -a -g -b -- sleep 2"
      "perf.data.callgraph_and_branch-3.4",
#endif

      // Obtained with "perf record -a -R -- sleep 2"
      "perf.data.raw-3.4",
#ifdef TEST_CALLGRAPH
      // Obtained with "perf record -a -R -g -b -- sleep 2"
      "perf.data.raw_callgraph_branch-3.4",
#endif

      // Data from other architectures.
      "perf.data.i686-3.4",   // 32-bit x86
      "perf.data.armv7-3.4",  // ARM v7

      // Same as above, obtained from a system running kernel v3.8.
      "perf.data.singleprocess-3.8",
      "perf.data.systemwide.0-3.8",
#ifdef TEST_LARGE_PERF_DATA
      "perf.data.systemwide.1-3.8",
      "perf.data.systemwide.5-3.8",
      "perf.data.busy.0-3.8",
      "perf.data.busy.1-3.8",
      "perf.data.busy.5-3.8",
#endif  // defined(TEST_LARGE_PERF_DATA)

      "perf.data.forkexit-3.8",
#ifdef TEST_CALLGRAPH
      "perf.data.callgraph-3.8",
#endif
      "perf.data.branch-3.8",
#ifdef TEST_CALLGRAPH
      "perf.data.callgraph_and_branch-3.8",
#endif
      "perf.data.armv7.perf_3.14-3.8",  // ARM v7 obtained using perf 3.14.

      // Obtained from a system that uses NUMA topology.
      "perf.data.numatopology-3.2",

      // Obtained to test GROUP_DESC feature
      "perf.data.group_desc-4.4",

      // Perf data that contains hardware and software events.
      // Command:
      //    perf record -a -c 1000000 -e cycles,branch-misses,cpu-clock -- \
      //    sleep 2
      // HW events are cycles and branch-misses, SW event is cpu-clock.
      // This also tests non-consecutive event types.
      "perf.data.hw_and_sw-3.4",

      // This test first mmap()s a DSO, then fork()s to copy the mapping to the
      // child and then modifies the mapping by mmap()ing a DSO on top of the
      // old one. It then records SAMPLEs events in the child. It ensures the
      // SAMPLEs in the child are attributed to the first DSO that was mmap()ed,
      // not the second one.
      "perf.data.remmap-3.2",

      // This is sample with a frequency higher than the max frequency, so it
      // has throttle and unthrottle events.
      "perf.data.throttle-3.8",

      // Perf data that contains intel pt events from perf-4.14
      // Command:
      //    perf record -e intel_pt// -e cycles -o /tmp/perf.data.intel_pt-4.14
      //    -- echo "Hello, World!"
      "perf.data.intel_pt-4.14",
  };
  return *files;
}

const std::vector<const char*>& GetPerfPipedDataFiles() {
  static const std::vector<const char*>* files = new std::vector<const char*>{
      "perf.data.piped.target-3.4",
      "perf.data.piped.target.throttled-3.4",
      "perf.data.piped.target-3.8",

      /* Piped data that contains hardware and software events.
       * Command:
       *    perf record -a -c 1000000 -e cycles,branch-misses,cpu-clock -o - \
       *    -- sleep 2
       * HW events are cycles and branch-misses, SW event is cpu-clock.
       */
      "perf.data.piped.hw_and_sw-3.4",

      // Piped data with extra data at end.
      "perf.data.piped.extrabyte-3.4",
      "perf.data.piped.extradata-3.4",

      // Perf data that contains intel pt events collected in piped mode from
      // perf-4.14
      // Command:
      //    perf record -e intel_pt// -e cycles -o - -- echo "Hello, World!" | \
      //    cat &> /tmp/perf.data.piped.intel_pt-4.14
      "perf.data.piped.intel_pt-4.14",
  };
  return *files;
}

const std::vector<const char*>& GetCorruptedPerfPipedDataFiles() {
  static const std::vector<const char*>* files = new std::vector<const char*>{
      // Has a SAMPLE event with size set to zero. Don't go into an infinite
      // loop.
      "perf.data.piped.corrupted.zero_size_sample-3.2",
  };
  return *files;
}

const std::vector<const char*>& GetPerfDataProtoFiles() {
  static const std::vector<const char*>* files = new std::vector<const char*>{
      "perf.callgraph.pb_text",
  };
  return *files;
}

}  // namespace perf_test_files