diff --git a/linux-ramdump-parser-v2/parsers/workqueue.py b/linux-ramdump-parser-v2/parsers/workqueue.py index 4986299c444c8221b6028f98158263463098db68..183cb03d8747cd81ffae305c313fd988e8bd5ac8 100644 --- a/linux-ramdump-parser-v2/parsers/workqueue.py +++ b/linux-ramdump-parser-v2/parsers/workqueue.py @@ -269,6 +269,7 @@ class Workqueues(RamParser): break worker_pool = workqueue_i + pools_offset + seen = [] # Need better way to ge the number of pools... for k in range(0, 2): worker_pool_i = worker_pool + k * worker_pool_size @@ -279,9 +280,11 @@ class Workqueues(RamParser): worker_addr = next_entry - worker_entry_offset worker_task_addr = ram_dump.read_word( next_entry - worker_entry_offset + worker_task_offset) - if worker_task_addr is None or worker_task_addr == 0: + if worker_task_addr is None or worker_task_addr == 0 or worker_task_addr in seen: break + seen.append(worker_task_addr) + taskname = ram_dump.read_cstring( (worker_task_addr + offset_comm), 16) scheduled_addr = ram_dump.read_word( @@ -420,13 +423,16 @@ class Workqueues(RamParser): idle_list_addr = worker_pool_i + pool_idle_offset next_entry = ram_dump.read_word(idle_list_addr) + seen = [] while True: worker_addr = next_entry - worker_entry_offset worker_task_addr = ram_dump.read_word( next_entry - worker_entry_offset + worker_task_offset) - if worker_task_addr is None or worker_task_addr == 0: + if worker_task_addr is None or worker_task_addr == 0 or worker_task_addr in seen: break + seen.append(worker_task_addr) + taskname = ram_dump.read_cstring( (worker_task_addr + offset_comm), 16) scheduled_addr = ram_dump.read_word(