Skip to content

Commit c509f8c

Browse files
committed
DLPX-87579 sdb: use drgn helper for task states
= Problem Currently having our own custom function for figuring out a task's state has two drawbacks: 1] As we saw in a2bdd57 things can get out of date and it is up to us to fix them. 2] There are some weird edge cases that we don't handle as well like the following crash that I have never been able to reproduce locally but it occasionally reproduces in the Github runners of PR #337: ``` Traceback (most recent call last): File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/internal/repl.py", line 107, in eval_cmd for obj in invoke([], input_): File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/pipeline.py", line 152, in invoke yield from execute_pipeline(first_input, pipeline) File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/pipeline.py", line 84, in execute_pipeline yield from massage_input_and_call(pipeline[-1], this_input) File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/pipeline.py", line 67, in massage_input_and_call yield from cmd.call(objs) File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/command.py", line 413, in call yield from self.__invalid_memory_objects_check( File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/command.py", line 358, in __invalid_memory_objects_check for obj in objs: File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/command.py", line 625, in _call self.pretty_print(self.caller(objs)) File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/commands/linux/stacks.py", line 407, in pretty_print self.print_stacks(filter(self.match_stack, objs)) File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/commands/linux/stacks.py", line 382, in print_stacks for stack_key, tasks in KernelStacks.aggregate_stacks(objs): File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/commands/linux/stacks.py", line 375, in aggregate_stacks stack_key = (KernelStacks.task_struct_get_state(task), File "/usr/local/lib/python3.8/dist-packages/sdb-0.1.0-py3.8.egg/sdb/commands/linux/stacks.py", line 221, in task_struct_get_state return KernelStacks.TASK_STATES[(state | exit_state) & 0x7f] KeyError: 101 ``` = This Patch Uses the drgn helper whose implementation handles more edge cases and is more probable to stay up to date with the latest kernels while keeping backwards compatibility. = Testing The above stack trace that I was able to reproduce consistently in that PR no longer shows up with this patch.
1 parent 3a1fadc commit c509f8c

File tree

2 files changed

+16
-18
lines changed

2 files changed

+16
-18
lines changed

sdb/commands/linux/stacks.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import drgn
2424
from drgn.helpers.linux.list import list_for_each_entry
2525
from drgn.helpers.linux.pid import for_each_task
26+
from drgn.helpers.linux.sched import task_state_to_char
2627

2728
import sdb
2829

@@ -203,22 +204,13 @@ def _init_parser(cls, name: str) -> argparse.ArgumentParser:
203204
"t": 0x08,
204205
"X": 0x10,
205206
"Z": 0x20,
207+
"P": 0x40,
208+
"I": 0x402,
206209
}
207210

208211
@staticmethod
209212
def task_struct_get_state(task: drgn.Object) -> str:
210-
task_struct_type = task.type_.type
211-
state = 0
212-
if task_struct_type.has_member('__state'):
213-
state = task.member_('__state').value_()
214-
else:
215-
# For kernels older than v5.14
216-
state = task.state.value_()
217-
if state == 0x402:
218-
return "IDLE"
219-
220-
exit_state = task.exit_state.value_()
221-
return KernelStacks.TASK_STATES[(state | exit_state) & 0x7f]
213+
return KernelStacks.resolve_state(task_state_to_char(task))
222214

223215
@staticmethod
224216
def resolve_state(tstate: str) -> str:

sdb/commands/linux/threads.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,18 @@ class KernelThreads(sdb.Locator, sdb.PrettyPrinter):
7878
load_on = [sdb.Kernel()]
7979

8080
FIELDS: Dict[str, Callable[[drgn.Object], Union[str, int]]] = {
81-
"task": lambda obj: hex(obj.value_()),
82-
"state": lambda obj: str(KernelStacks.task_struct_get_state(obj)),
83-
"pid": lambda obj: int(obj.pid),
84-
"prio": lambda obj: int(obj.prio),
85-
"comm": lambda obj: str(obj.comm.string_().decode("utf-8")),
86-
"cmdline": _cmdline,
81+
"task":
82+
lambda obj: hex(obj.value_()),
83+
"state":
84+
lambda obj: str(KernelStacks.task_struct_get_state(obj)),
85+
"pid":
86+
lambda obj: int(obj.pid),
87+
"prio":
88+
lambda obj: int(obj.prio),
89+
"comm":
90+
lambda obj: str(obj.comm.string_().decode("utf-8")),
91+
"cmdline":
92+
_cmdline,
8793
}
8894

8995
def pretty_print(self, objs: Iterable[drgn.Object]) -> None:

0 commit comments

Comments
 (0)