diff options
author | Marc Hartmayer <mhartmay@linux.vnet.ibm.com> | 2018-01-09 07:27:02 -0500 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2018-02-23 19:43:39 -0500 |
commit | 006f1548ac13d67d21865416a0f4e8062df1a85f (patch) | |
tree | 1cd9141b5d751773064f6457556cf0997340792f /tools/kvm | |
parent | faa312a543283c717342cd332b5b9247bd305dce (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-x | tools/kvm/kvm_stat/kvm_stat | 27 |
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 | |||
33 | import struct | 33 | import struct |
34 | import re | 34 | import re |
35 | import subprocess | 35 | import subprocess |
36 | from collections import defaultdict | 36 | from collections import defaultdict, namedtuple |
37 | 37 | ||
38 | VMX_EXIT_REASONS = { | 38 | VMX_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 | ||
803 | EventStat = namedtuple('EventStat', ['value', 'delta']) | ||
804 | |||
805 | |||
803 | class Stats(object): | 806 | class 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 |