Since commit 8e1f385104ac ("kill task_struct->thread_group") remove the thread_group, we will encounter below issue.
(gdb) lx-ps TASK PID COMM 0xffff800086503340 0 swapper/0 Python Exception <class 'gdb.error'>: There is no member named thread_group. Error occurred in Python: There is no member named thread_group.
We use signal->thread_head to iterate all threads instead.
Fixes: 8e1f385104ac ("kill task_struct->thread_group") Cc: stable@vger.kernel.org Signed-off-by: Kuan-Ying Lee Kuan-Ying.Lee@mediatek.com --- scripts/gdb/linux/tasks.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/scripts/gdb/linux/tasks.py b/scripts/gdb/linux/tasks.py index 17ec19e9b5bf..7c32f4c8284b 100644 --- a/scripts/gdb/linux/tasks.py +++ b/scripts/gdb/linux/tasks.py @@ -13,7 +13,7 @@
import gdb
-from linux import utils +from linux import utils, lists
task_type = utils.CachedType("struct task_struct") @@ -25,13 +25,9 @@ def task_lists(): t = g = init_task
while True: - while True: - yield t - - t = utils.container_of(t['thread_group']['next'], - task_ptr_type, "thread_group") - if t == g: - break + thread_head = t['signal']['thread_head'] + for thread in lists.list_for_each_entry(thread_head, task_ptr_type, 'thread_node'): + yield thread
t = g = utils.container_of(g['tasks']['next'], task_ptr_type, "tasks")
On 11/27, Kuan-Ying Lee wrote:
@@ -25,13 +25,9 @@ def task_lists(): t = g = init_task while True:
while True:
yield t
t = utils.container_of(t['thread_group']['next'],
task_ptr_type, "thread_group")
if t == g:
break
thread_head = t['signal']['thread_head']
for thread in lists.list_for_each_entry(thread_head, task_ptr_type, 'thread_node'):
yield thread
t = g = utils.container_of(g['tasks']['next'], task_ptr_type, "tasks")
Thanks!
I do not know python, but it seems that with this patch we can kill g or t? Can't
def task_lists(): task_ptr_type = task_type.get_type().pointer() init_task = gdb.parse_and_eval("init_task").address t = init_task
while True: thread_head = t['signal']['thread_head'] for thread in lists.list_for_each_entry(thread_head, task_ptr_type, 'thread_node'): yield thread
t = utils.container_of(t['tasks']['next'], task_ptr_type, "tasks") if t == init_task: return
work?
Oleg.
On Mon, 2023-11-27 at 13:03 +0100, Oleg Nesterov wrote:
External email : Please do not click links or open attachments until you have verified the sender or the content. On 11/27, Kuan-Ying Lee wrote:
@@ -25,13 +25,9 @@ def task_lists(): t = g = init_task while True:
while True:
yield t
t = utils.container_of(t['thread_group']['next'],
task_ptr_type, "thread_group")
if t == g:
break
thread_head = t['signal']['thread_head']
for thread in lists.list_for_each_entry(thread_head,
task_ptr_type, 'thread_node'):
yield thread
t = g = utils.container_of(g['tasks']['next'], task_ptr_type, "tasks")
Thanks!
I do not know python, but it seems that with this patch we can kill g or t? Can't
def task_lists(): task_ptr_type = task_type.get_type().pointer() init_task = gdb.parse_and_eval("init_task").address t = init_task
while True:
thread_head = t['signal']['thread_head'] for thread in lists.list_for_each_entry(thread_head, task_ptr_type, 'thread_node'): yield thread
t = utils.container_of(t['tasks']['next'], task_ptr_type, "tasks") if t == init_task: return
work?
Yes, you are right. I will fix it in v2.
Thanks, Kuan-Ying Lee
Oleg.
linux-stable-mirror@lists.linaro.org