Viewing: ldlm_lockflags.py

#!/usr/bin/env python

"""
Utility to print LDLM lock flags as strings
Copyright (c) 2019 Cray Inc. All Rights Reserved.
"""
from pykdump.API import *
from crashlib.input import toint
import argparse

description_short  = "Prints string identifiers for specified LDLM flags."
LDLM_FL_ALL_FLAGS_MASK = 0x00FFFFFFC28F932F

ldlm_flags_tbl = {
    0x0000000000000001:  "LOCK_CHANGED",            # bit  0
    0x0000000000000002:  "BLOCK_GRANTED",           # bit  1
    0x0000000000000004:  "BLOCK_CONV",              # bit  2
    0x0000000000000008:  "BLOCK_WAIT",              # bit  3
    0x0000000000000010:  "SPECULATIVE",             # bit  4
    0x0000000000000020:  "AST_SENT",                # bit  5
    0x0000000000000100:  "REPLAY",                  # bit  8
    0x0000000000000200:  "INTENT_ONLY",             # bit  9
    0x0000000000001000:  "HAS_INTENT",              # bit 12
    0x0000000000008000:  "FLOCK_DEADLOCK",          # bit 15
    0x0000000000010000:  "DISCARD_DATA",            # bit 16
    0x0000000000020000:  "NO_TIMEOUT",              # bit 17
    0x0000000000040000:  "BLOCK_NOWAIT",            # bit 18
    0x0000000000080000:  "TEST_LOCK",               # bit 19
    0x0000000000100000:  "MATCH_LOCK",              # bit 20
    0x0000000000800000:  "CANCEL_ON_BLOCK",         # bit 23
    0x0000000001000000:  "COS_INCOMPAT",            # bit 24
    0x0000000002000000:  "CONVERTING",              # bit 25
    0x0000000010000000:  "LOCKAHEAD_OLD_RESERVED",  # bit 28
    0x0000000020000000:  "NO_EXPANSION",            # bit 29
    0x0000000040000000:  "DENY_ON_CONTENTION",      # bit 30
    0x0000000080000000:  "AST_DISCARD_DATA",        # bit 31
    0x0000000100000000:  "FAIL_LOC",                # bit 32
    0x0000000400000000:  "CBPENDING",               # bit 34
    0x0000000800000000:  "WAIT_NOREPROC",           # bit 35
    0x0000001000000000:  "CANCEL",                  # bit 36
    0x0000002000000000:  "LOCAL_ONLY",              # bit 37
    0x0000004000000000:  "FAILED",                  # bit 38
    0x0000008000000000:  "CANCELING",               # bit 39
    0x0000010000000000:  "LOCAL",                   # bit 40
    0x0000020000000000:  "LVB_READY",               # bit 41
    0x0000040000000000:  "KMS_IGNORE",              # bit 42
    0x0000080000000000:  "CP_REQD",                 # bit 43
    0x0000100000000000:  "CLEANED",                 # bit 44
    0x0000200000000000:  "ATOMIC_CB",               # bit 45
    0x0000400000000000:  "BL_AST",                  # bit 46
    0x0000800000000000:  "BL_DONE",                 # bit 47
    0x0001000000000000:  "NO_LRU",                  # bit 48
    0x0002000000000000:  "FAIL_NOTIFIED",           # bit 49
    0x0004000000000000:  "DESTROYED",               # bit 50
    0x0010000000000000:  "RES_LOCKED",              # bit 52
    0x0020000000000000:  "WAITED",                  # bit 53
    0x0040000000000000:  "NS_SRV",                  # bit 54
    0x0080000000000000:  "EXCL",                    # bit 55
    0x0100000000000000:  "RESENT",                  # bit 56
    0x0200000000000000:  "COS_ENABLED",             # bit 57
    0x0400000000000000:  "NDELAY"                   # bit 58
}

def print_flags(flag_dict, mask):

    flags = ""
    tmp = mask
    for key, value in flag_dict.iteritems():
            if key & mask:
                flags = flags + value + " "
                tmp &= ~key
    print("mask: 0x%x = %s" % (mask, flags))
    if tmp != 0:
        print("unknown bits set in mask: 0x%x" % tmp)

if __name__ == "__main__":
    description = "Prints string identifiers for specified LDLM flags."
    parser = argparse.ArgumentParser(description=description)
    parser.add_argument("bitmask", type=toint,
        help="LDLM flag bit mask to be translated")
    args = parser.parse_args()
    print_flags(ldlm_flags_tbl, args.bitmask)