diff options
| author | Alexey Dobriyan <adobriyan@gmail.com> | 2020-04-06 20:09:05 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-04-07 10:43:42 -0700 | 
| commit | 5c5ab9714c2225d50119e397c537ad5e568f268b (patch) | |
| tree | 9a68b7a199b7b287098b3197850fbff446bdcfb5 /fs/proc/array.c | |
| parent | d919b33dafb3e222d23671b2bb06d119aede625f (diff) | |
proc: speed up /proc/*/statm
top(1) reads all /proc/*/statm files but kernel threads will always have
zeros.  Print those zeroes directly without going through
seq_put_decimal_ull().
Speed up reading /proc/2/statm (which is kthreadd) is like 3%.
My system has more kernel threads than normal processes after booting KDE.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Link: http://lkml.kernel.org/r/20200307154435.GA2788@avx2
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 39 | 
1 files changed, 23 insertions, 16 deletions
| diff --git a/fs/proc/array.c b/fs/proc/array.c index 5efaf3708ec6..8e16f14bb05a 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -635,28 +635,35 @@ int proc_tgid_stat(struct seq_file *m, struct pid_namespace *ns,  int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns,  			struct pid *pid, struct task_struct *task)  { -	unsigned long size = 0, resident = 0, shared = 0, text = 0, data = 0;  	struct mm_struct *mm = get_task_mm(task);  	if (mm) { +		unsigned long size; +		unsigned long resident = 0; +		unsigned long shared = 0; +		unsigned long text = 0; +		unsigned long data = 0; +  		size = task_statm(mm, &shared, &text, &data, &resident);  		mmput(mm); -	} -	/* -	 * For quick read, open code by putting numbers directly -	 * expected format is -	 * seq_printf(m, "%lu %lu %lu %lu 0 %lu 0\n", -	 *               size, resident, shared, text, data); -	 */ -	seq_put_decimal_ull(m, "", size); -	seq_put_decimal_ull(m, " ", resident); -	seq_put_decimal_ull(m, " ", shared); -	seq_put_decimal_ull(m, " ", text); -	seq_put_decimal_ull(m, " ", 0); -	seq_put_decimal_ull(m, " ", data); -	seq_put_decimal_ull(m, " ", 0); -	seq_putc(m, '\n'); +		/* +		 * For quick read, open code by putting numbers directly +		 * expected format is +		 * seq_printf(m, "%lu %lu %lu %lu 0 %lu 0\n", +		 *               size, resident, shared, text, data); +		 */ +		seq_put_decimal_ull(m, "", size); +		seq_put_decimal_ull(m, " ", resident); +		seq_put_decimal_ull(m, " ", shared); +		seq_put_decimal_ull(m, " ", text); +		seq_put_decimal_ull(m, " ", 0); +		seq_put_decimal_ull(m, " ", data); +		seq_put_decimal_ull(m, " ", 0); +		seq_putc(m, '\n'); +	} else { +		seq_write(m, "0 0 0 0 0 0 0\n", 14); +	}  	return 0;  } | 
