mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 19:49:43 +00:00
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:
parent
fc9fdeebd5
commit
d895493b7c
@ -339,15 +339,11 @@ PATH_DEBUGFS_TRACING = '/sys/kernel/debug/tracing'
|
||||
PATH_DEBUGFS_KVM = '/sys/kernel/debug/kvm'
|
||||
|
||||
class Group(object):
|
||||
def __init__(self, cpu):
|
||||
def __init__(self):
|
||||
self.events = []
|
||||
self.cpu = cpu
|
||||
|
||||
def add_event(self, name, event_set, tracepoint, tracefilter=None):
|
||||
self.events.append(Event(group=self,
|
||||
name=name, event_set=event_set,
|
||||
tracepoint=tracepoint,
|
||||
tracefilter=tracefilter))
|
||||
def add_event(self, event):
|
||||
self.events.append(event)
|
||||
|
||||
def read(self):
|
||||
length = 8 * (1 + len(self.events))
|
||||
@ -357,32 +353,52 @@ class Group(object):
|
||||
os.read(self.events[0].fd, length))))
|
||||
|
||||
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
|
||||
attr = perf_event_attr()
|
||||
attr.type = PERF_TYPE_TRACEPOINT
|
||||
attr.size = ctypes.sizeof(attr)
|
||||
id_path = os.path.join(PATH_DEBUGFS_TRACING, 'events', event_set,
|
||||
tracepoint, 'id')
|
||||
id = int(file(id_path).read())
|
||||
attr.config = id
|
||||
attr.sample_period = 1
|
||||
attr.read_format = PERF_FORMAT_GROUP
|
||||
self.fd = None
|
||||
self.setup_event(group, trace_cpu, trace_point, trace_filter,
|
||||
trace_set)
|
||||
|
||||
def setup_event_attribute(self, trace_set, trace_point):
|
||||
id_path = os.path.join(PATH_DEBUGFS_TRACING, 'events', trace_set,
|
||||
trace_point, 'id')
|
||||
|
||||
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
|
||||
if group.events:
|
||||
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:
|
||||
err = ctypes.get_errno()
|
||||
raise OSError(err, os.strerror(err),
|
||||
'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
|
||||
|
||||
def enable(self):
|
||||
fcntl.ioctl(self.fd, IOCTL_NUMBERS['ENABLE'], 0)
|
||||
|
||||
def disable(self):
|
||||
fcntl.ioctl(self.fd, IOCTL_NUMBERS['DISABLE'], 0)
|
||||
|
||||
def reset(self):
|
||||
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))
|
||||
|
||||
for cpu in cpus:
|
||||
group = Group(cpu)
|
||||
group = Group()
|
||||
for name in self._fields:
|
||||
tracepoint = name
|
||||
tracefilter = None
|
||||
@ -428,9 +444,12 @@ class TracepointProvider(object):
|
||||
tracefilter = ('%s==%d\0' %
|
||||
(self.filters[tracepoint][0],
|
||||
self.filters[tracepoint][1][sub]))
|
||||
group.add_event(name, event_set='kvm',
|
||||
tracepoint=tracepoint,
|
||||
tracefilter=tracefilter)
|
||||
|
||||
group.add_event(Event(name=name,
|
||||
group=group,
|
||||
trace_cpu=cpu,
|
||||
trace_point=tracepoint,
|
||||
trace_filter=tracefilter))
|
||||
self.group_leaders.append(group)
|
||||
|
||||
@property
|
||||
|
Loading…
Reference in New Issue
Block a user