scripts/kvm/kvm_stat: Cleanup of Event class

Added additional newlines for readability.
Factored out attribute and event setup code into own methods.
Exchanged file() with preferred open().

Signed-off-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Message-Id: <1452525484-32309-25-git-send-email-frankja@linux.vnet.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Janosch Frank 2016-01-11 16:17:54 +01:00 committed by Paolo Bonzini
parent fc9fdeebd5
commit d895493b7c

View file

@ -339,15 +339,11 @@ PATH_DEBUGFS_TRACING = '/sys/kernel/debug/tracing'
PATH_DEBUGFS_KVM = '/sys/kernel/debug/kvm' PATH_DEBUGFS_KVM = '/sys/kernel/debug/kvm'
class Group(object): class Group(object):
def __init__(self, cpu): def __init__(self):
self.events = [] self.events = []
self.cpu = cpu
def add_event(self, name, event_set, tracepoint, tracefilter=None): def add_event(self, event):
self.events.append(Event(group=self, self.events.append(event)
name=name, event_set=event_set,
tracepoint=tracepoint,
tracefilter=tracefilter))
def read(self): def read(self):
length = 8 * (1 + len(self.events)) length = 8 * (1 + len(self.events))
@ -357,32 +353,52 @@ class Group(object):
os.read(self.events[0].fd, length)))) os.read(self.events[0].fd, length))))
class Event(object): class Event(object):
def __init__(self, group, name, event_set, tracepoint, tracefilter=None): def __init__(self, name, group, trace_cpu, trace_point, trace_filter,
trace_set='kvm'):
self.name = name self.name = name
attr = perf_event_attr() self.fd = None
attr.type = PERF_TYPE_TRACEPOINT self.setup_event(group, trace_cpu, trace_point, trace_filter,
attr.size = ctypes.sizeof(attr) trace_set)
id_path = os.path.join(PATH_DEBUGFS_TRACING, 'events', event_set,
tracepoint, 'id') def setup_event_attribute(self, trace_set, trace_point):
id = int(file(id_path).read()) id_path = os.path.join(PATH_DEBUGFS_TRACING, 'events', trace_set,
attr.config = id trace_point, 'id')
attr.sample_period = 1
attr.read_format = PERF_FORMAT_GROUP event_attr = perf_event_attr()
event_attr.type = PERF_TYPE_TRACEPOINT
event_attr.size = ctypes.sizeof(event_attr)
event_attr.config = int(open(id_path).read())
event_attr.sample_period = 1
event_attr.read_format = PERF_FORMAT_GROUP
return event_attr
def setup_event(self, group, trace_cpu, trace_point, trace_filter,
trace_set):
event_attr = self.setup_event_attribute(trace_set, trace_point)
group_leader = -1 group_leader = -1
if group.events: if group.events:
group_leader = group.events[0].fd group_leader = group.events[0].fd
fd = perf_event_open(attr, -1, group.cpu, group_leader, 0)
fd = perf_event_open(event_attr, -1, trace_cpu,
group_leader, 0)
if fd == -1: if fd == -1:
err = ctypes.get_errno() err = ctypes.get_errno()
raise OSError(err, os.strerror(err), raise OSError(err, os.strerror(err),
'while calling sys_perf_event_open().') 'while calling sys_perf_event_open().')
if tracefilter:
fcntl.ioctl(fd, IOCTL_NUMBERS['SET_FILTER'], tracefilter) if trace_filter:
fcntl.ioctl(fd, IOCTL_NUMBERS['SET_FILTER'],
trace_filter)
self.fd = fd self.fd = fd
def enable(self): def enable(self):
fcntl.ioctl(self.fd, IOCTL_NUMBERS['ENABLE'], 0) fcntl.ioctl(self.fd, IOCTL_NUMBERS['ENABLE'], 0)
def disable(self): def disable(self):
fcntl.ioctl(self.fd, IOCTL_NUMBERS['DISABLE'], 0) fcntl.ioctl(self.fd, IOCTL_NUMBERS['DISABLE'], 0)
def reset(self): def reset(self):
fcntl.ioctl(self.fd, IOCTL_NUMBERS['RESET'], 0) fcntl.ioctl(self.fd, IOCTL_NUMBERS['RESET'], 0)
@ -418,7 +434,7 @@ class TracepointProvider(object):
sys.exit("NOFILE rlimit could not be raised to {0}".format(rlimit)) sys.exit("NOFILE rlimit could not be raised to {0}".format(rlimit))
for cpu in cpus: for cpu in cpus:
group = Group(cpu) group = Group()
for name in self._fields: for name in self._fields:
tracepoint = name tracepoint = name
tracefilter = None tracefilter = None
@ -428,9 +444,12 @@ class TracepointProvider(object):
tracefilter = ('%s==%d\0' % tracefilter = ('%s==%d\0' %
(self.filters[tracepoint][0], (self.filters[tracepoint][0],
self.filters[tracepoint][1][sub])) self.filters[tracepoint][1][sub]))
group.add_event(name, event_set='kvm',
tracepoint=tracepoint, group.add_event(Event(name=name,
tracefilter=tracefilter) group=group,
trace_cpu=cpu,
trace_point=tracepoint,
trace_filter=tracefilter))
self.group_leaders.append(group) self.group_leaders.append(group)
@property @property