mirror of https://github.com/xemu-project/xemu.git
kvm_stat: allow choosing between tracepoints and old stats
The old stats contain information not available in the tracepoints. By default, keep the old behavior, but allow choosing which set of stats to present, or even both. Inspired by a patch from Marcelo Tosatti. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
a096b3a673
commit
b763adf1a6
|
@ -352,8 +352,8 @@ class TracepointProvider(object):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
class Stats:
|
class Stats:
|
||||||
def __init__(self, provider, fields = None):
|
def __init__(self, providers, fields = None):
|
||||||
self.provider = provider
|
self.providers = providers
|
||||||
self.fields_filter = fields
|
self.fields_filter = fields
|
||||||
self._update()
|
self._update()
|
||||||
def _update(self):
|
def _update(self):
|
||||||
|
@ -362,22 +362,25 @@ class Stats:
|
||||||
if not self.fields_filter:
|
if not self.fields_filter:
|
||||||
return True
|
return True
|
||||||
return re.match(self.fields_filter, key) is not None
|
return re.match(self.fields_filter, key) is not None
|
||||||
self.values = dict([(key, None)
|
self.values = dict()
|
||||||
for key in provider.fields()
|
for d in providers:
|
||||||
if wanted(key)])
|
provider_fields = [key for key in d.fields() if wanted(key)]
|
||||||
self.provider.select(self.values.keys())
|
for key in provider_fields:
|
||||||
|
self.values[key] = None
|
||||||
|
d.select(provider_fields)
|
||||||
def set_fields_filter(self, fields_filter):
|
def set_fields_filter(self, fields_filter):
|
||||||
self.fields_filter = fields_filter
|
self.fields_filter = fields_filter
|
||||||
self._update()
|
self._update()
|
||||||
def get(self):
|
def get(self):
|
||||||
new = self.provider.read()
|
for d in providers:
|
||||||
for key in self.provider.fields():
|
new = d.read()
|
||||||
oldval = self.values.get(key, (0, 0))
|
for key in d.fields():
|
||||||
newval = new[key]
|
oldval = self.values.get(key, (0, 0))
|
||||||
newdelta = None
|
newval = new[key]
|
||||||
if oldval is not None:
|
newdelta = None
|
||||||
newdelta = newval - oldval[0]
|
if oldval is not None:
|
||||||
self.values[key] = (newval, newdelta)
|
newdelta = newval - oldval[0]
|
||||||
|
self.values[key] = (newval, newdelta)
|
||||||
return self.values
|
return self.values
|
||||||
|
|
||||||
if not os.access('/sys/kernel/debug', os.F_OK):
|
if not os.access('/sys/kernel/debug', os.F_OK):
|
||||||
|
@ -487,6 +490,18 @@ options.add_option('-l', '--log',
|
||||||
dest = 'log',
|
dest = 'log',
|
||||||
help = 'run in logging mode (like vmstat)',
|
help = 'run in logging mode (like vmstat)',
|
||||||
)
|
)
|
||||||
|
options.add_option('-t', '--tracepoints',
|
||||||
|
action = 'store_true',
|
||||||
|
default = False,
|
||||||
|
dest = 'tracepoints',
|
||||||
|
help = 'retrieve statistics from tracepoints',
|
||||||
|
)
|
||||||
|
options.add_option('-d', '--debugfs',
|
||||||
|
action = 'store_true',
|
||||||
|
default = False,
|
||||||
|
dest = 'debugfs',
|
||||||
|
help = 'retrieve statistics from debugfs',
|
||||||
|
)
|
||||||
options.add_option('-f', '--fields',
|
options.add_option('-f', '--fields',
|
||||||
action = 'store',
|
action = 'store',
|
||||||
default = None,
|
default = None,
|
||||||
|
@ -495,12 +510,19 @@ options.add_option('-f', '--fields',
|
||||||
)
|
)
|
||||||
(options, args) = options.parse_args(sys.argv)
|
(options, args) = options.parse_args(sys.argv)
|
||||||
|
|
||||||
try:
|
providers = []
|
||||||
provider = TracepointProvider()
|
if options.tracepoints:
|
||||||
except:
|
providers.append(TracepointProvider())
|
||||||
provider = DebugfsProvider()
|
if options.debugfs:
|
||||||
|
providers.append(DebugfsProvider())
|
||||||
|
|
||||||
stats = Stats(provider, fields = options.fields)
|
if len(providers) == 0:
|
||||||
|
try:
|
||||||
|
providers = [TracepointProvider()]
|
||||||
|
except:
|
||||||
|
providers = [DebugfsProvider()]
|
||||||
|
|
||||||
|
stats = Stats(providers, fields = options.fields)
|
||||||
|
|
||||||
if options.log:
|
if options.log:
|
||||||
log(stats)
|
log(stats)
|
||||||
|
|
Loading…
Reference in New Issue