| """ |
| Autotest profiler for blktrace |
| blktrace - generate traces of the i/o traffic on block devices |
| """ |
| import os |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.bin import profiler, utils |
| |
| |
| class blktrace(profiler.profiler): |
| version = 2 |
| |
| def initialize(self, **dargs): |
| self.mountpoint = '/sys/kernel/debug' |
| self.blktrace = os.path.join(self.srcdir, 'blktrace') |
| self.blkparse = os.path.join(self.srcdir, 'blkparse') |
| self.blktrace_job = None |
| |
| self.job.require_gcc() |
| self.job.setup_dep(['libaio']) |
| ldflags = '-L ' + self.job.autodir + '/deps/libaio/lib' |
| cflags = '-I ' + self.job.autodir + '/deps/libaio/include' |
| self.gcc_flags = ldflags + ' ' + cflags |
| self.device = dargs.get('device', None) |
| |
| |
| def setup(self, tarball='blktrace.tar.bz2', **dargs): |
| # v1.0.1, pulled from git, 2009/06/10 |
| # commit 1e09f6e9012826fca69fa07222b7bc53c3e629ee |
| self.tarball = utils.unmap_url(self.bindir, tarball, self.tmpdir) |
| utils.extract_tarball_to_dir(self.tarball, self.srcdir) |
| os.chdir(self.srcdir) |
| utils.make('"CFLAGS=' + self.gcc_flags + '"') |
| |
| |
| def get_device(self, test): |
| if getattr(test, 'device', None): |
| device = test.device |
| else: |
| if self.device: |
| device=self.device |
| else: |
| raise error.TestWarn('No device specified for blktrace') |
| return device |
| |
| |
| def start(self, test): |
| result = utils.system("mount | grep '%s'" % self.mountpoint, |
| ignore_status=True) |
| if result: |
| utils.system('mount -t debugfs debugfs /sys/kernel/debug') |
| device = self.get_device(test) |
| self.blktrace_job = utils.BgJob('%s /dev/%s' % (self.blktrace, device)) |
| |
| |
| def stop(self, test): |
| if self.blktrace_job is not None: |
| utils.nuke_subprocess(self.blktrace_job.sp) |
| self.blktrace_job = None |
| |
| |
| def report(self, test): |
| output_file = os.path.join(test.profdir, 'blktrace') |
| if getattr(test, 'profile_tag', None): |
| output_file += '.' + test.profile_tag |
| device = self.get_device(test) |
| utils.system('%s %s > %s' % (self.blkparse, device, output_file)) |