Skip to content
Snippets Groups Projects
Commit 1b7634c6 authored by Laura Abbott's avatar Laura Abbott
Browse files

linux-ramdump-parser-v2: Check for loops in workqueues

Workqueues may be modified at runtime which can leave them in an
inconsistent state in ram dumps. Check for infinite loops in
workqueue lists caused by this state.

Change-Id: If5d8ebe48a538ffae58a8ed485cd4a50b20d60bf
parent 8bfc0cbb
No related branches found
No related tags found
No related merge requests found
......@@ -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(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment