Commit a24e85f6 authored by Stefan Raspl's avatar Stefan Raspl Committed by Paolo Bonzini

tools/kvm_stat: display guest name when using pid filter

When running kvm_stat with option '-p' to filter per process, display
the QEMU guest name next to the pid, if available.
Signed-off-by: default avatarStefan Raspl <raspl@linux.vnet.ibm.com>
Reviewed-By: default avatarJanosch Frank <frankja@linux.vnet.ibm.com>
Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
parent 1eaa2f90
...@@ -320,6 +320,37 @@ def parse_int_list(list_string): ...@@ -320,6 +320,37 @@ def parse_int_list(list_string):
return integers return integers
def get_gname_from_pid(pid):
"""Returns the guest name for a QEMU process pid.
Extracts the guest name from the QEMU comma line by processing the '-name'
option. Will also handle names specified out of sequence.
"""
name = ''
try:
line = open('/proc/{}/cmdline'.format(pid), 'rb').read().split('\0')
parms = line[line.index('-name') + 1].split(',')
while '' in parms:
# commas are escaped (i.e. ',,'), hence e.g. 'foo,bar' results in
# ['foo', '', 'bar'], which we revert here
idx = parms.index('')
parms[idx - 1] += ',' + parms[idx + 1]
del parms[idx:idx+2]
# the '-name' switch allows for two ways to specify the guest name,
# where the plain name overrides the name specified via 'guest='
for arg in parms:
if '=' not in arg:
name = arg
break
if arg[:6] == 'guest=':
name = arg[6:]
except (ValueError, IOError, IndexError):
pass
return name
def get_online_cpus(): def get_online_cpus():
"""Returns a list of cpu id integers.""" """Returns a list of cpu id integers."""
with open('/sys/devices/system/cpu/online') as cpu_list: with open('/sys/devices/system/cpu/online') as cpu_list:
...@@ -803,6 +834,7 @@ LABEL_WIDTH = 40 ...@@ -803,6 +834,7 @@ LABEL_WIDTH = 40
NUMBER_WIDTH = 10 NUMBER_WIDTH = 10
DELAY_INITIAL = 0.25 DELAY_INITIAL = 0.25
DELAY_REGULAR = 3.0 DELAY_REGULAR = 3.0
MAX_GUEST_NAME_LEN = 48
class Tui(object): class Tui(object):
...@@ -863,9 +895,14 @@ class Tui(object): ...@@ -863,9 +895,14 @@ class Tui(object):
if pid is None: if pid is None:
pid = self.stats.pid_filter pid = self.stats.pid_filter
self.screen.erase() self.screen.erase()
gname = get_gname_from_pid(pid)
if gname:
gname = ('({})'.format(gname[:MAX_GUEST_NAME_LEN] + '...'
if len(gname) > MAX_GUEST_NAME_LEN
else gname))
if pid > 0: if pid > 0:
self.screen.addstr(0, 0, 'kvm statistics - pid {0}' self.screen.addstr(0, 0, 'kvm statistics - pid {0} {1}'
.format(pid), curses.A_BOLD) .format(pid, gname), curses.A_BOLD)
else: else:
self.screen.addstr(0, 0, 'kvm statistics - summary', curses.A_BOLD) self.screen.addstr(0, 0, 'kvm statistics - summary', curses.A_BOLD)
self.screen.addstr(2, 1, 'Event') self.screen.addstr(2, 1, 'Event')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment