diff --git a/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py b/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py index e718a0f7478cdde0d516872b3f9007dfcd8461c1..de8a2e896d928769f140fd3b7487979f3488caee 100644 --- a/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py +++ b/linux-ramdump-parser-v2/parsers/ion_buffer_parse.py @@ -164,41 +164,19 @@ def get_bufs(task, bufs, ion_info, ramdump): def get_proc_bufs(task, bufs, ion_info, ramdump): - group_offset = ramdump.field_offset('struct task_struct', 'thread_group') - group_node = ramdump.read_word(task + group_offset) - offset_signal = ramdump.field_offset('struct task_struct', 'signal') size = 0; - curr = None - while curr != task: - group_node = ramdump.read_pointer(group_node) - curr = group_node - group_offset - signal_struct = ramdump.read_word(curr + offset_signal) - if signal_struct == 0 or signal_struct is None: - break + for curr in ramdump.for_each_thread(task): size += get_bufs(curr, bufs, ion_info, ramdump) return size def ion_proc_info(self, ramdump, ion_info): ion_info = ramdump.open_file('ionproc.txt') - init_task = ramdump.address_of('init_task') - if init_task is None: - ion_info.write("NOTE: 'init_task' not found for process information") - return ion_info.write("*****Parsing dma proc info for ion leak debugging*****\n") - node_offset = ramdump.field_offset('struct task_struct', 'tasks') - offset_signal = ramdump.field_offset('struct task_struct', 'signal') - list_node = ramdump.read_word(init_task + node_offset) - task = None pid_offset = ramdump.field_offset('struct task_struct', 'tgid') comm_offset = ramdump.field_offset('struct task_struct', 'comm') dma_procs = [] - while (task != init_task): - list_node = ramdump.read_pointer(list_node) - task = list_node - node_offset - signal_struct = ramdump.read_word(task + offset_signal) - if signal_struct == 0 or signal_struct is None: - break + for task in ramdump.for_each_process(): bufs = [] size = get_proc_bufs(task, bufs, ion_info, ramdump) if (size == 0): diff --git a/linux-ramdump-parser-v2/parsers/memusage.py b/linux-ramdump-parser-v2/parsers/memusage.py index 002c037d36ae8a13ac2f52e40fe9bb075a9b2129..432b814e95cc811615227ea9e6d5373dc77b5f16 100644 --- a/linux-ramdump-parser-v2/parsers/memusage.py +++ b/linux-ramdump-parser-v2/parsers/memusage.py @@ -34,22 +34,11 @@ def do_dump_process_memory(ramdump): total_slab = slab_rec + slab_unrec total_mem = ramdump.read_word('totalram_pages') * 4 - offset_tasks = ramdump.field_offset('struct task_struct', 'tasks') offset_comm = ramdump.field_offset('struct task_struct', 'comm') offset_signal = ramdump.field_offset('struct task_struct', 'signal') - prev_offset = ramdump.field_offset('struct list_head','prev') offset_adj = ramdump.field_offset('struct signal_struct', 'oom_score_adj') - offset_thread_group = ramdump.field_offset( - 'struct task_struct', 'thread_group') offset_pid = ramdump.field_offset('struct task_struct', 'pid') - init_addr = ramdump.address_of('init_task') - init_next_task = init_addr + offset_tasks - orig_init_next_task = init_next_task - init_thread_group = init_addr + offset_thread_group - seen_tasks = set() task_info = [] - offset_thread_group = ramdump.field_offset( - 'struct task_struct', 'thread_group') memory_file = ramdump.open_file('memory.txt') memory_file.write('Total RAM: {0:,}kB\n'.format(total_mem)) memory_file.write('Total free memory: {0:,}kB({1:.1f}%)\n'.format( @@ -62,78 +51,21 @@ def do_dump_process_memory(ramdump): total_slab * 4, (100.0 * total_slab * 4) / total_mem)) memory_file.write('Total SHMEM: {0:,}kB({1:.1f}%)\n\n'.format( total_shmem * 4, (100.0 * total_shmem * 4) / total_mem)) - while True: - task_struct = init_thread_group - offset_thread_group - next_thread_comm = task_struct + offset_comm + + for task in ramdump.for_each_process(): + next_thread_comm = task + offset_comm thread_task_name = cleanupString( ramdump.read_cstring(next_thread_comm, 16)) - next_thread_pid = task_struct + offset_pid + next_thread_pid = task + offset_pid thread_task_pid = ramdump.read_int(next_thread_pid) - signal_struct = ramdump.read_word(task_struct + offset_signal) - - next_task = ramdump.read_word(init_next_task) - if next_task is None: - init_next_task = init_addr + offset_tasks - init_next_task = init_next_task + prev_offset - init_next_task = ramdump.read_word(init_next_task) - init_thread_group = init_next_task - offset_tasks \ - + offset_thread_group - while True: - init_next_task = init_next_task + prev_offset - orig_init_next_task = init_next_task - task_struct = init_thread_group - offset_thread_group - next_thread_comm = task_struct + offset_comm - thread_task_name = cleanupString( - ramdump.read_cstring(next_thread_comm, 16)) - next_thread_pid = task_struct + offset_pid - thread_task_pid = ramdump.read_int(next_thread_pid) - signal_struct = ramdump.read_word(task_struct + offset_signal) - next_task = ramdump.read_word(init_next_task) - if next_task is None: - break - if (next_task == init_next_task and - next_task != orig_init_next_task): - break - if next_task in seen_tasks: - break - seen_tasks.add(next_task) - init_next_task = next_task - init_thread_group = init_next_task - offset_tasks\ - + offset_thread_group - if init_next_task == orig_init_next_task: - break - - if signal_struct == 0 or signal_struct is None: - continue - adj = ramdump.read_u16(signal_struct + offset_adj) - if adj & 0x8000: - adj = adj - 0x10000 - rss, swap = get_rss(ramdump, task_struct) - if rss != 0: - task_info.append([thread_task_name, thread_task_pid, rss, - swap, rss + swap, adj]) - break - - if (next_task == init_next_task and - next_task != orig_init_next_task): - break - - if next_task in seen_tasks: - break - - seen_tasks.add(next_task) - init_next_task = next_task - init_thread_group = init_next_task - offset_tasks + offset_thread_group - if init_next_task == orig_init_next_task: - break - + signal_struct = ramdump.read_word(task + offset_signal) if signal_struct == 0 or signal_struct is None: continue adj = ramdump.read_u16(signal_struct + offset_adj) if adj & 0x8000: adj = adj - 0x10000 - rss, swap = get_rss(ramdump, task_struct) + rss, swap = get_rss(ramdump, task) if rss != 0: task_info.append([thread_task_name, thread_task_pid, rss, swap, rss + swap, adj])