• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""
2kvm_stat prints statistics generated by the kvm module.
3It depends on debugfs. If no debugfs is mounted, the profiler
4will try to mount it so it's possible to proceed.
5
6@copyright: Red Hat 2010
7@author: Lucas Meneghel Rodrigues (lmr@redhat.com)
8"""
9import time, os, subprocess, commands, logging
10from autotest_lib.client.bin import utils, profiler, os_dep
11from autotest_lib.client.common_lib import error
12
13
14class kvm_stat(profiler.profiler):
15    """
16    kvm_stat based profiler. Consists on executing kvm_stat -l during a given
17    test execution, redirecting its output to a file on the profile dir.
18    """
19    version = 1
20    def initialize(self):
21        """
22        Gets path of kvm_stat and verifies if debugfs needs to be mounted.
23        """
24        self.is_enabled = False
25
26        kvm_stat_installed = False
27        try:
28            self.stat_path = os_dep.command('kvm_stat')
29            kvm_stat_installed = True
30        except ValueError:
31            logging.error('Command kvm_stat not present')
32
33        if kvm_stat_installed:
34            try:
35                utils.run("%s --batch" % self.stat_path)
36                self.is_enabled = True
37            except error.CmdError, e:
38                if 'debugfs' in str(e):
39                    try:
40                        utils.run('mount -t debugfs debugfs /sys/kernel/debug')
41                    except error.CmdError, e:
42                        logging.error('Failed to mount debugfs:\n%s', str(e))
43                else:
44                    logging.error('Failed to execute kvm_stat:\n%s', str(e))
45
46
47    def start(self, test):
48        """
49        Starts kvm_stat subprocess.
50
51        @param test: Autotest test on which this profiler will operate on.
52        """
53        if self.is_enabled:
54            cmd = "%s -l" % self.stat_path
55            logfile = open(os.path.join(test.profdir, "kvm_stat"), 'w')
56            p = subprocess.Popen(cmd, shell=True, stdout=logfile,
57                                 stderr=subprocess.STDOUT)
58            self.pid = p.pid
59        else:
60            logging.error('Asked for kvm_stat profiler, but kvm_stat not '
61                          'present')
62
63
64    def stop(self, test):
65        """
66        Stops profiler execution by sending a SIGTERM to kvm_stat process.
67
68        @param test: Autotest test on which this profiler will operate on.
69        """
70        if self.is_enabled:
71            try:
72                os.kill(self.pid, 15)
73            except OSError:
74                pass
75
76
77    def report(self, test):
78        """
79        Report function. Does nothing as there's no postprocesing needed.
80
81        @param test: Autotest test on which this profiler will operate on.
82        """
83        return None
84