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: Stefan Raspl <raspl@linux.vnet.ibm.com>
Reviewed-By: Janosch Frank <frankja@linux.vnet.ibm.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
This commit is contained in:
Stefan Raspl 2017-03-10 13:40:08 +01:00 committed by Paolo Bonzini
parent 1eaa2f9022
commit a24e85f6a6

View File

@ -320,6 +320,37 @@ def parse_int_list(list_string):
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():
"""Returns a list of cpu id integers."""
with open('/sys/devices/system/cpu/online') as cpu_list:
@ -803,6 +834,7 @@ LABEL_WIDTH = 40
NUMBER_WIDTH = 10
DELAY_INITIAL = 0.25
DELAY_REGULAR = 3.0
MAX_GUEST_NAME_LEN = 48
class Tui(object):
@ -863,9 +895,14 @@ class Tui(object):
if pid is None:
pid = self.stats.pid_filter
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:
self.screen.addstr(0, 0, 'kvm statistics - pid {0}'
.format(pid), curses.A_BOLD)
self.screen.addstr(0, 0, 'kvm statistics - pid {0} {1}'
.format(pid, gname), curses.A_BOLD)
else:
self.screen.addstr(0, 0, 'kvm statistics - summary', curses.A_BOLD)
self.screen.addstr(2, 1, 'Event')