Blame SOURCES/kvm-tools-kvm_stat-add-new-interactive-command-s.patch

4a2fec
From 25c56e3212fa11d526544b402f4f19234cf991e8 Mon Sep 17 00:00:00 2001
4a2fec
From: David Hildenbrand <david@redhat.com>
4a2fec
Date: Tue, 17 Oct 2017 19:15:58 +0200
4a2fec
Subject: [PATCH 53/69] tools/kvm_stat: add new interactive command 's'
4a2fec
4a2fec
RH-Author: David Hildenbrand <david@redhat.com>
4a2fec
Message-id: <20171017191605.2378-33-david@redhat.com>
4a2fec
Patchwork-id: 77336
4a2fec
O-Subject: [RHEL-7.5 qemu-kvm-rhev PATCH 32/39] tools/kvm_stat: add new interactive command 's'
4a2fec
Bugzilla: 1497137
4a2fec
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
4a2fec
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
4a2fec
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
4a2fec
RH-Acked-by: Thomas Huth <thuth@redhat.com>
4a2fec
4a2fec
Upstream-status: linux.git 64eefad2cdbf2d7c76e24d0b67e19efdbe1c97a9
4a2fec
4a2fec
Convertion of documentation (for man page generation) to texi.
4a2fec
4a2fec
commit 64eefad2cdbf2d7c76e24d0b67e19efdbe1c97a9
4a2fec
Author: Stefan Raspl <raspl@linux.vnet.ibm.com>
4a2fec
Date:   Wed Jun 7 21:08:39 2017 +0200
4a2fec
4a2fec
    tools/kvm_stat: add new interactive command 's'
4a2fec
4a2fec
    Add new command 's' to modify the update interval. Limited to a maximum of
4a2fec
    25.5 sec and a minimum of 0.1 sec, since curses cannot handle longer
4a2fec
    and shorter delays respectively.
4a2fec
4a2fec
    Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
4a2fec
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
4a2fec
4a2fec
Signed-off-by: David Hildenbrand <david@redhat.com>
4a2fec
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
4a2fec
---
4a2fec
 scripts/kvm/kvm_stat      | 55 ++++++++++++++++++++++++++++++++++++++++-------
4a2fec
 scripts/kvm/kvm_stat.texi |  3 +++
4a2fec
 2 files changed, 50 insertions(+), 8 deletions(-)
4a2fec
4a2fec
diff --git a/scripts/kvm/kvm_stat b/scripts/kvm/kvm_stat
4a2fec
index 6838de3..1276b88 100755
4a2fec
--- a/scripts/kvm/kvm_stat
4a2fec
+++ b/scripts/kvm/kvm_stat
4a2fec
@@ -844,8 +844,7 @@ class Stats(object):
4a2fec
                 self.values[key] = (newval, newdelta)
4a2fec
         return self.values
4a2fec
 
4a2fec
-DELAY_INITIAL = 0.25
4a2fec
-DELAY_REGULAR = 3.0
4a2fec
+DELAY_DEFAULT = 3.0
4a2fec
 MAX_GUEST_NAME_LEN = 48
4a2fec
 MAX_REGEX_LEN = 44
4a2fec
 DEFAULT_REGEX = r'^[^\(]*$'
4a2fec
@@ -856,6 +855,8 @@ class Tui(object):
4a2fec
     def __init__(self, stats):
4a2fec
         self.stats = stats
4a2fec
         self.screen = None
4a2fec
+        self._delay_initial = 0.25
4a2fec
+        self._delay_regular = DELAY_DEFAULT
4a2fec
 
4a2fec
     def __enter__(self):
4a2fec
         """Initialises curses for later use.  Based on curses.wrapper
4a2fec
@@ -1027,6 +1028,7 @@ class Tui(object):
4a2fec
                '   p     filter by PID',
4a2fec
                '   q     quit',
4a2fec
                '   r     reset stats',
4a2fec
+               '   s     set update interval',
4a2fec
                '   x     toggle reporting of stats for individual child trace'
4a2fec
                ' events',
4a2fec
                'Any other key refreshes statistics immediately')
4a2fec
@@ -1106,10 +1108,41 @@ class Tui(object):
4a2fec
                 self.refresh_header(pid)
4a2fec
                 self.update_pid(pid)
4a2fec
                 break
4a2fec
-
4a2fec
             except ValueError:
4a2fec
                 msg = '"' + str(pid) + '": Not a valid pid'
4a2fec
 
4a2fec
+    def show_set_update_interval(self):
4a2fec
+        """Draws update interval selection mask."""
4a2fec
+        msg = ''
4a2fec
+        while True:
4a2fec
+            self.screen.erase()
4a2fec
+            self.screen.addstr(0, 0, 'Set update interval (defaults to %fs).' %
4a2fec
+                               DELAY_DEFAULT, curses.A_BOLD)
4a2fec
+            self.screen.addstr(4, 0, msg)
4a2fec
+            self.screen.addstr(2, 0, 'Change delay from %.1fs to ' %
4a2fec
+                               self._delay_regular)
4a2fec
+            curses.echo()
4a2fec
+            val = self.screen.getstr()
4a2fec
+            curses.noecho()
4a2fec
+
4a2fec
+            try:
4a2fec
+                if len(val) > 0:
4a2fec
+                    delay = float(val)
4a2fec
+                    if delay < 0.1:
4a2fec
+                        msg = '"' + str(val) + '": Value must be >=0.1'
4a2fec
+                        continue
4a2fec
+                    if delay > 25.5:
4a2fec
+                        msg = '"' + str(val) + '": Value must be <=25.5'
4a2fec
+                        continue
4a2fec
+                else:
4a2fec
+                    delay = DELAY_DEFAULT
4a2fec
+                self._delay_regular = delay
4a2fec
+                break
4a2fec
+
4a2fec
+            except ValueError:
4a2fec
+                msg = '"' + str(val) + '": Invalid value'
4a2fec
+        self.refresh_header()
4a2fec
+
4a2fec
     def show_vm_selection_by_guest_name(self):
4a2fec
         """Draws guest selection mask.
4a2fec
 
4a2fec
@@ -1156,14 +1189,14 @@ class Tui(object):
4a2fec
 
4a2fec
     def show_stats(self):
4a2fec
         """Refreshes the screen and processes user input."""
4a2fec
-        sleeptime = DELAY_INITIAL
4a2fec
+        sleeptime = self._delay_initial
4a2fec
         self.refresh_header()
4a2fec
         start = 0.0  # result based on init value never appears on screen
4a2fec
         while True:
4a2fec
             self.refresh_body(time.time() - start)
4a2fec
             curses.halfdelay(int(sleeptime * 10))
4a2fec
             start = time.time()
4a2fec
-            sleeptime = DELAY_REGULAR
4a2fec
+            sleeptime = self._delay_regular
4a2fec
             try:
4a2fec
                 char = self.screen.getkey()
4a2fec
                 if char == 'c':
4a2fec
@@ -1174,23 +1207,28 @@ class Tui(object):
4a2fec
                     curses.curs_set(1)
4a2fec
                     self.show_filter_selection()
4a2fec
                     curses.curs_set(0)
4a2fec
-                    sleeptime = DELAY_INITIAL
4a2fec
+                    sleeptime = self._delay_initial
4a2fec
                 if char == 'g':
4a2fec
                     curses.curs_set(1)
4a2fec
                     self.show_vm_selection_by_guest_name()
4a2fec
                     curses.curs_set(0)
4a2fec
-                    sleeptime = DELAY_INITIAL
4a2fec
+                    sleeptime = self._delay_initial
4a2fec
                 if char == 'h':
4a2fec
                     self.show_help_interactive()
4a2fec
                 if char == 'p':
4a2fec
                     curses.curs_set(1)
4a2fec
                     self.show_vm_selection_by_pid()
4a2fec
                     curses.curs_set(0)
4a2fec
-                    sleeptime = DELAY_INITIAL
4a2fec
+                    sleeptime = self._delay_initial
4a2fec
                 if char == 'q':
4a2fec
                     break
4a2fec
                 if char == 'r':
4a2fec
                     self.stats.reset()
4a2fec
+                if char == 's':
4a2fec
+                    curses.curs_set(1)
4a2fec
+                    self.show_set_update_interval()
4a2fec
+                    curses.curs_set(0)
4a2fec
+                    sleeptime = self._delay_initial
4a2fec
                 if char == 'x':
4a2fec
                     self.update_drilldown()
4a2fec
             except KeyboardInterrupt:
4a2fec
@@ -1267,6 +1305,7 @@ Interactive Commands:
4a2fec
    p     filter by PID
4a2fec
    q     quit
4a2fec
    r     reset stats
4a2fec
+   s     set update interval
4a2fec
    x     toggle reporting of stats for individual child trace events
4a2fec
 Press any other key to refresh statistics immediately.
4a2fec
 """
4a2fec
diff --git a/scripts/kvm/kvm_stat.texi b/scripts/kvm/kvm_stat.texi
4a2fec
index 4dfcd8f..f0066ff 100644
4a2fec
--- a/scripts/kvm/kvm_stat.texi
4a2fec
+++ b/scripts/kvm/kvm_stat.texi
4a2fec
@@ -45,6 +45,9 @@ quit
4a2fec
 @item r
4a2fec
 @kindex r
4a2fec
 reset stats
4a2fec
+@item s
4a2fec
+@kindex s
4a2fec
+set update interval
4a2fec
 @item x
4a2fec
 @kindex x
4a2fec
 toggle reporting of stats for child trace events
4a2fec
-- 
4a2fec
1.8.3.1
4a2fec