Commit af6c5d5e authored by Linus Torvalds's avatar Linus Torvalds

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
parents 9f25a8da 66448bc2
...@@ -96,22 +96,29 @@ ...@@ -96,22 +96,29 @@
#include <asm/processor.h> #include <asm/processor.h>
#include "internal.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; char *buf;
size_t size; size_t size;
char tcomm[sizeof(p->comm)]; char tcomm[64];
int ret; int ret;
get_task_comm(tcomm, p); if (p->flags & PF_WQ_WORKER)
wq_worker_comm(tcomm, sizeof(tcomm), p);
seq_puts(m, "Name:\t"); else
__get_task_comm(tcomm, sizeof(tcomm), p);
size = seq_get_buf(m, &buf); size = seq_get_buf(m, &buf);
ret = string_escape_str(tcomm, buf, size, ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\"); if (escape) {
seq_commit(m, ret < size ? ret : -1); 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, ...@@ -390,7 +397,10 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
{ {
struct mm_struct *mm = get_task_mm(task); 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); task_state(m, ns, pid, task);
if (mm) { if (mm) {
...@@ -425,7 +435,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, ...@@ -425,7 +435,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
u64 cutime, cstime, utime, stime; u64 cutime, cstime, utime, stime;
u64 cgtime, gtime; u64 cgtime, gtime;
unsigned long rsslim = 0; unsigned long rsslim = 0;
char tcomm[sizeof(task->comm)];
unsigned long flags; unsigned long flags;
state = *get_task_state(task); state = *get_task_state(task);
...@@ -452,8 +461,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, ...@@ -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(&sigign);
sigemptyset(&sigcatch); sigemptyset(&sigcatch);
cutime = cstime = utime = stime = 0; cutime = cstime = utime = stime = 0;
...@@ -520,7 +527,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, ...@@ -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_put_decimal_ull(m, "", pid_nr_ns(pid, ns));
seq_puts(m, " ("); seq_puts(m, " (");
seq_puts(m, tcomm); proc_task_name(m, task, false);
seq_puts(m, ") "); seq_puts(m, ") ");
seq_putc(m, state); seq_putc(m, state);
seq_put_decimal_ll(m, " ", ppid); seq_put_decimal_ll(m, " ", ppid);
......
...@@ -1563,9 +1563,8 @@ static int comm_show(struct seq_file *m, void *v) ...@@ -1563,9 +1563,8 @@ static int comm_show(struct seq_file *m, void *v)
if (!p) if (!p)
return -ESRCH; return -ESRCH;
task_lock(p); proc_task_name(m, p, false);
seq_printf(m, "%s\n", p->comm); seq_putc(m, '\n');
task_unlock(p);
put_task_struct(p); put_task_struct(p);
......
...@@ -136,6 +136,8 @@ unsigned name_to_int(const struct qstr *qstr); ...@@ -136,6 +136,8 @@ unsigned name_to_int(const struct qstr *qstr);
*/ */
extern const struct file_operations proc_tid_children_operations; extern const struct file_operations proc_tid_children_operations;
extern void proc_task_name(struct seq_file *m, struct task_struct *p,
bool escape);
extern int proc_tid_stat(struct seq_file *, struct pid_namespace *, extern int proc_tid_stat(struct seq_file *, struct pid_namespace *,
struct pid *, struct task_struct *); struct pid *, struct task_struct *);
extern int proc_tgid_stat(struct seq_file *, struct pid_namespace *, extern int proc_tgid_stat(struct seq_file *, struct pid_namespace *,
......
...@@ -494,6 +494,7 @@ extern unsigned int work_busy(struct work_struct *work); ...@@ -494,6 +494,7 @@ extern unsigned int work_busy(struct work_struct *work);
extern __printf(1, 2) void set_worker_desc(const char *fmt, ...); extern __printf(1, 2) void set_worker_desc(const char *fmt, ...);
extern void print_worker_info(const char *log_lvl, struct task_struct *task); extern void print_worker_info(const char *log_lvl, struct task_struct *task);
extern void show_workqueue_state(void); extern void show_workqueue_state(void);
extern void wq_worker_comm(char *buf, size_t size, struct task_struct *task);
/** /**
* queue_work - queue work on a workqueue * queue_work - queue work on a workqueue
......
This diff is collapsed.
...@@ -31,13 +31,12 @@ struct worker { ...@@ -31,13 +31,12 @@ struct worker {
struct work_struct *current_work; /* L: work being processed */ struct work_struct *current_work; /* L: work being processed */
work_func_t current_func; /* L: current_work's fn */ work_func_t current_func; /* L: current_work's fn */
struct pool_workqueue *current_pwq; /* L: current_work's pwq */ struct pool_workqueue *current_pwq; /* L: current_work's pwq */
bool desc_valid; /* ->desc is valid */
struct list_head scheduled; /* L: scheduled works */ struct list_head scheduled; /* L: scheduled works */
/* 64 bytes boundary on 64bit, 32 on 32bit */ /* 64 bytes boundary on 64bit, 32 on 32bit */
struct task_struct *task; /* I: worker task */ struct task_struct *task; /* I: worker task */
struct worker_pool *pool; /* I: the associated pool */ struct worker_pool *pool; /* A: the associated pool */
/* L: for rescuers */ /* L: for rescuers */
struct list_head node; /* A: anchored at pool->workers */ struct list_head node; /* A: anchored at pool->workers */
/* A: runs through worker->node */ /* A: runs through worker->node */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment