From 02d5ba2f9c9e5f3eb43647d29d6c31aeffbffcc8 Mon Sep 17 00:00:00 2001
From: Pawel Dziepak <pdziepak@quarnos.org>
Date: Wed, 28 May 2014 02:49:56 +0200
Subject: [PATCH] trace: filter memory analyzer output by minimum allocation
 count

Signed-off-by: Pawel Dziepak <pdziepak@quarnos.org>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
---
 scripts/memory_analyzer.py | 12 ++++++++++--
 scripts/trace.py           |  9 ++++++++-
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/scripts/memory_analyzer.py b/scripts/memory_analyzer.py
index 19f124cc9..2b85d8aad 100644
--- a/scripts/memory_analyzer.py
+++ b/scripts/memory_analyzer.py
@@ -155,8 +155,10 @@ class TreeKey(object):
     def __hash__(self):
         return self.this.__hash__()
 
+def filter_min_count(min_count):
+    return lambda node: node.key.alloc >= min_count
 
-def show_results(mallocs):
+def show_results(mallocs, node_filters):
     root = tree.TreeNode(TreeKey('All', None))
 
     lost = 0
@@ -189,4 +191,10 @@ def show_results(mallocs):
     def formatter(key):
         return key.key.__str__()
 
-    tree.print_tree(root, formatter)
+    def node_filter(*args):
+        for filter in node_filters:
+            if not filter(*args):
+                return False
+        return True
+
+    tree.print_tree(root, formatter, node_filter=node_filter)
diff --git a/scripts/trace.py b/scripts/trace.py
index 0d5ca2087..0e006d976 100755
--- a/scripts/trace.py
+++ b/scripts/trace.py
@@ -111,9 +111,14 @@ def list_trace(args):
 
 def mem_analys(args):
     mallocs = {}
+
+    node_filters = []
+    if args.min_count:
+        node_filters.append(memory_analyzer.filter_min_count(args.min_count))
+
     with get_trace_reader(args) as reader:
         memory_analyzer.process_records(mallocs, reader.get_traces())
-        memory_analyzer.show_results(mallocs)
+        memory_analyzer.show_results(mallocs, node_filters)
 
 def add_time_slicing_options(parser):
     group = parser.add_argument_group('time slicing')
@@ -560,6 +565,8 @@ if __name__ == "__main__":
         Requires memory_* tracepoints enabled.
         """)
     add_trace_source_options(cmd_memory_analyzer)
+    cmd_memory_analyzer.add_argument("--min-count", action='store', type=int,
+        help="show only allocations at least as frequent as the specified threshold")
     cmd_memory_analyzer.set_defaults(func=mem_analys, paginate=True)
 
     args = parser.parse_args()
-- 
GitLab