diff --git a/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py b/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py old mode 100755 new mode 100644 index 3aa4f9fdf3a5ee771a38f90911bec80e171cc476..b3d3423206a8371f852931dc45fdd89bf25f97f8 --- a/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py +++ b/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py @@ -62,15 +62,17 @@ def ion_buffer_info(self, ramdump, ion_info): list_node_offset = ramdump.field_offset('struct dma_buf', 'list_node') size_offset = ramdump.field_offset('struct dma_buf', 'size') file_offset = ramdump.field_offset('struct dma_buf', 'file') + f_count_offset = ramdump.field_offset('struct file', 'f_count') name_offset = ramdump.field_offset('struct dma_buf', 'name') exp_name_offset = ramdump.field_offset('struct dma_buf', 'exp_name') - ion_info.write("{0:40} {1:15} {2:10} {3:10} {4:10} {5:20}\n".format( - 'File_addr', 'Name', 'Size', 'Exp', 'Heap', 'Size in KB')) + ion_info.write("{0:40} {1:4} {2:15} {3:10} {4:10} {5:10} {6:20}\n".format( + 'File_addr', 'REF', 'Name', 'Size', 'Exp', 'Heap', 'Size in KB')) dma_buf_info = [] while (head != db_list): dma_buf_addr = head - list_node_offset size = ramdump.read_word(dma_buf_addr + size_offset) file = ramdump.read_word(dma_buf_addr + file_offset) + f_count = ramdump.read_u64(file + f_count_offset) exp_name = ramdump.read_word(dma_buf_addr + exp_name_offset) exp_name = ramdump.read_cstring(exp_name, 48) ionheap_name = "" @@ -81,7 +83,8 @@ def ion_buffer_info(self, ramdump, ion_info): ionheap_name = ramdump.read_cstring(ionheap_name_addr, TASK_NAME_LENGTH) name = ramdump.read_word(dma_buf_addr + name_offset) name = ramdump.read_cstring(name, 48) - dma_buf_info.append([file, name, hex(size), exp_name, ionheap_name, bytes_to_KB(size)]) + dma_buf_info.append([file, f_count, name, hex(size), exp_name, + ionheap_name, bytes_to_KB(size)]) head = ramdump.read_word(head) next_node = ramdump.read_word(head + next_offset) if next_node == 0: @@ -92,6 +95,7 @@ def ion_buffer_info(self, ramdump, ion_info): dma_buf_addr = head - list_node_offset size = ramdump.read_word(dma_buf_addr + size_offset) file = ramdump.read_word(dma_buf_addr + file_offset) + f_count = ramdump.read_u64(file + f_count_offset) exp_name = ramdump.read_word(dma_buf_addr + exp_name_offset) exp_name = ramdump.read_cstring(exp_name, 48) ionheap_name = "" @@ -102,69 +106,58 @@ def ion_buffer_info(self, ramdump, ion_info): ionheap_name = ramdump.read_cstring(ionheap_name_addr, TASK_NAME_LENGTH) name = ramdump.read_word(dma_buf_addr + name_offset) name = ramdump.read_cstring(name, 48) - dma_buf_info.append([file, name, hex(size), exp_name, ionheap_name, bytes_to_KB(size)]) + dma_buf_info.append([file, f_count, name, hex(size), exp_name, + ionheap_name, bytes_to_KB(size)]) head = ramdump.read_word(head + prev_offset) prev_node = ramdump.read_word(head + prev_offset) if prev_node == 0: break break - dma_buf_info = sorted(dma_buf_info, key=lambda l: l[5], reverse=True) + dma_buf_info = sorted(dma_buf_info, key=lambda l: l[6], reverse=True) for item in dma_buf_info: - str = "v.v (struct file *)0x{0:x}\t {1:15} {2:10} {3:10} {4:10} ({5} KB)\n".\ - format(item[0], item[1], item[2], item[3], item[4], item[5] ) + str = "v.v (struct file *)0x{0:x}\t {1:2} {2:15} {3:10} {4:10} {" \ + "5:10} ({6} KB)\n".format(item[0], item[1], item[2], item[3], + item[4], item[5], item[6]) ion_info.write(str) -def get_bufs(task, bufs, ion_info, ramdump): +def get_bufs(self, task, bufs, ion_info, ramdump): t_size = 0 dma_buf_fops = ramdump.address_of('dma_buf_fops') if dma_buf_fops is None: ion_info.write("NOTE: 'dma_buf_fops' not found for file information\n") return 0 - timekeeper = ramdump.address_of('shadow_timekeeper') - if timekeeper is None: - ion_info.write("NOTE: 'timekeeper' not found for timing information\n") - return 0 - - files_offset = ramdump.field_offset('struct task_struct', 'files') - fdt_offset = ramdump.field_offset('struct files_struct', 'fdt') - fd_offset = ramdump.field_offset('struct fdtable', 'fd') - max_fds_offset = ramdump.field_offset('struct fdtable', 'max_fds') - f_op_offset = ramdump.field_offset('struct file', 'f_op') - private_data_offset = ramdump.field_offset('struct file', 'private_data') - size_offset = ramdump.field_offset('struct dma_buf', 'size') - name_offset = ramdump.field_offset('struct dma_buf', 'name') - stime_offset = ramdump.field_offset('struct timekeeper', 'xtime_sec') if task is None: return 0 - files = ramdump.read_pointer(task + files_offset) + files = ramdump.read_pointer(task + self.files_offset) if files is None: return 0 - fdt = ramdump.read_pointer(files + fdt_offset) + fdt = ramdump.read_pointer(files + self.fdt_offset) if fdt is None: return 0 - fd = ramdump.read_pointer(fdt + fd_offset) - max_fds = ramdump.read_halfword(fdt + max_fds_offset) - stime = ramdump.read_word(timekeeper + stime_offset) - ctime_offset = ramdump.field_offset('struct dma_buf', 'ctime') + fd = ramdump.read_pointer(fdt + self.fd_offset) + max_fds = ramdump.read_halfword(fdt + self.max_fds_offset) + stime = ramdump.read_word(self.timekeeper + self.stime_offset) + ctime_offset = ramdump.field_offset('struct dma_buf', 'ktime') if ctime_offset is not None: ctime_offset += ramdump.field_offset('struct timespec', 'tv_sec') for i in range(max_fds): file = ramdump.read_pointer(fd + i*8) if (file == 0): continue - f_op = ramdump.read_pointer(file + f_op_offset) + f_op = ramdump.read_pointer(file + self.f_op_offset) if (f_op != dma_buf_fops): continue - dmabuf = ramdump.read_pointer(file + private_data_offset) - size = ramdump.read_word(dmabuf + size_offset) + dmabuf = ramdump.read_pointer(file + self.private_data_offset) + size = ramdump.read_word(dmabuf + self.size_offset) time = 0 if ctime_offset is not None: ctime = ramdump.read_word(dmabuf + ctime_offset) + ctime = ctime / 1000000000 time = stime - ctime - name = ramdump.read_word(dmabuf + name_offset) + name = ramdump.read_word(dmabuf + self.name_offset) name = ramdump.read_cstring(name, 48) item = [name, hex(size), bytes_to_KB(size), time] @@ -175,10 +168,10 @@ def get_bufs(task, bufs, ion_info, ramdump): return t_size -def get_proc_bufs(task, bufs, ion_info, ramdump): - size = 0; +def get_proc_bufs(self, task, bufs, ion_info, ramdump): + size = 0 for curr in ramdump.for_each_thread(task): - size += get_bufs(curr, bufs, ion_info, ramdump) + size += get_bufs(self, curr, bufs, ion_info, ramdump) return size @@ -190,7 +183,7 @@ def ion_proc_info(self, ramdump, ion_info): dma_procs = [] for task in ramdump.for_each_process(): bufs = [] - size = get_proc_bufs(task, bufs, ion_info, ramdump) + size = get_proc_bufs(self, task, bufs, ion_info, ramdump) if (size == 0): continue comm = ramdump.read_cstring(task + comm_offset) @@ -525,6 +518,24 @@ def find_rb_root(self, ramdump, ion_dev_rb_root, ion_info): @register_parser('--print-ionbuffer', 'Print ion buffer', optional=True) class DumpIonBuffer(RamParser): + def __init__(self, *args): + super(DumpIonBuffer, self).__init__(*args) + self.timekeeper = self.ramdump.address_of('shadow_timekeeper') + self.files_offset = self.ramdump.field_offset( + 'struct task_struct', 'files') + self.fdt_offset = self.ramdump.field_offset( + 'struct files_struct', 'fdt') + self.fd_offset = self.ramdump.field_offset('struct fdtable', 'fd') + self.max_fds_offset = self.ramdump.field_offset( + 'struct fdtable', 'max_fds') + self.f_op_offset = self.ramdump.field_offset('struct file', 'f_op') + self.private_data_offset = self.ramdump.field_offset('struct file', + 'private_data') + self.size_offset = self.ramdump.field_offset('struct dma_buf', 'size') + self.name_offset = self.ramdump.field_offset('struct dma_buf', 'name') + self.stime_offset = self.ramdump.field_offset('struct timekeeper', + 'ktime_sec') + def parse(self): with self.ramdump.open_file('ionbuffer.txt') as ion_info: if (self.ramdump.kernel_version < (3, 18, 0)): diff --git a/linux-ramdump-parser-v2/parsers/slabsummary.py b/linux-ramdump-parser-v2/parsers/slabsummary.py index 248d30e893c16e5808e08f1605066ec56ab2a8d0..6a855d088909f844a57bd13817f412ca4f469837 100644 --- a/linux-ramdump-parser-v2/parsers/slabsummary.py +++ b/linux-ramdump-parser-v2/parsers/slabsummary.py @@ -138,7 +138,7 @@ class Slabinfo_summary(RamParser): num_slabs, slab_size] nCounter += 1 sorted_summary = sorted(slab_summary.values(), - key=operator.itemgetter(4), reverse=True) + key=operator.itemgetter(5), reverse=True) for val in sorted_summary: slab_out.write(format_string.format( val[0], val[1], val[2], val[3], val[4],