It might be handy to display the full history of event stats in some cases. Since we have that available for debugfs, we offer a respective command to display what's available. Note that this command does not toggle - one merely has to reset the stats via 'r' to do the next best thing to reverting the effect of 't'. Signed-off-by: Stefan Raspl <raspl@xxxxxxxxxxxxxxxxxx> --- tools/kvm/kvm_stat/kvm_stat | 38 ++++++++++++++++++++++++++++++++++++-- tools/kvm/kvm_stat/kvm_stat.txt | 2 ++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat index 1276b88937c0..169f6601a90c 100755 --- a/tools/kvm/kvm_stat/kvm_stat +++ b/tools/kvm/kvm_stat/kvm_stat @@ -677,6 +677,10 @@ class TracepointProvider(Provider): for event in group.events: event.reset() + def restore(self): + """No historic data available that we could restore""" + pass + class DebugfsProvider(Provider): """Provides data from the files that KVM creates in the kvm debugfs @@ -730,7 +734,14 @@ class DebugfsProvider(Provider): self.reset() def read(self, reset=0): - """Returns a dict with format:'file name / field -> current value'.""" + """Returns a dict with format:'file name / field -> current value'. + + Parameter 'reset': + 0 plain read + 1 reset field counts to 0 + 2 restore the original field counts + + """ results = {} # If no debugfs filtering support is available, then don't read. @@ -747,8 +758,10 @@ class DebugfsProvider(Provider): for field in self._fields: value = self.read_field(field, path) key = path + field - if reset: + if reset == 1: self._baseline[key] = value + if reset == 2: + self._baseline[key] = 0 if self._baseline.get(key, -1) == -1: self._baseline[key] = value results[field] = (results.get(field, 0) + value - @@ -771,6 +784,11 @@ class DebugfsProvider(Provider): self._baseline = {} self.read(1) + def restore(self): + """Reset field counters""" + self._baseline = {} + self.read(2) + class Stats(object): """Manages the data providers and the data they provide. @@ -806,10 +824,20 @@ class Stats(object): provider.update_fields(self._fields_filter) def reset(self): + """Reset providers' field counters""" self.values = {} for provider in self.providers: provider.reset() + def restore(self): + """Restore providers' field counters""" + self.values = {} + for provider in self.providers: + provider.restore() + # Updates oldval (see get()) for all fields to prevent the totals from + # being displayed in the 'CurAvg/s' column on next refresh + self.get() + @property def fields_filter(self): return self._fields_filter @@ -1029,6 +1057,7 @@ class Tui(object): ' q quit', ' r reset stats', ' s set update interval', + ' t show total available stats (debugfs only)', ' x toggle reporting of stats for individual child trace' ' events', 'Any other key refreshes statistics immediately') @@ -1229,8 +1258,12 @@ class Tui(object): self.show_set_update_interval() curses.curs_set(0) sleeptime = self._delay_initial + if char == 't': + self.stats.restore() if char == 'x': self.update_drilldown() + # prevents display of current values on next refresh + self.stats.get() except KeyboardInterrupt: break except curses.error: @@ -1306,6 +1339,7 @@ Interactive Commands: q quit r reset stats s set update interval + t show total available stats (debugfs only) x toggle reporting of stats for individual child trace events Press any other key to refresh statistics immediately. """ diff --git a/tools/kvm/kvm_stat/kvm_stat.txt b/tools/kvm/kvm_stat/kvm_stat.txt index cc019b09e0f5..53478ff6eded 100644 --- a/tools/kvm/kvm_stat/kvm_stat.txt +++ b/tools/kvm/kvm_stat/kvm_stat.txt @@ -45,6 +45,8 @@ INTERACTIVE COMMANDS *s*:: set update interval +*t*:: show total available stats (debugfs only) + *x*:: toggle reporting of stats for child trace events Press any other key to refresh statistics immediately. -- 2.11.2