[Crash-utility] [PATCH] Extensions: swap_usage: Add thread group leader support

Dave Anderson anderson at redhat.com
Thu Feb 20 18:59:09 UTC 2014


Posted to the extensions page:

 http://people.redhat.com/anderson/extensions.html#PSWAP

Thanks,
  Dave

----- Original Message -----
> Provide the -G option to display the swap consumption
> of the thread group leader in a thread group.
> 
> For example:
> 
> 	crash> pswap -k -G | head
> 	PID     SWAP     COMM
> 	  1     136k	systemd
> 	469     284k	  zsh
> 	599     148k	systemd-journal
> 	608    1192k	lvmetad
> 	637    1712k	systemd-udevd
> 	822     308k	auditd
> 	836     104k	audispd
> 	838     156k	sedispatch
> 	842      92k	alsactl
> 
> The complete file can be found here:
> 
> http://people.redhat.com/~atomlin/crash/extensions/swap_usage.c
> 
> Signed-off-by: Aaron Tomlin <atomlin at redhat.com>
> ---
>  extensions/swap_usage.c | 70
>  ++++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 60 insertions(+), 10 deletions(-)
> 
> diff --git a/extensions/swap_usage.c b/extensions/swap_usage.c
> index 4f92e8c..d9467ca 100644
> --- a/extensions/swap_usage.c
> +++ b/extensions/swap_usage.c
> @@ -19,6 +19,7 @@
>  #include "defs.h"
>  
>  #define DISPLAY_KB      (0x2)
> +#define DISPLAY_TG      (0x4)
>  
>  #ifdef	ARM
>  #define _PAGE_FILE	(1 << 2)
> @@ -138,8 +139,8 @@ show_swap_usage(struct task_context *tc, ulong exists,
> ulong flag)
>  	if (flag & DISPLAY_KB)
>  		swap_usage  <<= (PAGESHIFT()-10);
>  
> -	fprintf(fp, "%5ld  %5ld%s%5s\n",
> -	tc->pid, swap_usage, (flag & DISPLAY_KB) ? "k\t" : "\t", tc->comm);
> +	fprintf(fp, "%3ld  %6ld%s%5s\n", tc->pid, swap_usage,
> +		(flag & DISPLAY_KB) ? "k\t" : "\t", tc->comm);
>  }
>  
>  
> @@ -151,6 +152,7 @@ cmd_pswap(void)
>  	int c;
>  	ulong value;
>  	ulong flag = 0;
> +	ulong tgid;
>  	int subsequent = 0;
>  	ulong exists = MEMBER_NOT_FOUND;
>  
> @@ -159,11 +161,14 @@ cmd_pswap(void)
>  		exists = MEMBER_FOUND;
>  	}
>  
> -	while ((c = getopt(argcnt, args, "k")) != EOF) {
> +	while ((c = getopt(argcnt, args, "kG")) != EOF) {
>  		switch (c) {
>                  case 'k':
>                          flag |= DISPLAY_KB;
>                          break;
> +		case 'G':
> +                        flag |= DISPLAY_TG;
> +                        break;
>  		default:
>  			argerrs++;
>  			break;
> @@ -177,9 +182,16 @@ cmd_pswap(void)
>                  PRINT_HEADER();
>                  tc = FIRST_CONTEXT();
>                  for (i = 0; i < RUNNING_TASKS(); i++, tc++) {
> -                        if (!is_kernel_thread(tc->task))
> -                                show_swap_usage(tc, exists, flag);
> -                }
> +                        if (!is_kernel_thread(tc->task)) {
> +				if (flag & DISPLAY_TG) {
> +					tgid = task_tgid(tc->task);
> +					if (tc->pid != tgid)
> +						continue;
> +					tc = tgid_to_context(tgid);
> +				}
> +				show_swap_usage(tc, exists, flag);
> +			}
> +                }
>  		return;
>          }
>  
> @@ -189,6 +201,12 @@ cmd_pswap(void)
>  		case STR_PID:
>  			for (tc = pid_to_context(value); tc; tc = tc->tc_next) {
>  				if (!is_kernel_thread(tc->task)) {
> +					if (flag & DISPLAY_TG) {
> +						tgid = task_tgid(tc->task);
> +						if (tc->pid != tgid)
> +							continue;
> +						tc = tgid_to_context(tgid);
> +					}
>  					show_swap_usage(tc, exists, flag);
>  				} else {
>  					error(INFO, "only specify a user task or pid: %s\n",
> @@ -200,6 +218,12 @@ cmd_pswap(void)
>  		case STR_TASK:
>  			for (; tc; tc = tc->tc_next) {
>  				if (!is_kernel_thread(tc->task)) {
> +					if (flag & DISPLAY_TG) {
> +						tgid = task_tgid(tc->task);
> +						if (tc->pid != tgid)
> +							continue;
> +						tc = tgid_to_context(tgid);
> +					}
>  					show_swap_usage(tc, exists, flag);
>  				} else {
>  					error(INFO, "only specify a user task or pid: %s\n",
> @@ -222,19 +246,45 @@ cmd_pswap(void)
>  char *help_pswap[] = {
>  	"pswap",
>  	"Returns the actual swap consumption of a user process",
> -	"[-k] [pid | taskp]",
> +	"[-k -G] [pid | taskp]",
>  
>  	"  This command obtains the swap consumption (in pages) of a user
>  	process.",
> -        "  The -k option can be used to print in kilobytes.\n"
> +	"  The process list may be restricted with the following options:\n",
> +        "  	-k print in kilobytes.\n"
> +        "  	-G show only the thread group leader in a thread group.\n"
> +	" ",
>  	"  If no arguments are specified, every user process will be checked.",
>  	"  Supported on ARM, X86, X86_64, ALPHA, IA64 and S390 only.",
>  	"\nEXAMPLE",
>  	"  Show the swap consumption for pid 1232, 1353 and 2275:\n",
>  	"    crash> pswap 1232 1353 2275",
> -	"    PID     SWAP     COMM",
> +	"     PID     SWAP    COMM",
>  	"     1232     34    auditd",
>  	"     1353    526       vi",
>  	"     2275  30237    gnome-shell",
> -	"    crash>",
> +	"    crash>",
> +	" ",
> +	" Show the swap consumption for thread group leaders only:\n",
> +	"    crash> pswap -G",
> +	"     PID     SWAP    COMM",
> +	"     469      71      zsh",
> +	"     599      37    systemd-journal",
> +	"     608     298    lvmetad",
> +	"     637     428    systemd-udevd",
> +	"     822      77    auditd",
> +	"     836      26    audispd",
> +	"     838      39    sedispatch",
> +	"     842      23    alsactl",
> +	"     844      44    bluetoothd",
> +	"     851      46    rtkit-daemon",
> +	"     852      59    accounts-daemon",
> +	"     855      23    avahi-daemon",
> +	"     857      96    rsyslogd",
> +	"     858     179    restorecond",
> +	"     859     144    smartd",
> +	"     862      33    irqbalance",
> +	"     867      41    systemd-logind",
> +	"     868      37    dbus-daemon",
> +	"    crash>",
>  	NULL
>  };
> --
> 1.8.5.3
> 
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
> 




More information about the Crash-utility mailing list