aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-06-05 20:31:33 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-06-05 20:31:33 -0400
commitaf6c5d5e01ad9f2c9ca38cccaae6b5d67ddd241f (patch)
tree5bfdb1ee5c0b904732929eae55fe6da13bd273d5 /fs
parent9f25a8da423226d7797e35a132535186c531228b (diff)
parent66448bc274cadedb71fda7d914e7c29d8dead217 (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')
-rw-r--r--fs/proc/array.c33
-rw-r--r--fs/proc/base.c5
-rw-r--r--fs/proc/internal.h2
3 files changed, 24 insertions, 16 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 @@
96#include <asm/processor.h> 96#include <asm/processor.h>
97#include "internal.h" 97#include "internal.h"
98 98
99static inline void task_name(struct seq_file *m, struct task_struct *p) 99void proc_task_name(struct seq_file *m, struct task_struct *p, bool escape)
100{ 100{
101 char *buf; 101 char *buf;
102 size_t size; 102 size_t size;
103 char tcomm[sizeof(p->comm)]; 103 char tcomm[64];
104 int ret; 104 int ret;
105 105
106 get_task_comm(tcomm, p); 106 if (p->flags & PF_WQ_WORKER)
107 107 wq_worker_comm(tcomm, sizeof(tcomm), p);
108 seq_puts(m, "Name:\t"); 108 else
109 __get_task_comm(tcomm, sizeof(tcomm), p);
109 110
110 size = seq_get_buf(m, &buf); 111 size = seq_get_buf(m, &buf);
111 ret = string_escape_str(tcomm, buf, size, ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\"); 112 if (escape) {
112 seq_commit(m, ret < size ? ret : -1); 113 ret = string_escape_str(tcomm, buf, size,
114 ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\");
115 if (ret >= size)
116 ret = -1;
117 } else {
118 ret = strscpy(buf, tcomm, size);
119 }
113 120
114 seq_putc(m, '\n'); 121 seq_commit(m, ret);
115} 122}
116 123
117/* 124/*
@@ -390,7 +397,10 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
390{ 397{
391 struct mm_struct *mm = get_task_mm(task); 398 struct mm_struct *mm = get_task_mm(task);
392 399
393 task_name(m, task); 400 seq_puts(m, "Name:\t");
401 proc_task_name(m, task, true);
402 seq_putc(m, '\n');
403
394 task_state(m, ns, pid, task); 404 task_state(m, ns, pid, task);
395 405
396 if (mm) { 406 if (mm) {
@@ -425,7 +435,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
425 u64 cutime, cstime, utime, stime; 435 u64 cutime, cstime, utime, stime;
426 u64 cgtime, gtime; 436 u64 cgtime, gtime;
427 unsigned long rsslim = 0; 437 unsigned long rsslim = 0;
428 char tcomm[sizeof(task->comm)];
429 unsigned long flags; 438 unsigned long flags;
430 439
431 state = *get_task_state(task); 440 state = *get_task_state(task);
@@ -452,8 +461,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
452 } 461 }
453 } 462 }
454 463
455 get_task_comm(tcomm, task);
456
457 sigemptyset(&sigign); 464 sigemptyset(&sigign);
458 sigemptyset(&sigcatch); 465 sigemptyset(&sigcatch);
459 cutime = cstime = utime = stime = 0; 466 cutime = cstime = utime = stime = 0;
@@ -520,7 +527,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
520 527
521 seq_put_decimal_ull(m, "", pid_nr_ns(pid, ns)); 528 seq_put_decimal_ull(m, "", pid_nr_ns(pid, ns));
522 seq_puts(m, " ("); 529 seq_puts(m, " (");
523 seq_puts(m, tcomm); 530 proc_task_name(m, task, false);
524 seq_puts(m, ") "); 531 seq_puts(m, ") ");
525 seq_putc(m, state); 532 seq_putc(m, state);
526 seq_put_decimal_ll(m, " ", ppid); 533 seq_put_decimal_ll(m, " ", ppid);
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 33ed1746927a..af128b374143 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -1563,9 +1563,8 @@ static int comm_show(struct seq_file *m, void *v)
1563 if (!p) 1563 if (!p)
1564 return -ESRCH; 1564 return -ESRCH;
1565 1565
1566 task_lock(p); 1566 proc_task_name(m, p, false);
1567 seq_printf(m, "%s\n", p->comm); 1567 seq_putc(m, '\n');
1568 task_unlock(p);
1569 1568
1570 put_task_struct(p); 1569 put_task_struct(p);
1571 1570
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
index 43c70c9e6b62..93eb1906c28d 100644
--- a/fs/proc/internal.h
+++ b/fs/proc/internal.h
@@ -136,6 +136,8 @@ unsigned name_to_int(const struct qstr *qstr);
136 */ 136 */
137extern const struct file_operations proc_tid_children_operations; 137extern const struct file_operations proc_tid_children_operations;
138 138
139extern void proc_task_name(struct seq_file *m, struct task_struct *p,
140 bool escape);
139extern int proc_tid_stat(struct seq_file *, struct pid_namespace *, 141extern int proc_tid_stat(struct seq_file *, struct pid_namespace *,
140 struct pid *, struct task_struct *); 142 struct pid *, struct task_struct *);
141extern int proc_tgid_stat(struct seq_file *, struct pid_namespace *, 143extern int proc_tgid_stat(struct seq_file *, struct pid_namespace *,