xref: /aosp_15_r20/external/autotest/client/profilers/lockmeter/lockmeter.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li"""
3*9c5db199SXin LiLockstat is the basic tool used to control the kernel's Lockmeter
4*9c5db199SXin Lifunctionality:  e.g., turning the kernel's data gathering on or off, and
5*9c5db199SXin Liretrieving that data from the kernel so that Lockstat can massage it and
6*9c5db199SXin Liproduce printed reports.  See http://oss.sgi.com/projects/lockmeter for
7*9c5db199SXin Lidetails.
8*9c5db199SXin Li
9*9c5db199SXin LiNOTE: if you get compile errors from config.h, referring you to a FAQ,
10*9c5db199SXin Liyou might need to do 'cat < /dev/null > /usr/include/linux/config.h'.
11*9c5db199SXin LiBut read the FAQ first.
12*9c5db199SXin Li"""
13*9c5db199SXin Lifrom __future__ import absolute_import
14*9c5db199SXin Lifrom __future__ import division
15*9c5db199SXin Lifrom __future__ import print_function
16*9c5db199SXin Li
17*9c5db199SXin Liimport os
18*9c5db199SXin Lifrom autotest_lib.client.bin import utils, profiler
19*9c5db199SXin Li
20*9c5db199SXin Liclass lockmeter(profiler.profiler):
21*9c5db199SXin Li    version = 1
22*9c5db199SXin Li
23*9c5db199SXin Li# ftp://oss.sgi.com/projects/lockmeter/download/lockstat-1.4.11.tar.gz
24*9c5db199SXin Li# patched with lockstat.diff
25*9c5db199SXin Li# ftp://oss.sgi.com/projects/lockmeter/download/v2.6/patch.2.6.14-lockmeter-1.gz
26*9c5db199SXin Li# is the kernel patch
27*9c5db199SXin Li
28*9c5db199SXin Li    def setup(self, tarball = 'lockstat-1.4.11.tar.bz2'):
29*9c5db199SXin Li        self.tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir)
30*9c5db199SXin Li        utils.extract_tarball_to_dir(self.tarball, self.srcdir)
31*9c5db199SXin Li        os.chdir(self.srcdir)
32*9c5db199SXin Li
33*9c5db199SXin Li        utils.make()
34*9c5db199SXin Li        self.cmd = self.srcdir + '/lockstat'
35*9c5db199SXin Li
36*9c5db199SXin Li
37*9c5db199SXin Li    def initialize(self):
38*9c5db199SXin Li        self.job.require_gcc()
39*9c5db199SXin Li
40*9c5db199SXin Li        if not os.path.exists('/proc/lockmeter'):
41*9c5db199SXin Li            msg = ('Lockmeter is not compiled into your kernel'
42*9c5db199SXin Li                   'Please fix and try again')
43*9c5db199SXin Li            print(msg)
44*9c5db199SXin Li            raise AssertionError(msg)
45*9c5db199SXin Li
46*9c5db199SXin Li
47*9c5db199SXin Li    def start(self, test):
48*9c5db199SXin Li        utils.system(self.cmd + ' off')
49*9c5db199SXin Li        utils.system(self.cmd + ' reset')
50*9c5db199SXin Li        utils.system(self.cmd + ' on')
51*9c5db199SXin Li
52*9c5db199SXin Li
53*9c5db199SXin Li    def stop(self, test):
54*9c5db199SXin Li        utils.system(self.cmd + ' off')
55*9c5db199SXin Li
56*9c5db199SXin Li
57*9c5db199SXin Li    def report(self, test):
58*9c5db199SXin Li        args = ' -m ' + utils.get_systemmap()
59*9c5db199SXin Li        self.output = self.profdir + '/results/lockstat'
60*9c5db199SXin Li        utils.system(self.cmd + args + ' print > ' + self.output)
61