scripts/kvm/kvm_stat: Encapsulate filters variable

The variable was only used in one class but still was defined
globally. Additionaly the detect_platform routine which prepares the
data that goes into the variable was called on each start of the
script, no matter if the class was needed.

To make the variable local to the TracepointProvider class, a new
function that calls detect_platform and returns the filters was
introduced.

Signed-off-by: Janosch Frank <frankja@linux.vnet.ibm.com>
Message-Id: <1452525484-32309-22-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:51 +01:00 committed by Paolo Bonzini
parent 357bc1e74f
commit dd0b6a4e10
1 changed files with 14 additions and 9 deletions

View File

@ -302,10 +302,14 @@ def get_online_cpus():
cpu_string = cpu_list.readline() cpu_string = cpu_list.readline()
return parse_int_list(cpu_string) return parse_int_list(cpu_string)
filters = {}
filters['kvm_userspace_exit'] = ('reason', USERSPACE_EXIT_REASONS) def get_filters():
if EXIT_REASONS: detect_platform()
filters['kvm_exit'] = ('exit_reason', EXIT_REASONS) filters = {}
filters['kvm_userspace_exit'] = ('reason', USERSPACE_EXIT_REASONS)
if EXIT_REASONS:
filters['kvm_exit'] = ('exit_reason', EXIT_REASONS)
return filters
libc = ctypes.CDLL('libc.so.6', use_errno=True) libc = ctypes.CDLL('libc.so.6', use_errno=True)
syscall = libc.syscall syscall = libc.syscall
@ -385,6 +389,7 @@ class Event(object):
class TracepointProvider(object): class TracepointProvider(object):
def __init__(self): def __init__(self):
self.group_leaders = [] self.group_leaders = []
self.filters = get_filters()
self._fields = self.get_available_fields() self._fields = self.get_available_fields()
self.setup_traces() self.setup_traces()
self.fields = self._fields self.fields = self._fields
@ -394,8 +399,8 @@ class TracepointProvider(object):
fields = walkdir(path)[1] fields = walkdir(path)[1]
extra = [] extra = []
for field in fields: for field in fields:
if field in filters: if field in self.filters:
filter_name_, filter_dicts = filters[field] filter_name_, filter_dicts = self.filters[field]
for name in filter_dicts: for name in filter_dicts:
extra.append(field + '(' + name + ')') extra.append(field + '(' + name + ')')
fields += extra fields += extra
@ -420,8 +425,9 @@ class TracepointProvider(object):
match = re.match(r'(.*)\((.*)\)', name) match = re.match(r'(.*)\((.*)\)', name)
if match: if match:
tracepoint, sub = match.groups() tracepoint, sub = match.groups()
tracefilter = '%s==%d\0' % (filters[tracepoint][0], tracefilter = ('%s==%d\0' %
filters[tracepoint][1][sub]) (self.filters[tracepoint][0],
self.filters[tracepoint][1][sub]))
group.add_event(name, event_set='kvm', group.add_event(name, event_set='kvm',
tracepoint=tracepoint, tracepoint=tracepoint,
tracefilter=tracefilter) tracefilter=tracefilter)
@ -652,7 +658,6 @@ def check_access():
def main(): def main():
check_access() check_access()
detect_platform()
options = get_options() options = get_options()
providers = get_providers(options) providers = get_providers(options)
stats = Stats(providers, fields=options.fields) stats = Stats(providers, fields=options.fields)