Skip to content

Commit

Permalink
tools/kvm_stat: add new command line switch '-i'
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
Stefan Raspl authored and bonzini committed Jun 27, 2017
1 parent 61f381b commit ab7ef19
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
34 changes: 30 additions & 4 deletions tools/kvm/kvm_stat/kvm_stat
Original file line number Diff line number Diff line change
Expand Up @@ -681,12 +681,14 @@ class TracepointProvider(Provider):
class DebugfsProvider(Provider):
"""Provides data from the files that KVM creates in the kvm debugfs
folder."""
def __init__(self, pid, fields_filter):
def __init__(self, pid, fields_filter, include_past):
self.update_fields(fields_filter)
self._baseline = {}
self.do_read = True
self.paths = []
self.pid = pid
if include_past:
self.restore()

def get_available_fields(self):
""""Returns a list of available fields.
Expand Down Expand Up @@ -730,7 +732,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.
Expand All @@ -747,8 +756,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 -
Expand All @@ -771,6 +782,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.
Expand All @@ -791,7 +807,8 @@ class Stats(object):
providers = []

if options.debugfs:
providers.append(DebugfsProvider(options.pid, options.fields))
providers.append(DebugfsProvider(options.pid, options.fields,
options.dbgfs_include_past))
if options.tracepoints or not providers:
providers.append(TracepointProvider(options.pid, options.fields))

Expand Down Expand Up @@ -1270,6 +1287,8 @@ class Tui(object):
sleeptime = self._delay_initial
if char == 'x':
self.update_drilldown()
# prevents display of current values on next refresh
self.stats.get()
except KeyboardInterrupt:
break
except curses.error:
Expand Down Expand Up @@ -1381,6 +1400,13 @@ Press any other key to refresh statistics immediately.
dest='once',
help='run in batch mode for one second',
)
optparser.add_option('-i', '--debugfs-include-past',
action='store_true',
default=False,
dest='dbgfs_include_past',
help='include all available data on past events for '
'debugfs',
)
optparser.add_option('-l', '--log',
action='store_true',
default=False,
Expand Down
4 changes: 4 additions & 0 deletions tools/kvm/kvm_stat/kvm_stat.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ OPTIONS
--debugfs::
retrieve statistics from debugfs

-i::
--debugfs-include-past::
include all available data on past events for debugfs

-p<pid>::
--pid=<pid>::
limit statistics to one virtual machine (pid)
Expand Down

0 comments on commit ab7ef19

Please sign in to comment.