12 Dec, 2020

1 commit

  • The new counters halt_poll_success_ns and halt_poll_fail_ns do not count
    events. Instead they provide a time, and mess up our statistics. Therefore,
    we should exclude them.
    Removal is currently implemented with an exempt list. If more counters like
    these appear, we can think about a more general rule like excluding all
    fields name "*_ns", in case that's a standing convention.

    Signed-off-by: Stefan Raspl
    Tested-and-reported-by: Christian Borntraeger
    Message-Id:
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     

21 Apr, 2020

3 commits

  • Add a sample unit file as a basis for systemd integration of kvm_stat
    logs.

    Signed-off-by: Stefan Raspl
    Message-Id:
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • To integrate with logrotate, we have a signal handler that will re-open
    the logfile.
    Assuming we have a systemd unit file with
    ExecStart=kvm_stat -dtc -s 10 -L /var/log/kvm_stat.csv
    ExecReload=/bin/kill -HUP $MAINPID
    and a logrotate config featuring
    postrotate
    /bin/systemctl reload kvm_stat.service
    endscript
    Then the overall flow will look like this:
    (1) systemd starts kvm_stat, logging to A.
    (2) At some point, logrotate runs, moving A to B.
    kvm_stat continues to write to B at this point.
    (3) After rotating, logrotate restarts the kvm_stat unit via systemctl.
    (4) The kvm_stat unit sends a SIGHUP to kvm_stat, finally making it
    switch over to writing to A again.
    Note that in order to keep the structure of the cvs output in tact, we
    make sure to, in contrast to the standard log format, only write the
    header once at the beginning of a file. This implies that the header is
    suppressed when appending to an existing file. Unlike with the standard
    format, where we append to an existing file by starting out with a
    header.

    Signed-off-by: Stefan Raspl
    Message-Id:
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • When running in logging mode, skip records with all zeros (=empty records)
    to preserve space when logging to files.

    Signed-off-by: Stefan Raspl
    Message-Id:
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     

24 Mar, 2020

4 commits

  • Add an alternative format that can be more easily used for further
    processing later on.
    Note that we add a timestamp in the first column for both, the regular
    and the new csv format.

    Signed-off-by: Stefan Raspl
    Message-Id:
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • This now controls both, the refresh rate of the interactive mode as well
    as the logging mode. Which, as a consequence, means that the default of
    logging mode is now 3s, too (use command line switch '-s' to adjust to
    your liking).

    Signed-off-by: Stefan Raspl
    Message-Id:
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • optparse is deprecated for a while, hence switching over to argparse
    (which also works with python2).
    As a consequence, help output has some subtle changes, the most
    significant one being that the options are all listed explicitly
    instead of a universal '[options]' indicator. Also, some of the error
    messages are phrased slightly different.
    While at it, squashed a number of minor PEP8 issues.

    Signed-off-by: Stefan Raspl
    Message-Id:
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Make sure command line arguments are sorted alphabetically
    everywhere, and adjusted existing texts for interactive command 's' to
    become consistent with the long form --set-delay.
    Throwing in some PEP8 fixes (all cosmetics) for good measure.

    Signed-off-by: Stefan Raspl
    Message-Id:
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     

23 Jan, 2020

1 commit

  • The filter name is fixed to "exit_reason" for some kvm_exit events, no
    matter what architect we have. Actually, the filter name ("exit_reason")
    is only applicable to x86, meaning it's broken on other architects
    including aarch64.

    This fixes the issue by providing various kvm_exit filter names, depending
    on architect we're on. Afterwards, the variable filter name is picked and
    applied through ioctl(fd, SET_FILTER).

    Reported-by: Andrew Jones
    Signed-off-by: Gavin Shan
    Cc: stable@vger.kernel.org
    Signed-off-by: Paolo Bonzini

    Gavin Shan
     

19 Jun, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this work is licensed under the terms of the gnu gpl version 2 see
    the copying file in the top level directory

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 35 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Kate Stewart
    Reviewed-by: Enrico Weigelt
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190604081206.797835076@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

25 May, 2019

1 commit

  • The fields filter would not work with child fields, as the respective
    parents would not be included. No parents displayed == no childs displayed.
    To reproduce, run on s390 (would work on other platforms, too, but would
    require a different filter name):
    - Run 'kvm_stat -d'
    - Press 'f'
    - Enter 'instruct'
    Notice that events like instruction_diag_44 or instruction_diag_500 are not
    displayed - the output remains empty.
    With this patch, we will filter by matching events and their parents.
    However, consider the following example where we filter by
    instruction_diag_44:

    kvm statistics - summary
    regex filter: instruction_diag_44
    Event Total %Total CurAvg/s
    exit_instruction 276 100.0 12
    instruction_diag_44 256 92.8 11
    Total 276 12

    Note that the parent ('exit_instruction') displays the total events, but
    the childs listed do not match its total (256 instead of 276). This is
    intended (since we're filtering all but one child), but might be confusing
    on first sight.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     

27 Nov, 2018

1 commit

  • The current shebang does not work in environments that only support python3
    and have no python2 installed. Plus there does not seem to be a way to
    support python2 and python3 at the same time. Since all known python3 issues
    were fixed, and as python3 is the way to go, let's switch over.
    Note that the code is still python2 compliant, so folks in bad use can
    simply revert the shebang.

    Suggested-by: Christian Ehrhardt
    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     

01 Oct, 2018

1 commit


30 Aug, 2018

7 commits

  • When filtering by guest (interactive commands 'p'/'g'), and the respective
    guest was destroyed, detect when the guest is up again through the guest
    name if possible.
    I.e. when displaying events for a specific guest, it is not necessary
    anymore to restart kvm_stat in case the guest is restarted.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Stefan Raspl
     
  • For destroyed guests, kvm_stat essentially freezes with the last data
    displayed. This is acceptable for users, in case they want to inspect the
    final data. But it looks a bit irritating. Therefore, detect this situation
    and display a respective indicator in the header.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Stefan Raspl
     
  • When running with the DebugFS provider, removal of a guest can result in a
    negative CurAvg/s, which looks rather confusing.
    If so, suppress the body refresh and print a message instead.
    To reproduce, have at least one guest A completely booted. Then start
    another guest B (which generates a huge amount of events), then destroy B.
    On the next refresh, kvm_stat should display a whole lot of negative values
    in the CurAvg/s column.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Stefan Raspl
     
  • When setting a PID filter in debugfs, we unnecessarily reset the
    statistics, although there is no reason to do so. This behavior was
    merely introduced with commit 9f114a03c6854f "tools/kvm_stat: add
    interactive command 'r'", most likely to mimic the behavior of
    the tracepoints provider in this respect. However, there are plenty
    of differences between the two providers, so there is no reason not
    to take advantage of the possibility to filter by PID without
    resetting the statistics.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Stefan Raspl
     
  • With pid filtering active, when a guest is removed e.g. via virsh shutdown,
    successive updates produce garbage.
    Therefore, we add code to detect this case and prevent further body updates.
    Note that when displaying the help dialog via 'h' in this case, once we exit
    we're stuck with the 'Collecting data...' message till we remove the filter.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Stefan Raspl
     
  • When filtering by guest, kvm_stat displays garbage when the guest is
    destroyed - see sample output below.
    We add code to remove the invalid paths from the providers, so at least
    no more garbage is displayed.
    Here's a sample output to illustrate:

    kvm statistics - pid 13986 (foo)

    Event Total %Total CurAvg/s
    diagnose_258 -2 0.0 0
    deliver_program_interruption -3 0.0 0
    diagnose_308 -4 0.0 0
    halt_poll_invalid -91 0.0 -6
    deliver_service_signal -244 0.0 -16
    halt_successful_poll -250 0.1 -17
    exit_pei -285 0.1 -19
    exit_external_request -312 0.1 -21
    diagnose_9c -328 0.1 -22
    userspace_handled -713 0.1 -47
    halt_attempted_poll -939 0.2 -62
    deliver_emergency_signal -3126 0.6 -208
    halt_wakeup -7199 1.5 -481
    exit_wait_state -7379 1.5 -493
    diagnose_500 -56499 11.5 -3757
    exit_null -85491 17.4 -5685
    diagnose_44 -133300 27.1 -8874
    exit_instruction -195898 39.8 -13037
    Total -492063

    Signed-off-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Stefan Raspl
     
  • Python3 returns a float for a regular division - switch to a division
    operator that returns an integer.
    Furthermore, filters return a generator object instead of the actual
    list - wrap result in yet another list, which makes it still work in
    both, Python2 and 3.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Stefan Raspl
     

29 Mar, 2018

3 commits

  • Unused since added in 18e8f4100

    Signed-off-by: Cole Robinson
    Reviewed-and-tested-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Cole Robinson
     
  • $ python3 tools/kvm/kvm_stat/kvm_stat
    Traceback (most recent call last):
    File "tools/kvm/kvm_stat/kvm_stat", line 1668, in
    main()
    File "tools/kvm/kvm_stat/kvm_stat", line 1639, in main
    assign_globals()
    File "tools/kvm/kvm_stat/kvm_stat", line 1618, in assign_globals
    for line in file('/proc/mounts'):
    NameError: name 'file' is not defined

    open() is the python3 way, and works on python2.6+

    Signed-off-by: Cole Robinson
    Reviewed-and-tested-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Cole Robinson
     
  • $ python3 tools/kvm/kvm_stat/kvm_stat
    File "tools/kvm/kvm_stat/kvm_stat", line 1137
    def sortkey((_k, v)):
    ^
    SyntaxError: invalid syntax

    Fix it in a way that's compatible with python2 and python3

    Signed-off-by: Cole Robinson
    Tested-by: Stefan Raspl
    Signed-off-by: Radim Krčmář

    Cole Robinson
     

24 Feb, 2018

12 commits

  • The 'Total' line looks a bit weird when we have a single event only. This
    can happen e.g. due to filters. Therefore suppress when there's only a
    single event in the output.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • We keep the current logic that sorts all events (parent and child), but
    re-shuffle the events afterwards, grouping the children after the
    respective parent. Note that the percentage column for child events
    gives the percentage of the parent's total.
    Since we rework the logic anyway, we modify the total average
    calculation to use the raw numbers instead of the (rounded) averages.
    Note that this can result in differing numbers (between total average
    and the sum of the individual averages) due to rounding errors.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Drilldown (i.e. toggle display of child trace events) was implemented by
    overriding the fields filter. This resulted in inconsistencies: E.g. when
    drilldown was not active, adding a filter that also matches child trace
    events would not only filter fields according to the filter, but also add
    in the child trace events matching the filter. E.g. on x86, setting
    'kvm_userspace_exit' as the fields filter after startup would result in
    display of kvm_userspace_exit(DCR), although that wasn't previously
    present - not exactly what one would expect from a filter.
    This patch addresses the issue by keeping drilldown and fields filter
    separate. While at it, we also fix a PEP8 issue by adding a blank line
    at one place (since we're in the area...).
    We implement this by adding a framework that also allows to define a
    taxonomy among the debugfs events to identify child trace events. I.e.
    drilldown using 'x' can now also work with debugfs. A respective parent-
    child relationship is only known for S390 at the moment, but could be
    added adjusting other platforms' ARCH.dbg_is_child() methods
    accordingly.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • We can do with a single dialog that takes both, pids and guest names.
    Note that we keep both interactive commands, 'p' and 'g' for now, to
    avoid confusion among users used to a specific key.

    While at it, we improve on some minor glitches regarding curses usage,
    e.g. cursor still visible when not supposed to be.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Helps quite a bit reading the code when it's obvious when a method is
    intended for internal use only.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Te checks for debugfs assumed that debugfs is always mounted at
    /sys/kernel/debug - which is likely, but not guaranteed. This is addressed
    by checking /proc/mounts for the actual location.
    Furthermore, when debugfs was mounted, but the kvm module not loaded, a
    misleading error pointing towards debugfs not present was given.
    To reproduce,
    (a) run kvm_stat with debugfs mounted at a place different from
    /sys/kernel/debug
    (b) run kvm_stat with debugfs mounted but kvm module not loaded

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Entering an invalid regular expression did not produce any indication of an
    error so far.
    To reproduce, press 'f' and enter 'foo(' (with an unescaped bracket).

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • When we apply a filter that will only leave child trace events, we
    receive a ZeroDivisionError when calculating the percentages.
    In that case, provide percentages based on child events only.
    To reproduce, run 'kvm_stat -f .*[\(].*'.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Use '==' for equality checks and 'is' when comparing identities.

    An example where '==' and 'is' behave differently:
    >>> a = 4242
    >>> a == 4242
    True
    >>> a is 4242
    False

    Signed-off-by: Marc Hartmayer
    Signed-off-by: Paolo Bonzini

    Marc Hartmayer
     
  • If it's clear that the values of a dictionary will be used then use
    the '.items()' method.

    Signed-off-by: Marc Hartmayer
    Tested-by: Stefan Raspl
    [Include fix for logging mode by Stefan Raspl]
    Signed-off-by: Paolo Bonzini

    Marc Hartmayer
     
  • Use a namedtuple for storing the values as it allows to access the
    fields of a tuple via names. This makes the overall code much easier
    to read and to understand. Access by index is still possible as
    before.

    Signed-off-by: Marc Hartmayer
    Tested-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Marc Hartmayer
     
  • The 'sortkey' function references a value in its enclosing
    scope (closure). This is not common practice for a sort key function
    so let's replace it. Additionally, the function 'sorted' has already a
    parameter for reversing the result therefore the inversion of the
    values is unneeded. The check for stats[x][1] is also superfluous as
    it's ensured that this value is initialized with 0.

    Signed-off-by: Marc Hartmayer
    Tested-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Marc Hartmayer
     

21 Dec, 2017

1 commit

  • Sort the fields returned by specifying '-f help' on the command line.
    While at it, simplify the code a bit, indent the output and eliminate an
    extra blank line at the beginning.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     

14 Dec, 2017

4 commits

  • Add a line for the total number of events and current average at the
    bottom of the body.
    Note that both values exclude child trace events. I.e. if drilldown is
    activated via interactive command 'x', only the totals are accounted, or
    we'd be counting these twice (see previous commit "tools/kvm_stat: fix
    child trace events accounting").

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Unhandled arguments, which could easily include typos, are simply
    ignored. We should be strict to avoid undetected typos.
    To reproduce start kvm_stat with an extra argument, e.g.
    'kvm_stat -d bnuh5ol' and note that this will actually work.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Errors while parsing the '-g' command line argument result in display of
    usage information prior to the error message. This is a bit confusing,
    as the command line is syntactically correct.
    To reproduce, run 'kvm_stat -g' and specify a non-existing or inactive
    guest.

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl
     
  • Passing an invalid regular expression on the command line results in a
    traceback. Note that interactive specification of invalid regular
    expressions is not affected
    To reproduce, run "kvm_stat -f '*'".

    Signed-off-by: Stefan Raspl
    Signed-off-by: Paolo Bonzini

    Stefan Raspl