Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit be0e6f29 authored by Oleg Nesterov's avatar Oleg Nesterov Committed by Linus Torvalds
Browse files

signal: turn dequeue_signal_lock() into kernel_dequeue_signal()



1. Rename dequeue_signal_lock() to kernel_dequeue_signal(). This
   matches another "for kthreads only" kernel_sigaction() helper.

2. Remove the "tsk" and "mask" arguments, they are always current
   and current->blocked. And it is simply wrong if tsk != current.

3. We could also remove the 3rd "siginfo_t *info" arg but it looks
   potentially useful. However we can simplify the callers if we
   change kernel_dequeue_signal() to accept info => NULL.

4. Remove _irqsave, it is never called from atomic context.

Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
Reviewed-by: default avatarTejun Heo <tj@kernel.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Felipe Balbi <balbi@ti.com>
Cc: Markus Pargmann <mpa@pengutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2e01fabe
Loading
Loading
Loading
Loading
+4 −11
Original line number Diff line number Diff line
@@ -444,9 +444,7 @@ static int nbd_thread_recv(struct nbd_device *nbd)
	spin_unlock_irqrestore(&nbd->tasks_lock, flags);

	if (signal_pending(current)) {
		siginfo_t info;

		ret = dequeue_signal_lock(current, &current->blocked, &info);
		ret = kernel_dequeue_signal(NULL);
		dev_warn(nbd_to_dev(nbd), "pid %d, %s, got signal %d\n",
			 task_pid_nr(current), current->comm, ret);
		mutex_lock(&nbd->tx_lock);
@@ -560,11 +558,8 @@ static int nbd_thread_send(void *data)
					 !list_empty(&nbd->waiting_queue));

		if (signal_pending(current)) {
			siginfo_t info;
			int ret;
			int ret = kernel_dequeue_signal(NULL);

			ret = dequeue_signal_lock(current, &current->blocked,
						  &info);
			dev_warn(nbd_to_dev(nbd), "pid %d, %s, got signal %d\n",
				 task_pid_nr(current), current->comm, ret);
			mutex_lock(&nbd->tx_lock);
@@ -592,10 +587,8 @@ static int nbd_thread_send(void *data)
	spin_unlock_irqrestore(&nbd->tasks_lock, flags);

	/* Clear maybe pending signals */
	if (signal_pending(current)) {
		siginfo_t info;
		dequeue_signal_lock(current, &current->blocked, &info);
	}
	if (signal_pending(current))
		kernel_dequeue_signal(NULL);

	return 0;
}
+1 −3
Original line number Diff line number Diff line
@@ -2345,7 +2345,6 @@ static void fsg_disable(struct usb_function *f)

static void handle_exception(struct fsg_common *common)
{
	siginfo_t		info;
	int			i;
	struct fsg_buffhd	*bh;
	enum fsg_state		old_state;
@@ -2357,8 +2356,7 @@ static void handle_exception(struct fsg_common *common)
	 * into a high-priority EXIT exception.
	 */
	for (;;) {
		int sig =
			dequeue_signal_lock(current, &current->blocked, &info);
		int sig = kernel_dequeue_signal(NULL);
		if (!sig)
			break;
		if (sig != SIGUSR1) {
+1 −2
Original line number Diff line number Diff line
@@ -121,13 +121,12 @@ static int jffs2_garbage_collect_thread(void *_c)
		/* Put_super will send a SIGKILL and then wait on the sem.
		 */
		while (signal_pending(current) || freezing(current)) {
			siginfo_t info;
			unsigned long signr;

			if (try_to_freeze())
				goto again;

			signr = dequeue_signal_lock(current, &current->blocked, &info);
			signr = kernel_dequeue_signal(NULL);

			switch(signr) {
			case SIGSTOP:
+6 −5
Original line number Diff line number Diff line
@@ -2462,14 +2462,15 @@ extern void ignore_signals(struct task_struct *);
extern void flush_signal_handlers(struct task_struct *, int force_default);
extern int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info);

static inline int dequeue_signal_lock(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
static inline int kernel_dequeue_signal(siginfo_t *info)
{
	unsigned long flags;
	struct task_struct *tsk = current;
	siginfo_t __info;
	int ret;

	spin_lock_irqsave(&tsk->sighand->siglock, flags);
	ret = dequeue_signal(tsk, mask, info);
	spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
	spin_lock_irq(&tsk->sighand->siglock);
	ret = dequeue_signal(tsk, &tsk->blocked, info ?: &__info);
	spin_unlock_irq(&tsk->sighand->siglock);

	return ret;
}