--- zzzz-none-000/linux-4.9.279/mm/util.c 2021-08-08 06:38:54.000000000 +0000 +++ puma7-atom-6591-750/linux-4.9.279/mm/util.c 2023-02-08 11:43:43.000000000 +0000 @@ -675,3 +675,62 @@ out: return res; } + +static void show_task_cmdline(struct task_struct *task) +{ + char comm[TASK_COMM_LEN]; + char cmdline[0x7f]; + char *arg; + int argsiz; + + get_task_comm(comm, task); + argsiz = get_cmdline(task, cmdline, sizeof(cmdline)); + if (argsiz < 0) { + pr_err("Error reading cmdline of task %d: %d\n", + task_pid_nr(task), argsiz); + return; + } + + /* Strip a terminating NUL, if present */ + if (argsiz && argsiz < sizeof(cmdline) && cmdline[argsiz] == '\0') + --argsiz; + + /* Replace embedded NUL chars */ + arg = cmdline; + while ((arg = memchr(arg, '\0', cmdline + argsiz - arg))) + *arg = ' '; + + pr_notice(" comm=%s[%d], cmdline: %.*s\n", + comm, task_pid_nr(task), argsiz, cmdline); +} + +static struct task_struct *get_task_parent(struct task_struct *task) +{ + struct task_struct *parent; + + rcu_read_lock(); + parent = rcu_dereference(task->real_parent); + if (parent) + get_task_struct(parent); + rcu_read_unlock(); + + return parent; +} + +void show_parent_tasks_cmdlines(struct task_struct *task) +{ + pr_notice("Parent process chain of PID %d:\n", task_pid_nr(task)); + + get_task_struct(task); + while (task && !is_global_init(task)) { + struct task_struct *parent; + + show_task_cmdline(task); + + parent = get_task_parent(task); + put_task_struct(task); + task = parent; + } + if (task) + put_task_struct(task); +}