On Tue, Mar 15, 2022 at 7:17 PM Austin Kim <[email protected]> wrote:
> Hello, Lijiang > > 2022년 3월 15일 (화) 오후 2:29, lijiang <[email protected]>님이 작성: > > > > On Tue, Mar 15, 2022 at 1:08 PM lijiang <[email protected]> wrote: > >> > >> On Thu, Mar 3, 2022 at 10:43 AM <[email protected]> > wrote: > >>> > >>> Date: Wed, 2 Mar 2022 21:37:45 +0000 > >>> From: Austin Kim <[email protected]> > >>> To: [email protected], [email protected], [email protected] > >>> Cc: [email protected], [email protected] > >>> Subject: [Crash-utility] [PATCH v3] ps: Add support to "ps -l|-m" to > >>> properly display process > >>> Message-ID: <20220302213745.GA868@raspberrypi> > >>> Content-Type: text/plain; charset=us-ascii > >>> > >>> Sometimes kernel image is generated without CONFIG_SCHEDSTATS or > CONFIG_SCHED_INFO. > >>> Where relevant commit id is f6db83479932 ("sched/stat: Simplify the > sched_info accounting") > >>> > >>> - CONFIG_SCHED_INFO: KERNEL_VERSION >= LINUX(4,2,0) > >>> - CONFIG_SCHEDSTATS: KERNEL_VERSION < LINUX(4,2,0) > >>> > >>> Running crash-utility with above kernel image, > >>> "ps -l" option cannot display all processes sorted with most > recently-run process. > >>> Also "ps -m" option cannot display all processes with timestamp. > >>> > >>> crash> ps -l or crash> ps -m > >>> ps: last-run timestamps do not exist in this kernel > >>> Usage: ps [-k|-u|-G] [-s] > >>> [-p|-c|-t|-[l|m][-C cpu]|-a|-g|-r|-S] > >>> [pid | task | command] ... > >>> Enter "help ps" for details. > >>> > >>> This is because output of "ps -l|-m" depends on > task_struct.sched_info.last_arrival. > >>> > >>> Without CONFIG_SCHEDSTATS or CONFIG_SCHED_INFO, 'sched_info' field is > not included > >>> in task_struct. In this case we make "ps -l|-m" option to access > 'exec_start' > >>> field of sched_entity where 'exec_start' is task_struct.se.exec_start. > >>> > >>> The 'task_struct.se.exec_start' contains the most recently-executed > timestamp > >>> when process is running in the below cases; > >>> > >>> - enqueued to runqueue > >>> - dequeued from runqueue > >>> - scheduler tick is invoked > >>> - etc > >>> > >>> 'task_struct.se.exec_start' could be one of statistics which indicates > the most > >>> recently-run timestamp of process activity. > >> > >> > >> Thank you for the update, Austin. > >> > >> If the task is migraged, > > > > ^^^^^^^^ > > > > Sorry, it's a typo, replace it with the "migrated". Thanks. > > > >> > >> the value of the 'task_struct.se.exec_start ' will be set to zero and > may be updated in the next scheduling with the new time. In this case, does > the patch still work well as expected? > > Thanks for feedback. Theoretically you are right. > > https://elixir.bootlin.com/linux/v5.15.28/source/kernel/sched/fair.c > static void migrate_task_rq_fair(struct task_struct *p, int new_cpu) > { > .. > /* We have migrated, no longer consider this task hot */ > p->se.exec_start = 0; > > update_scan_period(p, new_cpu); > } > > If we set break point at 'update_scan_period(p, new_cpu)' and then > system stops at this point using debugger like GDB, > we can have misleading information as you said. > > Without this condition, it is unlikely to see p->se.exec_start is 0 > since 'p->se.exec_start' is quite updated very often(ex: scheduler > tick, etc) on real target device. > Thank you for the explanation, Austin. In multi-core systems, the task migration may occur frequently due to the load balancing, which is more common than breakpoints. Unless the task is bound to the cpu or running on a single cpu system. The sched entity is associated with a specific cpu(cpu rq), that is to say, the "-C" option is used implicitly in this patch. I would suggest pointing out this behavior in the help or outputting a warning explicitly for users. That is my concern. Thanks. Lianbo > As below link indicated, Kazu already mentioned that there are no > useful way to display all processes > with recently-run order using se.exec_start from crash-utility point > of view. Also I agreed the feedback. > > https://listman.redhat.com/archives/crash-utility/2022-March/009615.html > > Anyway thanks for feedback over patch in details. Hope to discuss > another patch I will propose. > > BR, > Austin Kim > > >> > >> Thanks. > >> Lianbo > >> > >>> With this patch, "ps -l|-m" option works well without > CONFIG_SCHEDSTATS or > >>> CONFIG_SCHED_INFO. > >>> > >>> Signed-off-by: Austin Kim <[email protected]> > >>> --- > >>> defs.h | 1 + > >>> help.c | 5 +++-- > >>> symbols.c | 2 ++ > >>> task.c | 20 ++++++++++++++++---- > >>> 4 files changed, 22 insertions(+), 6 deletions(-) > >>> > >>> diff --git a/defs.h b/defs.h > >>> index bf2c59b..841bd0b 100644 > >>> --- a/defs.h > >>> +++ b/defs.h > >>> @@ -2168,6 +2168,7 @@ struct offset_table { /* > stash of commonly-used offsets */ > >>> long sbitmap_queue_min_shallow_depth; > >>> long sbq_wait_state_wait_cnt; > >>> long sbq_wait_state_wait; > >>> + long sched_entity_exec_start; > >>> }; > >>> > >>> struct size_table { /* stash of commonly-used sizes */ > >>> diff --git a/help.c b/help.c > >>> index 8347668..6ca7c92 100644 > >>> --- a/help.c > >>> +++ b/help.c > >>> @@ -1442,7 +1442,8 @@ char *help_ps[] = { > >>> " and system times.", > >>> " -l display the task's last-run timestamp value, using either > the", > >>> " task_struct's last_run value, the task_struct's timestamp > value", > >>> -" or the task_struct's sched_entity last_arrival value, > whichever", > >>> +" the task_struct's sched_info last_arrival value", > >>> +" or the task_struct's sched_entity exec_start value, > whichever", > >>> " applies, of selected, or all, tasks; the list is sorted > with the", > >>> " most recently-run task (with the largest timestamp) shown > first,", > >>> " followed by the task's current state.", > >>> @@ -1621,7 +1622,7 @@ char *help_ps[] = { > >>> " > 9497 1 0 ffff880549ec2ab0 RU 0.0 42314692 138664 > oracle", > >>> " ", > >>> " Show all tasks sorted by their task_struct's last_run, timestamp, > or", > >>> -" sched_entity last_arrival timestamp value, whichever applies:\n", > >>> +" sched_info last_arrival or sched_entity exec_start timestamp > value, whichever applies:\n", > >>> " %s> ps -l", > >>> " [20811245123] [IN] PID: 37 TASK: f7153030 CPU: 2 COMMAND: > \"events/2\"", > >>> " [20811229959] [IN] PID: 1756 TASK: f2a5a570 CPU: 2 COMMAND: > \"ntpd\"", > >>> diff --git a/symbols.c b/symbols.c > >>> index ba5e274..1c40586 100644 > >>> --- a/symbols.c > >>> +++ b/symbols.c > >>> @@ -10290,6 +10290,8 @@ dump_offset_table(char *spec, ulong makestruct) > >>> OFFSET(sched_entity_my_q)); > >>> fprintf(fp, " sched_entity_on_rq: %ld\n", > >>> OFFSET(sched_entity_on_rq)); > >>> + fprintf(fp, " sched_entity_exec_start: %ld\n", > >>> + OFFSET(sched_entity_exec_start)); > >>> fprintf(fp, " cfs_rq_nr_running: %ld\n", > >>> OFFSET(cfs_rq_nr_running)); > >>> fprintf(fp, " cfs_rq_rb_leftmost: %ld\n", > >>> diff --git a/task.c b/task.c > >>> index 864c838..2c12196 100644 > >>> --- a/task.c > >>> +++ b/task.c > >>> @@ -334,9 +334,15 @@ task_init(void) > >>> if (VALID_MEMBER(task_struct_sched_info)) > >>> MEMBER_OFFSET_INIT(sched_info_last_arrival, > >>> "sched_info", "last_arrival"); > >>> + MEMBER_OFFSET_INIT(task_struct_se, "task_struct", "se"); > >>> + if (VALID_MEMBER(task_struct_se)) { > >>> + STRUCT_SIZE_INIT(sched_entity, "sched_entity"); > >>> + MEMBER_OFFSET_INIT(sched_entity_exec_start, > "sched_entity", "exec_start"); > >>> + } > >>> if (VALID_MEMBER(task_struct_last_run) || > >>> VALID_MEMBER(task_struct_timestamp) || > >>> - VALID_MEMBER(sched_info_last_arrival)) { > >>> + VALID_MEMBER(sched_info_last_arrival) || > >>> + VALID_MEMBER(sched_entity_exec_start)) { > >>> char buf[BUFSIZE]; > >>> strcpy(buf, "alias last ps -l"); > >>> alias_init(buf); > >>> @@ -3559,7 +3565,8 @@ cmd_ps(void) > >>> case 'm': > >>> if (INVALID_MEMBER(task_struct_last_run) && > >>> INVALID_MEMBER(task_struct_timestamp) && > >>> - INVALID_MEMBER(sched_info_last_arrival)) { > >>> + INVALID_MEMBER(sched_info_last_arrival) && > >>> + INVALID_MEMBER(sched_entity_exec_start)) { > >>> error(INFO, > >>> "last-run timestamps do not exist in this > kernel\n"); > >>> argerrs++; > >>> @@ -3574,7 +3581,8 @@ cmd_ps(void) > >>> case 'l': > >>> if (INVALID_MEMBER(task_struct_last_run) && > >>> INVALID_MEMBER(task_struct_timestamp) && > >>> - INVALID_MEMBER(sched_info_last_arrival)) { > >>> + INVALID_MEMBER(sched_info_last_arrival) && > >>> + INVALID_MEMBER(sched_entity_exec_start)) { > >>> error(INFO, > >>> "last-run timestamps do not exist in this > kernel\n"); > >>> argerrs++; > >>> @@ -6020,7 +6028,11 @@ task_last_run(ulong task) > >>> timestamp = tt->last_task_read ? > ULONGLONG(tt->task_struct + > >>> OFFSET(task_struct_sched_info) + > >>> OFFSET(sched_info_last_arrival)) : 0; > >>> - > >>> + else if (VALID_MEMBER(sched_entity_exec_start)) > >>> + timestamp = tt->last_task_read ? > ULONGLONG(tt->task_struct + > >>> + OFFSET(task_struct_se) + > >>> + OFFSET(sched_entity_exec_start)) : 0; > >>> + > >>> return timestamp; > >>> } > >>> > >>> -- > >>> 2.20.1 > >
-- Crash-utility mailing list [email protected] https://listman.redhat.com/mailman/listinfo/crash-utility Contribution Guidelines: https://github.com/crash-utility/crash/wiki
