Commit ef03c46d authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Remove redundant code in workqueue.c

From: Rusty Russell <rusty@rustcorp.com.au>

It turns out that run_workqueue never has signal_pending(), since setting
the handler to SIG_IGN means "don't make zombies, I'm ignoring them".  Fix
the comment, don't allow the signal, and remove the unused waitpid loop.

This also allows simpler conversion of workueues to the kthread mechanism,
which uses signals to indicate it's time to stop.
parent c8800d33
...@@ -14,13 +14,10 @@ ...@@ -14,13 +14,10 @@
* Theodore Ts'o <tytso@mit.edu> * Theodore Ts'o <tytso@mit.edu>
*/ */
#define __KERNEL_SYSCALLS__
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/unistd.h>
#include <linux/signal.h> #include <linux/signal.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
...@@ -171,7 +168,6 @@ static int worker_thread(void *__startup) ...@@ -171,7 +168,6 @@ static int worker_thread(void *__startup)
struct k_sigaction sa; struct k_sigaction sa;
daemonize("%s/%d", startup->name, cpu); daemonize("%s/%d", startup->name, cpu);
allow_signal(SIGCHLD);
current->flags |= PF_IOTHREAD; current->flags |= PF_IOTHREAD;
cwq->thread = current; cwq->thread = current;
...@@ -180,7 +176,7 @@ static int worker_thread(void *__startup) ...@@ -180,7 +176,7 @@ static int worker_thread(void *__startup)
complete(&startup->done); complete(&startup->done);
/* Install a handler so SIGCLD is delivered */ /* SIG_IGN makes children autoreap: see do_notify_parent(). */
sa.sa.sa_handler = SIG_IGN; sa.sa.sa_handler = SIG_IGN;
sa.sa.sa_flags = 0; sa.sa.sa_flags = 0;
siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD)); siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD));
...@@ -200,14 +196,6 @@ static int worker_thread(void *__startup) ...@@ -200,14 +196,6 @@ static int worker_thread(void *__startup)
if (!list_empty(&cwq->worklist)) if (!list_empty(&cwq->worklist))
run_workqueue(cwq); run_workqueue(cwq);
if (signal_pending(current)) {
while (waitpid(-1, NULL, __WALL|WNOHANG) > 0)
/* SIGCHLD - auto-reaping */ ;
/* zap all other signals */
flush_signals(current);
}
} }
remove_wait_queue(&cwq->more_work, &wait); remove_wait_queue(&cwq->more_work, &wait);
complete(&cwq->exit); complete(&cwq->exit);
......
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