summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Raspl <raspl@linux.vnet.ibm.com>2017-03-10 13:40:08 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2017-03-29 12:01:28 +0200
commita24e85f6a69f09a9d09a86110a6bb168c60610ef (patch)
tree7f02c95d61606a438b956a360454286476a5c4a1
parenttools/kvm_stat: document list of interactive commands (diff)
downloadlinux-a24e85f6a69f09a9d09a86110a6bb168c60610ef.tar.xz
linux-a24e85f6a69f09a9d09a86110a6bb168c60610ef.zip
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>
-rwxr-xr-xtools/kvm/kvm_stat/kvm_stat41
1 files changed, 39 insertions, 2 deletions
diff --git a/tools/kvm/kvm_stat/kvm_stat b/tools/kvm/kvm_stat/kvm_stat
index aca85086be1e..95ffa9a4b044 100755
--- a/tools/kvm/kvm_stat/kvm_stat
+++ b/tools/kvm/kvm_stat/kvm_stat
@@ -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')