summaryrefslogtreecommitdiffstats
path: root/tools/kvm
diff options
context:
space:
mode:
authorStefan Raspl <raspl@linux.vnet.ibm.com>2017-06-25 15:34:15 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2017-06-27 10:43:48 -0400
commitab7ef193fab628fc5da6fd4f4672ffd0d1bb53df (patch)
tree12a27445d162ceefbc959f510a4b056f00916997 /tools/kvm
parent61f381bb7e1a8e9250aa32b3963a7a5c4b92cbf5 (diff)
tools/kvm_stat: add new command line switch '-i'
It might be handy to display the full history of event stats to compare the current event distribution against any available historic data. Since we have that available for debugfs, we offer a respective command line option to display what's available. Signed-off-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_stat34
-rw-r--r--tools/kvm/kvm_stat/kvm_stat.txt4
2 files changed, 34 insertions, 4 deletions
diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat
index 39476e55f557..4065b2909085 100755
--- a/tools/kvm/kvm_stat/kvm_stat
+++ b/tools/kvm/kvm_stat/kvm_stat
@@ -681,12 +681,14 @@ class TracepointProvider(Provider):
681class DebugfsProvider(Provider): 681class DebugfsProvider(Provider):
682 """Provides data from the files that KVM creates in the kvm debugfs 682 """Provides data from the files that KVM creates in the kvm debugfs
683 folder.""" 683 folder."""
684 def __init__(self, pid, fields_filter): 684 def __init__(self, pid, fields_filter, include_past):
685 self.update_fields(fields_filter) 685 self.update_fields(fields_filter)
686 self._baseline = {} 686 self._baseline = {}
687 self.do_read = True 687 self.do_read = True
688 self.paths = [] 688 self.paths = []
689 self.pid = pid 689 self.pid = pid
690 if include_past:
691 self.restore()
690 692
691 def get_available_fields(self): 693 def get_available_fields(self):
692 """"Returns a list of available fields. 694 """"Returns a list of available fields.
@@ -730,7 +732,14 @@ class DebugfsProvider(Provider):
730 self.reset() 732 self.reset()
731 733
732 def read(self, reset=0): 734 def read(self, reset=0):
733 """Returns a dict with format:'file name / field -> current value'.""" 735 """Returns a dict with format:'file name / field -> current value'.
736
737 Parameter 'reset':
738 0 plain read
739 1 reset field counts to 0
740 2 restore the original field counts
741
742 """
734 results = {} 743 results = {}
735 744
736 # If no debugfs filtering support is available, then don't read. 745 # If no debugfs filtering support is available, then don't read.
@@ -747,8 +756,10 @@ class DebugfsProvider(Provider):
747 for field in self._fields: 756 for field in self._fields:
748 value = self.read_field(field, path) 757 value = self.read_field(field, path)
749 key = path + field 758 key = path + field
750 if reset: 759 if reset == 1:
751 self._baseline[key] = value 760 self._baseline[key] = value
761 if reset == 2:
762 self._baseline[key] = 0
752 if self._baseline.get(key, -1) == -1: 763 if self._baseline.get(key, -1) == -1:
753 self._baseline[key] = value 764 self._baseline[key] = value
754 results[field] = (results.get(field, 0) + value - 765 results[field] = (results.get(field, 0) + value -
@@ -771,6 +782,11 @@ class DebugfsProvider(Provider):
771 self._baseline = {} 782 self._baseline = {}
772 self.read(1) 783 self.read(1)
773 784
785 def restore(self):
786 """Reset field counters"""
787 self._baseline = {}
788 self.read(2)
789
774 790
775class Stats(object): 791class Stats(object):
776 """Manages the data providers and the data they provide. 792 """Manages the data providers and the data they provide.
@@ -791,7 +807,8 @@ class Stats(object):
791 providers = [] 807 providers = []
792 808
793 if options.debugfs: 809 if options.debugfs:
794 providers.append(DebugfsProvider(options.pid, options.fields)) 810 providers.append(DebugfsProvider(options.pid, options.fields,
811 options.dbgfs_include_past))
795 if options.tracepoints or not providers: 812 if options.tracepoints or not providers:
796 providers.append(TracepointProvider(options.pid, options.fields)) 813 providers.append(TracepointProvider(options.pid, options.fields))
797 814
@@ -1270,6 +1287,8 @@ class Tui(object):
1270 sleeptime = self._delay_initial 1287 sleeptime = self._delay_initial
1271 if char == 'x': 1288 if char == 'x':
1272 self.update_drilldown() 1289 self.update_drilldown()
1290 # prevents display of current values on next refresh
1291 self.stats.get()
1273 except KeyboardInterrupt: 1292 except KeyboardInterrupt:
1274 break 1293 break
1275 except curses.error: 1294 except curses.error:
@@ -1381,6 +1400,13 @@ Press any other key to refresh statistics immediately.
1381 dest='once', 1400 dest='once',
1382 help='run in batch mode for one second', 1401 help='run in batch mode for one second',
1383 ) 1402 )
1403 optparser.add_option('-i', '--debugfs-include-past',
1404 action='store_true',
1405 default=False,
1406 dest='dbgfs_include_past',
1407 help='include all available data on past events for '
1408 'debugfs',
1409 )
1384 optparser.add_option('-l', '--log', 1410 optparser.add_option('-l', '--log',
1385 action='store_true', 1411 action='store_true',
1386 default=False, 1412 default=False,
diff --git a/tools/kvm/kvm_stat/kvm_stat.txt b/tools/kvm/kvm_stat/kvm_stat.txt
index e24ac464d341..851372d263cc 100644
--- a/tools/kvm/kvm_stat/kvm_stat.txt
+++ b/tools/kvm/kvm_stat/kvm_stat.txt
@@ -70,6 +70,10 @@ OPTIONS
70--debugfs:: 70--debugfs::
71 retrieve statistics from debugfs 71 retrieve statistics from debugfs
72 72
73-i::
74--debugfs-include-past::
75 include all available data on past events for debugfs
76
73-p<pid>:: 77-p<pid>::
74--pid=<pid>:: 78--pid=<pid>::
75 limit statistics to one virtual machine (pid) 79 limit statistics to one virtual machine (pid)