From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44369) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a706q-0003Ir-SB for qemu-devel@nongnu.org; Thu, 10 Dec 2015 07:14:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a706j-0003nz-9m for qemu-devel@nongnu.org; Thu, 10 Dec 2015 07:14:08 -0500 Received: from e06smtp16.uk.ibm.com ([195.75.94.112]:57762) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a706j-0003nc-0h for qemu-devel@nongnu.org; Thu, 10 Dec 2015 07:14:01 -0500 Received: from localhost by e06smtp16.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 10 Dec 2015 12:13:59 -0000 Received: from b06cxnps3074.portsmouth.uk.ibm.com (d06relay09.portsmouth.uk.ibm.com [9.149.109.194]) by d06dlp01.portsmouth.uk.ibm.com (Postfix) with ESMTP id 5F8CA17D805D for ; Thu, 10 Dec 2015 12:14:30 +0000 (GMT) Received: from d06av06.portsmouth.uk.ibm.com (d06av06.portsmouth.uk.ibm.com [9.149.37.217]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id tBACDvVI328152 for ; Thu, 10 Dec 2015 12:13:58 GMT Received: from d06av06.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av06.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id tBACDvHN025416 for ; Thu, 10 Dec 2015 05:13:57 -0700 From: Janosch Frank Date: Thu, 10 Dec 2015 13:12:54 +0100 Message-Id: <1449749584-23214-25-git-send-email-frankja@linux.vnet.ibm.com> In-Reply-To: <1449749584-23214-1-git-send-email-frankja@linux.vnet.ibm.com> References: <1449749584-23214-1-git-send-email-frankja@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 24/34] scripts/kvm/kvm_stat: Cleanup of Event class List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: cornelia.huck@de.ibm.com, frankja@linux.vnet.ibm.com 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