Messages in this thread Patch in this message | | | From | David Woodhouse <> | Date | Sat, 04 Oct 2003 12:25:33 +0100 | Subject | JFFS2 swsusp / signal cleanup. |
| |
How's this look?
===== fs/jffs2/background.c 1.19 vs edited ===== --- 1.19/fs/jffs2/background.c Wed May 28 16:01:05 2003 +++ edited/fs/jffs2/background.c Sat Oct 4 12:23:52 2003 @@ -19,6 +19,7 @@ #include <linux/completion.h> #include <linux/sched.h> #include <linux/unistd.h> +#include <linux/suspend.h> #include "nodelist.h" @@ -89,10 +90,10 @@ set_user_nice(current, 10); for (;;) { - spin_lock_irq(¤t_sig_lock); - siginitsetinv (¤t->blocked, sigmask(SIGHUP) | sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT)); - recalc_sigpending(); - spin_unlock_irq(¤t_sig_lock); + allow_signal(SIGHUP); + allow_signal(SIGKILL); + allow_signal(SIGSTOP); + allow_signal(SIGCONT); if (!thread_should_wake(c)) { set_current_state (TASK_INTERRUPTIBLE); @@ -104,6 +105,13 @@ schedule(); } + if (current->flags & PF_FREEZE) { + refrigerator(0); /* When this loses its stupid flush_signals() + and starts just calling recalc_sigpending(), + you can remove the following: */ + recalc_sigpending(); + } + cond_resched(); /* Put_super will send a SIGKILL and then wait on the sem. @@ -112,9 +120,7 @@ siginfo_t info; unsigned long signr; - spin_lock_irq(¤t_sig_lock); - signr = dequeue_signal(current, ¤t->blocked, &info); - spin_unlock_irq(¤t_sig_lock); + signr = dequeue_signal_lock(current, ¤t->blocked, &info); switch(signr) { case SIGSTOP: @@ -138,10 +144,7 @@ } } /* We don't want SIGHUP to interrupt us. STOP and KILL are OK though. */ - spin_lock_irq(¤t_sig_lock); - siginitsetinv (¤t->blocked, sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT)); - recalc_sigpending(); - spin_unlock_irq(¤t_sig_lock); + disallow_signal(SIGHUP); D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): pass\n")); jffs2_garbage_collect_pass(c); ===== include/linux/sched.h 1.168 vs edited ===== --- 1.168/include/linux/sched.h Thu Oct 2 08:12:14 2003 +++ edited/include/linux/sched.h Sat Oct 4 12:23:15 2003 @@ -577,6 +577,19 @@ extern void flush_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) +{ + unsigned long flags; + int ret; + + spin_lock_irqsave(&tsk->sighand->siglock, flags); + ret = dequeue_signal(tsk, mask, info); + spin_unlock_irqrestore(&tsk->sighand->siglock, flags); + + return ret; +} + extern void block_all_signals(int (*notifier)(void *priv), void *priv, sigset_t *mask); extern void unblock_all_signals(void); @@ -674,6 +687,7 @@ extern void reparent_to_init(void); extern void daemonize(const char *, ...); extern int allow_signal(int); +extern int disallow_signal(int); extern task_t *child_reaper; extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *); ===== kernel/exit.c 1.113 vs edited ===== --- 1.113/kernel/exit.c Sun Sep 21 22:49:52 2003 +++ edited/kernel/exit.c Sat Oct 4 12:11:54 2003 @@ -278,7 +278,20 @@ return 0; } +int disallow_signal(int sig) +{ + if (sig < 1 || sig > _NSIG) + return -EINVAL; + + spin_lock_irq(¤t->sighand->siglock); + sigaddset(¤t->blocked, sig); + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); + return 0; +} + EXPORT_SYMBOL(allow_signal); +EXPORT_SYMBOL(disallow_signal); /* * Put all the gunge required to become a kernel thread without -- dwmw2
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |