Commit 9fd59946 authored by Stefan Raspl's avatar Stefan Raspl Committed by Greg Kroah-Hartman

tools/kvm_stat: fix fields filter for child events

[ Upstream commit 883d25e7 ]

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: default avatarStefan Raspl <raspl@linux.ibm.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 14be6a98
...@@ -575,8 +575,12 @@ class TracepointProvider(Provider): ...@@ -575,8 +575,12 @@ class TracepointProvider(Provider):
def update_fields(self, fields_filter): def update_fields(self, fields_filter):
"""Refresh fields, applying fields_filter""" """Refresh fields, applying fields_filter"""
self.fields = [field for field in self._get_available_fields() self.fields = [field for field in self._get_available_fields()
if self.is_field_wanted(fields_filter, field) or if self.is_field_wanted(fields_filter, field)]
ARCH.tracepoint_is_child(field)] # add parents for child fields - otherwise we won't see any output!
for field in self._fields:
parent = ARCH.tracepoint_is_child(field)
if (parent and parent not in self._fields):
self.fields.append(parent)
@staticmethod @staticmethod
def _get_online_cpus(): def _get_online_cpus():
...@@ -735,8 +739,12 @@ class DebugfsProvider(Provider): ...@@ -735,8 +739,12 @@ class DebugfsProvider(Provider):
def update_fields(self, fields_filter): def update_fields(self, fields_filter):
"""Refresh fields, applying fields_filter""" """Refresh fields, applying fields_filter"""
self._fields = [field for field in self._get_available_fields() self._fields = [field for field in self._get_available_fields()
if self.is_field_wanted(fields_filter, field) or if self.is_field_wanted(fields_filter, field)]
ARCH.debugfs_is_child(field)] # add parents for child fields - otherwise we won't see any output!
for field in self._fields:
parent = ARCH.debugfs_is_child(field)
if (parent and parent not in self._fields):
self.fields.append(parent)
@property @property
def fields(self): def fields(self):
......
...@@ -34,6 +34,8 @@ INTERACTIVE COMMANDS ...@@ -34,6 +34,8 @@ INTERACTIVE COMMANDS
*c*:: clear filter *c*:: clear filter
*f*:: filter by regular expression *f*:: filter by regular expression
:: *Note*: Child events pull in their parents, and parents' stats summarize
all child events, not just the filtered ones
*g*:: filter by guest name/PID *g*:: filter by guest name/PID
......
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