diff options
-rwxr-xr-x | tools/kvm/kvm_stat/kvm_stat | 34 | ||||
-rw-r--r-- | tools/kvm/kvm_stat/kvm_stat.txt | 4 |
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): | |||
681 | class DebugfsProvider(Provider): | 681 | class 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 | ||
775 | class Stats(object): | 791 | class 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) |