Whamcloud - gitweb
LU-12461 contrib: Add epython scripts for crash dump analysis
[fs/lustre-release.git] / contrib / debug_tools / epython_scripts / ldlm_lockflags.py
1 #!/usr/bin/env python
2
3 """
4 Utility to print LDLM lock flags as strings
5 Copyright (c) 2019 Cray Inc. All Rights Reserved.
6 """
7 from pykdump.API import *
8 from crashlib.input import toint
9 import argparse
10
11 description_short  = "Prints string identifiers for specified LDLM flags."
12 LDLM_FL_ALL_FLAGS_MASK = 0x00FFFFFFC28F932F
13
14 ldlm_flags_tbl = {
15     0x0000000000000001:  "LOCK_CHANGED",            # bit  0
16     0x0000000000000002:  "BLOCK_GRANTED",           # bit  1
17     0x0000000000000004:  "BLOCK_CONV",              # bit  2
18     0x0000000000000008:  "BLOCK_WAIT",              # bit  3
19     0x0000000000000010:  "SPECULATIVE",             # bit  4
20     0x0000000000000020:  "AST_SENT",                # bit  5
21     0x0000000000000100:  "REPLAY",                  # bit  8
22     0x0000000000000200:  "INTENT_ONLY",             # bit  9
23     0x0000000000001000:  "HAS_INTENT",              # bit 12
24     0x0000000000008000:  "FLOCK_DEADLOCK",          # bit 15
25     0x0000000000010000:  "DISCARD_DATA",            # bit 16
26     0x0000000000020000:  "NO_TIMEOUT",              # bit 17
27     0x0000000000040000:  "BLOCK_NOWAIT",            # bit 18
28     0x0000000000080000:  "TEST_LOCK",               # bit 19
29     0x0000000000100000:  "MATCH_LOCK",              # bit 20
30     0x0000000000800000:  "CANCEL_ON_BLOCK",         # bit 23
31     0x0000000001000000:  "COS_INCOMPAT",            # bit 24
32     0x0000000002000000:  "CONVERTING",              # bit 25
33     0x0000000010000000:  "LOCKAHEAD_OLD_RESERVED",  # bit 28
34     0x0000000020000000:  "NO_EXPANSION",            # bit 29
35     0x0000000040000000:  "DENY_ON_CONTENTION",      # bit 30
36     0x0000000080000000:  "AST_DISCARD_DATA",        # bit 31
37     0x0000000100000000:  "FAIL_LOC",                # bit 32
38     0x0000000400000000:  "CBPENDING",               # bit 34
39     0x0000000800000000:  "WAIT_NOREPROC",           # bit 35
40     0x0000001000000000:  "CANCEL",                  # bit 36
41     0x0000002000000000:  "LOCAL_ONLY",              # bit 37
42     0x0000004000000000:  "FAILED",                  # bit 38
43     0x0000008000000000:  "CANCELING",               # bit 39
44     0x0000010000000000:  "LOCAL",                   # bit 40
45     0x0000020000000000:  "LVB_READY",               # bit 41
46     0x0000040000000000:  "KMS_IGNORE",              # bit 42
47     0x0000080000000000:  "CP_REQD",                 # bit 43
48     0x0000100000000000:  "CLEANED",                 # bit 44
49     0x0000200000000000:  "ATOMIC_CB",               # bit 45
50     0x0000400000000000:  "BL_AST",                  # bit 46
51     0x0000800000000000:  "BL_DONE",                 # bit 47
52     0x0001000000000000:  "NO_LRU",                  # bit 48
53     0x0002000000000000:  "FAIL_NOTIFIED",           # bit 49
54     0x0004000000000000:  "DESTROYED",               # bit 50
55     0x0008000000000000:  "SERVER_LOCK",             # bit 51
56     0x0010000000000000:  "RES_LOCKED",              # bit 52
57     0x0020000000000000:  "WAITED",                  # bit 53
58     0x0040000000000000:  "NS_SRV",                  # bit 54
59     0x0080000000000000:  "EXCL",                    # bit 55
60     0x0100000000000000:  "RESENT",                  # bit 56
61     0x0200000000000000:  "COS_ENABLED",             # bit 57
62     0x0400000000000000:  "NDELAY"                   # bit 58
63 }
64
65 def print_flags(flag_dict, mask):
66
67     flags = ""
68     tmp = mask
69     for key, value in flag_dict.iteritems():
70             if key & mask:
71                 flags = flags + value + " "
72                 tmp &= ~key
73     print "mask: 0x%x = %s" % (mask, flags)
74     if tmp != 0:
75         print "unknown bits set in mask: 0x%x" % tmp
76
77 if __name__ == "__main__":
78     description = "Prints string identifiers for specified LDLM flags."
79     parser = argparse.ArgumentParser(description=description)
80     parser.add_argument("bitmask", type=toint,
81         help="LDLM flag bit mask to be translated")
82     args = parser.parse_args()
83     print_flags(ldlm_flags_tbl, args.bitmask)