"""
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))