From: Roland McGrath <roland@redhat.com>

While looking into the issues Jeremy had with the RLIMIT_SIGPENDING limit,
it occurred to me that the normal setting of this limit is bizarrely low. 
The initial hard limit setting (MAX_SIGPENDING) was taken from the old
max_queued_signals parameter, which was for the entire system in aggregate.

But even as a per-user limit, the 1024 value is incongruously low for this.
 On my machine, RLIMIT_NPROC allows me 8192 processes, but only 1024 queued
signals, i.e.  fewer even than one pending signal in each process.  (To me,
this really puts in doubt the sensibility of using a per-user limit for
this rather than a per-process one, i.e.  counted in sighand_struct or
signal_struct, which could have a much smaller reasonable value.  I don't
recall the rationale for making this new limit per-user in the first
place.)

This patch sets the default RLIMIT_SIGPENDING limit at boot time, using the
calculation that decides the default RLIMIT_NPROC limit.  This uses the
same value for those two limits, which I think is still pretty conservative
on the RLIMIT_SIGPENDING value.

Signed-off-by: Roland McGrath <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/include/asm-generic/resource.h |    2 +-
 25-akpm/include/linux/signal.h         |    2 --
 25-akpm/kernel/fork.c                  |    2 ++
 3 files changed, 3 insertions(+), 3 deletions(-)

diff -puN include/asm-generic/resource.h~set-rlimit_sigpending-limit-based-on-rlimit_nproc include/asm-generic/resource.h
--- 25/include/asm-generic/resource.h~set-rlimit_sigpending-limit-based-on-rlimit_nproc	2005-02-24 19:47:33.000000000 -0800
+++ 25-akpm/include/asm-generic/resource.h	2005-02-24 19:47:33.000000000 -0800
@@ -79,7 +79,7 @@
 	[RLIMIT_MEMLOCK]	= {    MLOCK_LIMIT,    MLOCK_LIMIT },	\
 	[RLIMIT_AS]		= {  RLIM_INFINITY,  RLIM_INFINITY },	\
 	[RLIMIT_LOCKS]		= {  RLIM_INFINITY,  RLIM_INFINITY },	\
-	[RLIMIT_SIGPENDING]	= { MAX_SIGPENDING, MAX_SIGPENDING },	\
+	[RLIMIT_SIGPENDING]	= { 		0,	       0 },	\
 	[RLIMIT_MSGQUEUE]	= {   MQ_BYTES_MAX,   MQ_BYTES_MAX },	\
 }
 
diff -puN include/linux/signal.h~set-rlimit_sigpending-limit-based-on-rlimit_nproc include/linux/signal.h
--- 25/include/linux/signal.h~set-rlimit_sigpending-limit-based-on-rlimit_nproc	2005-02-24 19:47:33.000000000 -0800
+++ 25-akpm/include/linux/signal.h	2005-02-24 19:47:33.000000000 -0800
@@ -8,8 +8,6 @@
 
 #ifdef __KERNEL__
 
-#define MAX_SIGPENDING	1024
-
 /*
  * Real Time signals may be queued.
  */
diff -puN kernel/fork.c~set-rlimit_sigpending-limit-based-on-rlimit_nproc kernel/fork.c
--- 25/kernel/fork.c~set-rlimit_sigpending-limit-based-on-rlimit_nproc	2005-02-24 19:47:33.000000000 -0800
+++ 25-akpm/kernel/fork.c	2005-02-24 19:47:33.000000000 -0800
@@ -129,6 +129,8 @@ void __init fork_init(unsigned long memp
 
 	init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
 	init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
+	init_task.signal->rlim[RLIMIT_SIGPENDING] =
+		init_task.signal->rlim[RLIMIT_NPROC];
 }
 
 static struct task_struct *dup_task_struct(struct task_struct *orig)
_