qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 24/34] scripts/kvm/kvm_stat: Cleanup of Event class


From: Janosch Frank
Subject: [Qemu-devel] [PATCH 24/34] scripts/kvm/kvm_stat: Cleanup of Event class
Date: Thu, 10 Dec 2015 13:12:54 +0100

Added additional newlines for readability.

Factored out attribute and event setup code into own methods.  All
data necessary for setting up the events was consolidated into one
dictionary. That way we get rid of the large argument list of the
functions that handle the data.

Exchanged file() with preferred open().
---
 scripts/kvm/kvm_stat | 73 +++++++++++++++++++++++++++++++++-------------------
 1 file changed, 47 insertions(+), 26 deletions(-)

diff --git a/scripts/kvm/kvm_stat b/scripts/kvm/kvm_stat
index 5d45604..70a27da 100755
--- a/scripts/kvm/kvm_stat
+++ b/scripts/kvm/kvm_stat
@@ -333,15 +333,11 @@ PATH_TRACING = '/sys/kernel/debug/tracing'
 PATH_DEBUGFS = '/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_data):
+        self.events.append(Event(event_data))
 
     def read(self):
         length = 8 * (1 + len(self.events))
@@ -351,32 +347,50 @@ class Group(object):
                                       os.read(self.events[0].fd, length))))
 
 class Event(object):
-    def __init__(self, group, name, event_set, tracepoint, tracefilter=None):
-        self.name = name
-        attr = perf_event_attr()
-        attr.type = PERF_TYPE_TRACEPOINT
-        attr.size = ctypes.sizeof(attr)
+    def __init__(self, event_data):
+        self.name = event_data['name']
+        self.fd = None
+        self.setup_event(event_data)
+
+    def setup_event_attribute(self, event_set, tracepoint):
         id_path = os.path.join(PATH_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
+
+        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, event_data):
+        event_attr = self.setup_event_attribute(event_data['set'],
+                                                event_data['tracepoint'])
+
         group_leader = -1
-        if group.events:
-            group_leader = group.events[0].fd
-        fd = perf_event_open(attr, -1, group.cpu, group_leader, 0)
+        if event_data['group'].events:
+            group_leader = event_data['group'].events[0].fd
+
+        fd = perf_event_open(event_attr, -1, event_data['cpu'],
+                             group_leader, 0)
         if fd == -1:
             err = ctypes.get_errno()
-            raise OSError(err, os.os.strerror(err),
+            raise OSError(err, os.strerror(err),
                           'while calling sys_perf_event_open().')
-        if tracefilter:
-            fcntl.ioctl(fd, IOCTL_NUMBERS['SET_FILTER'], tracefilter)
+
+        if event_data['filter']:
+            fcntl.ioctl(fd, IOCTL_NUMBERS['SET_FILTER'],
+                        event_data['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)
 
@@ -412,7 +426,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
@@ -422,9 +436,16 @@ 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)
+
+                event_data = {
+                    'cpu':         cpu,
+                    'name':        name,
+                    'group':       group,
+                    'set':         'kvm',
+                    'tracepoint':  tracepoint,
+                    'filter':      tracefilter or None,
+                }
+                group.add_event(event_data)
             self.group_leaders.append(group)
 
     @property
-- 
2.3.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]