3 Copyright 2015-2019 Cray Inc. All Rights Reserved
4 Utility to dump the Lustre dk logs.
5 Based on dump_cfs_trace_data.py
11 from time import localtime
12 from operator import itemgetter
13 from pykdump.API import getSizeOf, readSU, readmem, readSUListFromHead, readSymbol, sys_info
14 from crashlib import page, addrlib
17 description_short = 'Dump and sort the Lustre dk logs.'
19 def do_shell_cmd(cmd):
21 #return os.popen(cmd).read()
23 # ---------------------------------------------------------------------------
24 # pfn: 2582e8c, physaddr: 2582e8c000, vaddr: ffff002582e8c000
25 def dump_dk_line(tmpfd, options, pfn, used):
26 """Dump the cfs debug messages in the dk format."""
27 physaddr = addrlib.pfn2phys(pfn)
28 vaddr = addrlib.ptov(physaddr)
29 hdr_size = getSizeOf("struct ptldebug_header")
32 hdr = readSU('struct ptldebug_header', vaddr)
33 laddr = vaddr + hdr_size
35 line = readmem(laddr, hdr.ph_len - hdr_size)
37 print("Skipping pfn: %x, physaddr: %x, vaddr: %x, laddr: %x" % \
38 (pfn, physaddr, vaddr, laddr))
41 (filename,function,text) = line.decode().split('\0')
48 prefix = "%08x:%08x:%u.%u%s:%u.%u" % \
49 (hdr.ph_subsys, hdr.ph_mask, hdr.ph_cpu_id, hdr.ph_type,
50 "F" if (hdr.ph_flags & 1) else "", hdr.ph_sec, hdr.ph_usec)
52 buf = "%s:%06u:%u:%u:(%s:%d:%s()) %s" % \
53 (prefix, hdr.ph_stack, hdr.ph_pid, hdr.ph_extern_pid, filename,
54 hdr.ph_line_num, function, text)
56 tmpfd.write(buf + '\n')
58 # ---------------------------------------------------------------------------
59 def walk_pages(tmpfd, options, cfs_page_head, trace_page_struct):
61 cfs_pages = readSUListFromHead(cfs_page_head, 'linkage',
63 maxel=100000, inchead=False)
66 dump_dk_line(tmpfd, options, page.pfn(p.page), p.used)
68 # ---------------------------------------------------------------------------
69 def walk_array(options):
70 """Walk the cfs_trace_data array of array pointers."""
72 #fname = do_shell_cmd('mktemp .dklogXXXX').rstrip()
73 tmpfd = open("/tmp/log.bin", 'w')
76 cfs_trace_data = readSymbol('cfs_trace_data')
77 trace_page_struct = 'struct cfs_trace_page'
80 cfs_trace_data = readSymbol('trace_data')
81 trace_page_struct = 'struct trace_page'
83 print("Ensure you have loaded the Lustre modules")
86 for cfstd_array in cfs_trace_data:
87 if not cfstd_array: continue
89 for i in range(sys_info.CPUS):
91 walk_pages(tmpfd, options, u.tcd.tcd_pages, trace_page_struct)
92 walk_pages(tmpfd, options, u.tcd.tcd_stock_pages, trace_page_struct)
95 print(do_shell_cmd('sort -n -s -t: -k4,4 ' + fname))
96 print(do_shell_cmd('rm ' + fname))
98 # ---------------------------------------------------------------------------
100 parser = argparse.ArgumentParser(
101 description= "Dump and sort the Lustre dk logs.",
102 epilog= "NOTE: the Lustre kernel modules must be loaded.")
103 args = parser.parse_args()
104 return walk_array(args)
106 if __name__ == '__main__':