aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/proc/array.c')
-rw-r--r--fs/proc/array.c33
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 @@
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);