summaryrefslogtreecommitdiffstats
path: root/tools/kvm
diff options
context:
space:
mode:
authorMarc Hartmayer <mhartmay@linux.vnet.ibm.com>2018-01-09 07:27:02 -0500
committerPaolo Bonzini <pbonzini@redhat.com>2018-02-23 19:43:39 -0500
commit006f1548ac13d67d21865416a0f4e8062df1a85f (patch)
tree1cd9141b5d751773064f6457556cf0997340792f /tools/kvm
parentfaa312a543283c717342cd332b5b9247bd305dce (diff)
tools/kvm_stat: use a namedtuple for storing the values
Use a namedtuple for storing the values as it allows to access the fields of a tuple via names. This makes the overall code much easier to read and to understand. Access by index is still possible as before. Signed-off-by: Marc Hartmayer <mhartmay@linux.vnet.ibm.com> Tested-by: Stefan Raspl <raspl@linux.vnet.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'tools/kvm')
-rwxr-xr-xtools/kvm/kvm_stat/kvm_stat27
1 files changed, 15 insertions, 12 deletions
diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat
index d630f5f3e091..2b7e83a5f7b8 100755
--- a/tools/kvm/kvm_stat/kvm_stat
+++ b/tools/kvm/kvm_stat/kvm_stat
@@ -33,7 +33,7 @@ import resource
33import struct 33import struct
34import re 34import re
35import subprocess 35import subprocess
36from collections import defaultdict 36from collections import defaultdict, namedtuple
37 37
38VMX_EXIT_REASONS = { 38VMX_EXIT_REASONS = {
39 'EXCEPTION_NMI': 0, 39 'EXCEPTION_NMI': 0,
@@ -800,6 +800,9 @@ class DebugfsProvider(Provider):
800 self.read(2) 800 self.read(2)
801 801
802 802
803EventStat = namedtuple('EventStat', ['value', 'delta'])
804
805
803class Stats(object): 806class Stats(object):
804 """Manages the data providers and the data they provide. 807 """Manages the data providers and the data they provide.
805 808
@@ -867,10 +870,10 @@ class Stats(object):
867 for provider in self.providers: 870 for provider in self.providers:
868 new = provider.read(by_guest=by_guest) 871 new = provider.read(by_guest=by_guest)
869 for key in new if by_guest else provider.fields: 872 for key in new if by_guest else provider.fields:
870 oldval = self.values.get(key, (0, 0))[0] 873 oldval = self.values.get(key, EventStat(0, 0)).value
871 newval = new.get(key, 0) 874 newval = new.get(key, 0)
872 newdelta = newval - oldval 875 newdelta = newval - oldval
873 self.values[key] = (newval, newdelta) 876 self.values[key] = EventStat(newval, newdelta)
874 return self.values 877 return self.values
875 878
876 def toggle_display_guests(self, to_pid): 879 def toggle_display_guests(self, to_pid):
@@ -1083,28 +1086,28 @@ class Tui(object):
1083 total = 0. 1086 total = 0.
1084 for key in stats.keys(): 1087 for key in stats.keys():
1085 if key.find('(') is -1: 1088 if key.find('(') is -1:
1086 total += stats[key][0] 1089 total += stats[key].value
1087 if self._sorting == SORT_DEFAULT: 1090 if self._sorting == SORT_DEFAULT:
1088 def sortkey((_k, v)): 1091 def sortkey((_k, v)):
1089 # sort by (delta value, overall value) 1092 # sort by (delta value, overall value)
1090 return (v[1], v[0]) 1093 return (v.delta, v.value)
1091 else: 1094 else:
1092 def sortkey((_k, v)): 1095 def sortkey((_k, v)):
1093 # sort by overall value 1096 # sort by overall value
1094 return v[0] 1097 return v.value
1095 1098
1096 tavg = 0 1099 tavg = 0
1097 for key, values in sorted(stats.items(), key=sortkey, reverse=True): 1100 for key, values in sorted(stats.items(), key=sortkey, reverse=True):
1098 if row >= self.screen.getmaxyx()[0] - 1: 1101 if row >= self.screen.getmaxyx()[0] - 1:
1099 break 1102 break
1100 if not values[0] and not values[1]: 1103 if not values.value and not values.delta:
1101 break 1104 break
1102 if values[0] is not None: 1105 if values.value is not None:
1103 cur = int(round(values[1] / sleeptime)) if values[1] else '' 1106 cur = int(round(values.delta / sleeptime)) if values.delta else ''
1104 if self._display_guests: 1107 if self._display_guests:
1105 key = self.get_gname_from_pid(key) 1108 key = self.get_gname_from_pid(key)
1106 self.screen.addstr(row, 1, '%-40s %10d%7.1f %8s' % 1109 self.screen.addstr(row, 1, '%-40s %10d%7.1f %8s' %
1107 (key, values[0], values[0] * 100 / total, 1110 (key, values.value, values.value * 100 / total,
1108 cur)) 1111 cur))
1109 if cur is not '' and key.find('(') is -1: 1112 if cur is not '' and key.find('(') is -1:
1110 tavg += cur 1113 tavg += cur
@@ -1375,7 +1378,7 @@ def batch(stats):
1375 s = stats.get() 1378 s = stats.get()
1376 for key in sorted(s.keys()): 1379 for key in sorted(s.keys()):
1377 values = s[key] 1380 values = s[key]
1378 print('%-42s%10d%10d' % (key, values[0], values[1])) 1381 print('%-42s%10d%10d' % (key, values.value, values.delta))
1379 except KeyboardInterrupt: 1382 except KeyboardInterrupt:
1380 pass 1383 pass
1381 1384
@@ -1392,7 +1395,7 @@ def log(stats):
1392 def statline(): 1395 def statline():
1393 s = stats.get() 1396 s = stats.get()
1394 for k in keys: 1397 for k in keys:
1395 print(' %9d' % s[k][1], end=' ') 1398 print(' %9d' % s[k].delta, end=' ')
1396 print() 1399 print()
1397 line = 0 1400 line = 0
1398 banner_repeat = 20 1401 banner_repeat = 20