While looking at code that holds current->sigmask_lock, I found a few
places that need calls to recalc_sigpending() in the MIPS and
SPARC{32,64} ports. The patch below adds them; it applies to both
2.2.15pre2 and 2.3.39.
MIPS and SPARC maintainers: Could you fold the relevant chunks of this
patch into your trees.
Alan: There is a less significant chunk at the end which fixes a minor
race in the saa5249 driver, which names you as one of the
authors. Could you add it into 2.2.x, and feed it to Linus for 2.3.x.
Thanks,
David Wragg
diff -rua linux-2.3.29/arch/mips/kernel/irixsig.c
linux-2.3.29.mod/arch/mips/kernel/irixsig.c
--- linux-2.3.29/arch/mips/kernel/irixsig.c Thu Aug 19 19:28:02 1999
+++ linux-2.3.29.mod/arch/mips/kernel/irixsig.c Tue Nov 30 01:12:53 1999
@@ -512,6 +512,7 @@
spin_lock_irq(¤t->sigmask_lock);
saveset = current->blocked;
current->blocked = newset;
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
regs->regs[2] = -EINTR;
diff -rua linux-2.3.29/arch/mips/kernel/signal.c
linux-2.3.29.mod/arch/mips/kernel/signal.c
--- linux-2.3.29/arch/mips/kernel/signal.c Thu Nov 25 21:55:22 1999
+++ linux-2.3.29.mod/arch/mips/kernel/signal.c Tue Nov 30 01:22:08 1999
@@ -52,6 +52,7 @@
spin_lock_irq(¤t->sigmask_lock);
saveset = current->blocked;
current->blocked = newset;
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
regs.regs[2] = EINTR;
@@ -78,6 +79,7 @@
spin_lock_irq(¤t->sigmask_lock);
saveset = current->blocked;
current->blocked = newset;
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
regs.regs[2] = EINTR;
diff -rua linux-2.3.29/arch/sparc/kernel/sys_sunos.c
linux-2.3.29.mod/arch/sparc/kernel/sys_sunos.c
--- linux-2.3.29/arch/sparc/kernel/sys_sunos.c Mon Sep 13 20:02:35 1999
+++ linux-2.3.29.mod/arch/sparc/kernel/sys_sunos.c Tue Nov 30 01:09:15 1999
@@ -366,6 +366,7 @@
spin_lock_irq(¤t->sigmask_lock);
old = current->blocked.sig[0];
current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
return old;
}
@@ -377,6 +378,7 @@
spin_lock_irq(¤t->sigmask_lock);
retval = current->blocked.sig[0];
current->blocked.sig[0] = (newmask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
return retval;
}
diff -rua linux-2.3.29/arch/sparc64/kernel/sys_sunos32.c
linux-2.3.29.mod/arch/sparc64/kernel/sys_sunos32.c
--- linux-2.3.29/arch/sparc64/kernel/sys_sunos32.c Mon Sep 13 20:02:36 1999
+++ linux-2.3.29.mod/arch/sparc64/kernel/sys_sunos32.c Tue Nov 30 01:05:37 1999
@@ -323,6 +323,7 @@
spin_lock_irq(¤t->sigmask_lock);
old = (u32) current->blocked.sig[0];
current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
return old;
}
@@ -334,6 +335,7 @@
spin_lock_irq(¤t->sigmask_lock);
retval = (u32) current->blocked.sig[0];
current->blocked.sig[0] = (newmask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
return retval;
}
diff -rua linux-2.3.29/drivers/char/saa5249.c linux-2.3.29.mod/drivers/char/saa5249.c
--- linux-2.3.29/drivers/char/saa5249.c Sun Nov 7 16:24:53 1999
+++ linux-2.3.29.mod/drivers/char/saa5249.c Tue Nov 30 00:50:01 1999
@@ -236,9 +236,10 @@
static void jdelay(unsigned long delay)
{
- sigset_t oldblocked = current->blocked;
+ sigset_t oldblocked;
spin_lock_irq(¤t->sigmask_lock);
+ oldblocked = current->blocked;
sigfillset(¤t->blocked);
recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
-
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of the message to [EMAIL PROTECTED]