Whamcloud - gitweb
LU-12461 contrib: Add epython scripts for crash dump analysis
[fs/lustre-release.git] / contrib / debug_tools / epython_scripts / crashlib / cid / page_flags.py
diff --git a/contrib/debug_tools/epython_scripts/crashlib/cid/page_flags.py b/contrib/debug_tools/epython_scripts/crashlib/cid/page_flags.py
new file mode 100644 (file)
index 0000000..20cb0b7
--- /dev/null
@@ -0,0 +1,61 @@
+
+"""
+Provide access to the page flags known by crash.
+Copyright 2014 Cray Inc.  All Rights Reserved
+
+The data is gathered from the 'kmem -g' command.
+"""
+
+from pykdump.API import *
+
+import crashlib.cid
+
+
+class PageFlag:
+    # Note: This class should probably be abstracted somewhere as a
+    # bit or bitmask class, but since we don't have that yet, just
+    # create a new class here.
+    """Represent a flag as a bit mask and a shift value."""
+    def __init__(self, name, shift_val):
+        self.name  = name
+        self.shift = int(shift_val)
+        self.mask  = 1 << self.shift
+
+    def __call__(self):
+        return self.mask
+
+
+class MachPageFlags:
+    """Extract the machine-specific page flags from crash.
+
+    When instantiated, this class produces an object with data members
+    for each kernel page flag that crash knows about, based on the kernel
+    version.  Each page flag is an instance of class PageFlag.  An example
+    of usage would be:
+
+        page = readSU('struct page', page_addr)
+        kpf = MachPageFlags()
+        if page.flags & kpf.PG_slab.mask:
+            ...
+    """
+
+    def __init__(self):
+        """Extract the page flags from the crash 'kmem -g' command."""
+        for line in exec_crash_command('kmem -g').splitlines():
+            # crash> kmem -g
+            # PAGE-FLAG       BIT  VALUE
+            # PG_locked         0  0000001
+            # PG_waiters        1  0000002
+            # ...
+            fields = line.split()
+            if len(fields) < 3 or fields[0][0:3] != 'PG_': continue
+
+            name  = fields[0]
+            shift = int(fields[1])
+            self.__dict__[name] = PageFlag(name, shift)
+
+# --------------------------------------------------------------------------
+
+# Create a shared instances of the above classes.
+
+crashlib.cid.pgflags = MachPageFlags()