| """ |
| kvm_stat prints statistics generated by the kvm module. |
| It depends on debugfs. If no debugfs is mounted, the profiler |
| will try to mount it so it's possible to proceed. |
| |
| @copyright: Red Hat 2010 |
| @author: Lucas Meneghel Rodrigues (lmr@redhat.com) |
| """ |
| import time, os, subprocess, commands, logging |
| from autotest_lib.client.bin import utils, profiler, os_dep |
| from autotest_lib.client.common_lib import error |
| |
| |
| class kvm_stat(profiler.profiler): |
| """ |
| kvm_stat based profiler. Consists on executing kvm_stat -l during a given |
| test execution, redirecting its output to a file on the profile dir. |
| """ |
| version = 1 |
| def initialize(self): |
| """ |
| Gets path of kvm_stat and verifies if debugfs needs to be mounted. |
| """ |
| self.is_enabled = False |
| |
| kvm_stat_installed = False |
| try: |
| self.stat_path = os_dep.command('kvm_stat') |
| kvm_stat_installed = True |
| except ValueError: |
| logging.error('Command kvm_stat not present') |
| |
| if kvm_stat_installed: |
| try: |
| utils.run("%s --batch" % self.stat_path) |
| self.is_enabled = True |
| except error.CmdError, e: |
| if 'debugfs' in str(e): |
| try: |
| utils.run('mount -t debugfs debugfs /sys/kernel/debug') |
| except error.CmdError, e: |
| logging.error('Failed to mount debugfs:\n%s', str(e)) |
| else: |
| logging.error('Failed to execute kvm_stat:\n%s', str(e)) |
| |
| |
| def start(self, test): |
| """ |
| Starts kvm_stat subprocess. |
| |
| @param test: Autotest test on which this profiler will operate on. |
| """ |
| if self.is_enabled: |
| cmd = "%s -l" % self.stat_path |
| logfile = open(os.path.join(test.profdir, "kvm_stat"), 'w') |
| p = subprocess.Popen(cmd, shell=True, stdout=logfile, |
| stderr=subprocess.STDOUT) |
| self.pid = p.pid |
| else: |
| logging.error('Asked for kvm_stat profiler, but kvm_stat not ' |
| 'present') |
| |
| |
| def stop(self, test): |
| """ |
| Stops profiler execution by sending a SIGTERM to kvm_stat process. |
| |
| @param test: Autotest test on which this profiler will operate on. |
| """ |
| if self.is_enabled: |
| try: |
| os.kill(self.pid, 15) |
| except OSError: |
| pass |
| |
| |
| def report(self, test): |
| """ |
| Report function. Does nothing as there's no postprocesing needed. |
| |
| @param test: Autotest test on which this profiler will operate on. |
| """ |
| return None |