Whamcloud - gitweb
LU-12461 contrib: Add epython scripts for crash dump analysis
[fs/lustre-release.git] / contrib / debug_tools / epython_scripts / crashlib / cid / vm_table.py
diff --git a/contrib/debug_tools/epython_scripts/crashlib/cid/vm_table.py b/contrib/debug_tools/epython_scripts/crashlib/cid/vm_table.py
new file mode 100644 (file)
index 0000000..7760723
--- /dev/null
@@ -0,0 +1,73 @@
+
+"""
+Provide access to the crash's vm table.
+Copyright 2014 Cray Inc.  All Rights Reserved
+"""
+
+from pykdump.API import *
+
+import crashlib.cid
+
+class VmInfo:
+    """Make data from the crash vmtbl easily available."""
+
+    def __init__(self):
+        """Extract VM table data from crash.
+
+        Initialize the table of VM information by parsing
+        the output of the 'help -v' command.  This only extracts
+        selected data.
+
+        Each item extracted is made available as an instance attribute.
+        """
+
+        # crash 'help -v' doesn't use prefixes on numbers, so we must
+        # know what number base is in use for each numeric field.
+        decFields = ('total_pages', 'max_mapnr', 'totalram_pages',
+            'totalhigh_pages', 'num_physpages',
+            'page_hash_table_len', 'kmem_max_c_num',
+            'kmem_max_limit', 'kmem_max_cpus', 'kmem_cache_count',
+            'kmem_cache_namelen', 'kmem_cache_len_nodes', 'PG_slab',
+            'paddr_prlen', 'numnodes', 'nr_zones', 'nr_free_areas',
+            'cpu_slab_type', 'nr_swapfiles', 'ZONE_HIGHMEM',
+            'node_online_map_len', 'nr_vm_stat_items',
+            'nr_vm_event_items')
+
+        hexFields = ('flags', 'high_memory', 'vmalloc_start',
+            'mem_map', 'page_hash_table', 'PG_reserved',
+            'PG_head_tail_mask', 'slab_data', 'last_swap_read',
+            'swap_info_struct', 'mem_sec', 'mem_section')
+
+        expected_key_count = len(decFields) + len(hexFields)
+
+        for line in exec_crash_command('help -v').splitlines():
+            #               flags: 10dc52
+            #  (NODES_ONLINE|ZONES|PERCPU_KMALLOC_V2|KMEM_CACHE_INIT|SPARSEMEM|SPARSEMEM_EX|PERCPU_KMALLOC_V2_NODES|VM_STAT|VM_INIT)
+            #      kernel_pgd[NR_CPUS]: ffffffff8163f000 ...
+            #         high_memory: ffff880880000000
+            #       vmalloc_start: ffffc90000000000
+            #             mem_map: 0
+            # ...
+            #
+            # Only use the first value after the field name and
+            # only for selected fields.
+            parts = line.split()
+            if len(parts) < 2: continue
+            key = parts[0].rstrip(':')
+            if key in decFields:
+                self.__dict__[key] = int(parts[1],10)
+            elif key in hexFields:
+                self.__dict__[key] = int(parts[1],16)
+
+        # If some versions of crash or the kernel don't have all the
+        # fields, this check code may need to be removed or modified.
+        if len(self.__dict__.keys()) != expected_key_count:
+            raise crashlib.ida.ParseError(
+                'Expected {:d}, but parsed {:d} entries.'.format(
+                    expected_key_count, len(self.__dict__.keys())))
+
+# --------------------------------------------------------------------------
+
+# Declare a shared instance.
+
+crashlib.cid.vmtbl = VmInfo()