diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-05 17:31:33 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-05 17:31:33 -0700 | 
| commit | af6c5d5e01ad9f2c9ca38cccaae6b5d67ddd241f (patch) | |
| tree | 5bfdb1ee5c0b904732929eae55fe6da13bd273d5 /fs/proc/array.c | |
| parent | 9f25a8da423226d7797e35a132535186c531228b (diff) | |
| parent | 66448bc274cadedb71fda7d914e7c29d8dead217 (diff) | |
Merge branch 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq
Pull workqueue updates from Tejun Heo:
 - make kworkers report the workqueue it is executing or has executed
   most recently in /proc/PID/comm (so they show up in ps/top)
 - CONFIG_SMP shuffle to move stuff which isn't necessary for UP builds
   inside CONFIG_SMP.
* 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:
  workqueue: move function definitions within CONFIG_SMP block
  workqueue: Make sure struct worker is accessible for wq_worker_comm()
  workqueue: Show the latest workqueue name in /proc/PID/{comm,stat,status}
  proc: Consolidate task->comm formatting into proc_task_name()
  workqueue: Set worker->desc to workqueue name by default
  workqueue: Make worker_attach/detach_pool() update worker->pool
  workqueue: Replace pool->attach_mutex with global wq_pool_attach_mutex
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 33 | 
1 files changed, 20 insertions, 13 deletions
| diff --git a/fs/proc/array.c b/fs/proc/array.c index e6d7f41b6684..004077f1a7bf 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -96,22 +96,29 @@  #include <asm/processor.h>  #include "internal.h" -static inline void task_name(struct seq_file *m, struct task_struct *p) +void proc_task_name(struct seq_file *m, struct task_struct *p, bool escape)  {  	char *buf;  	size_t size; -	char tcomm[sizeof(p->comm)]; +	char tcomm[64];  	int ret; -	get_task_comm(tcomm, p); - -	seq_puts(m, "Name:\t"); +	if (p->flags & PF_WQ_WORKER) +		wq_worker_comm(tcomm, sizeof(tcomm), p); +	else +		__get_task_comm(tcomm, sizeof(tcomm), p);  	size = seq_get_buf(m, &buf); -	ret = string_escape_str(tcomm, buf, size, ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\"); -	seq_commit(m, ret < size ? ret : -1); +	if (escape) { +		ret = string_escape_str(tcomm, buf, size, +					ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\"); +		if (ret >= size) +			ret = -1; +	} else { +		ret = strscpy(buf, tcomm, size); +	} -	seq_putc(m, '\n'); +	seq_commit(m, ret);  }  /* @@ -390,7 +397,10 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,  {  	struct mm_struct *mm = get_task_mm(task); -	task_name(m, task); +	seq_puts(m, "Name:\t"); +	proc_task_name(m, task, true); +	seq_putc(m, '\n'); +  	task_state(m, ns, pid, task);  	if (mm) { @@ -425,7 +435,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  	u64 cutime, cstime, utime, stime;  	u64 cgtime, gtime;  	unsigned long rsslim = 0; -	char tcomm[sizeof(task->comm)];  	unsigned long flags;  	state = *get_task_state(task); @@ -452,8 +461,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  		}  	} -	get_task_comm(tcomm, task); -  	sigemptyset(&sigign);  	sigemptyset(&sigcatch);  	cutime = cstime = utime = stime = 0; @@ -520,7 +527,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  	seq_put_decimal_ull(m, "", pid_nr_ns(pid, ns));  	seq_puts(m, " ("); -	seq_puts(m, tcomm); +	proc_task_name(m, task, false);  	seq_puts(m, ") ");  	seq_putc(m, state);  	seq_put_decimal_ll(m, " ", ppid); | 
