tools/kvm_stat: fix fields filter for child events
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 <raspl@linux.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c795720629
commit
883d25e70b
@ -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):
|
|||||||
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
|
|||||||
*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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user