[Crash-utility] [PATCH] Remove ptype command from "ps -t" option to reduce memory and time

HAGIO KAZUHITO(萩尾 一仁) k-hagio-ab at nec.com
Fri Jan 21 07:35:22 UTC 2022


-----Original Message-----
> On Wed, Jan 19, 2022 at 4:27 PM HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab at nec.com <mailto:k-hagio-ab at nec.com>
> > wrote:
> 
> 
> 	With some vmlinux e.g. RHEL9 ones, the first execution of the gdb ptype
> 	command heavily consumes memory and time.  The "ps -t" option uses it
> 	in start_time_timespec() and it can be replaced with crash macros.
> 	This can reduce about 1.4 GB memory and 6 seconds time comsumption in
> 	the following test:
> 
> 	  $ echo "ps -t" | time crash vmlinux vmcore
> 
> 	  Without the patch:
> 	  11.60user 0.43system 0:11.94elapsed 100%CPU (0avgtext+0avgdata 1837964maxresident)k
> 	  0inputs+400outputs (0major+413636minor)pagefaults 0swaps
> 
> 	  With the patch:
> 	  5.40user 0.16system 0:05.46elapsed 101%CPU (0avgtext+0avgdata 417896maxresident)k
> 	  0inputs+384outputs (0major+41528minor)pagefaults 0swaps
> 
> 	Although the ptype command and similar ones cannot be fully removed,
> 	but removing some of them will make the use of crash safer, especially
> 	for an automatic crash analyzer.
> 
> 	Signed-off-by: Kazuhito Hagio <k-hagio-ab at nec.com <mailto:k-hagio-ab at nec.com> >
> 	---
> 	 task.c | 25 +++++--------------------
> 	 1 file changed, 5 insertions(+), 20 deletions(-)
> 
> 	diff --git a/task.c b/task.c
> 	index 263a8344dd94..a79ed0d96fb5 100644
> 	--- a/task.c
> 	+++ b/task.c
> 	@@ -4662,8 +4662,6 @@ show_task_times(struct task_context *tcp, ulong flags)
> 	 static int
> 	 start_time_timespec(void)
> 	 {
> 	-        char buf[BUFSIZE];
> 	-
> 	        switch(tt->flags & (TIMESPEC | NO_TIMESPEC | START_TIME_NSECS))
> 	        {
> 	        case TIMESPEC:
> 	@@ -4677,24 +4675,11 @@ start_time_timespec(void)
> 
> 	        tt->flags |= NO_TIMESPEC;
> 
> 	-        open_tmpfile();
> 	-        sprintf(buf, "ptype struct task_struct");
> 	-        if (!gdb_pass_through(buf, NULL, GNU_RETURN_ON_ERROR)) {
> 	-                close_tmpfile();
> 	-                return FALSE;
> 	-        }
> 	-
> 	-        rewind(pc->tmpfile);
> 	-        while (fgets(buf, BUFSIZE, pc->tmpfile)) {
> 	-                if (strstr(buf, "start_time;")) {
> 	-                       if (strstr(buf, "struct timespec")) {
> 	-                               tt->flags &= ~NO_TIMESPEC;
> 	-                               tt->flags |= TIMESPEC;
> 	-                       }
> 	-               }
> 	-        }
> 	-
> 	-        close_tmpfile();
> 	+       if (VALID_MEMBER(task_struct_start_time) &&
> 	+           STREQ(MEMBER_TYPE_NAME("task_struct", "start_time"), "timespec")) {
> 	+                       tt->flags &= ~NO_TIMESPEC;
> 	+                       tt->flags |= TIMESPEC;
> 	+       }
> 
> 	        if ((tt->flags & NO_TIMESPEC) && (SIZE(task_struct_start_time) == 8)) {
> 	                tt->flags &= ~NO_TIMESPEC;
> 	--
> 	2.27.0
> 
> 
> 
> For this one:
> Acked-by: Lianbo Jiang <lijiang at redhat.com <mailto:lijiang at redhat.com> >
> 

Thank you for reviewing, applied.

Kazu





More information about the Crash-utility mailing list