Home | History | Annotate | Download | only in kernel_PerfEventRename
      1 #!/usr/bin/python
      2 #
      3 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 import logging
      8 import os
      9 import re
     10 import tempfile
     11 
     12 from autotest_lib.client.bin import test, utils
     13 from autotest_lib.client.common_lib import error
     14 
     15 class kernel_PerfEventRename(test.test):
     16     """
     17     Test perf's ability to deal with processes which have changed their name
     18     after perf record starts.  Older versions of perf lost their data about
     19     which executables or libraries were mapped so all the samples would end
     20     up being called unknown and this would make the profiles useless.
     21 
     22     Good output:
     23         97.43%        149  foobar_name  perf-rename-test   [.] 0x000006f8
     24     Bad output:
     25         96.54%        140  foobar_name  [unknown]          [.] 0x777046f3
     26     """
     27     version = 1
     28     executable = 'perf-rename-test'
     29 
     30     # This runs during the build process
     31     def setup(self):
     32         os.chdir(self.srcdir)
     33         utils.make(self.executable)
     34 
     35     def run_once(self):
     36         # the rename program runs a crc loop for a while to ensure that we get
     37         # a good number of samples
     38         loops = 10 * 1000 * 1000
     39         rename_name = 'foobar_name'
     40         (data_tmpfile, data_name) = tempfile.mkstemp(
     41             prefix='perfEventRename_data.', dir='/tmp')
     42 
     43         utils.system('perf record -o %s %s %s %s' %
     44                      (data_name, os.path.join(self.srcdir,
     45                                               self.executable),
     46                       rename_name, loops),
     47                      timeout=60)
     48         report = utils.system_output('perf report -n -i %s' % (data_name))
     49         logging.debug('report output: %s' % report)
     50         os.unlink(data_name)
     51 
     52         for line in report.splitlines():
     53             # The first several lines of output should be comments with '#'
     54             if re.match('^#', line):
     55                 continue
     56 
     57             stuff = line.split()
     58             # there's a slight risk that we might get an unknown sample
     59             # somewhere in the mix, and I've seen this more often on some
     60             # platforms where there is high "skid" or imprecision.
     61             # So we'll mitigate that by only checking the first line after
     62             # the comments, which should be in the crc loop and the majority
     63             # of samples
     64             if stuff[3] == '[unknown]':
     65                 logging.info('bad report entry: %s' % line)
     66                 raise error.TestFail
     67             else:
     68                 return True
     69 
     70