public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] show message when exceeded rlimit of pending signals
@ 2009-10-23 10:07 Naohiro Ooiwa
  2009-10-23 11:46 ` Ingo Molnar
  2009-10-23 21:07 ` Roland McGrath
  0 siblings, 2 replies; 22+ messages in thread
From: Naohiro Ooiwa @ 2009-10-23 10:07 UTC (permalink / raw)
  To: akpm, oleg, roland; +Cc: LKML, h-shimamoto

Hi Andrew,

I was glad to talk to you in Japan Linux Symposium.
I'm writing about it.


I'm working to support kernel.
Recently, I got a inquiry about unexpected system behavior.
I analyzed application of our customer includeing kernel.

Eventually, there was no bug in application or kernel.
I found the cause was the limit of pending signals.
I ran following command. and system behaved expectedly.
   # ulimit -i unlimited

When system behaved unexpectedly, the timer_create() in application
had returned -EAGAIN value.
But we can't imagine the -EAGAIN means that it exceeded limit of
pending signals at all.

Then I thought kernel should at least show some message about it.
And I tried to create a patch.

I'm sure that system engineeres will not have to have the same experience as I did.
How do you think about this idea ?

Thank you
Naohiro Ooiwa.

Signed-off-by: Naohiro Ooiwa <nooiwa@miraclelinux.com>
---
 kernel/signal.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/kernel/signal.c b/kernel/signal.c
index 6705320..0bc4934 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -188,6 +188,9 @@ int next_signal(struct sigpending *pending, sigset_t *mask)
 	return sig;
 }

+#define MAX_RLIMIT_CAUTION 5
+static int rlimit_caution_count = 0;
+
 /*
  * allocate a new signal queue record
  * - this may be called without locks if and only if t == current, otherwise an
@@ -211,6 +214,16 @@ static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags,
 	    atomic_read(&user->sigpending) <=
 			t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
 		q = kmem_cache_alloc(sigqueue_cachep, flags);
+	else {
+		if (rlimit_caution_count <= MAX_RLIMIT_CAUTION ){
+			printk(KERN_WARNING "reached the limit of pending signalis on pid %d\n", current->pid);
+			/* Last time, show the advice */
+			if (rlimit_caution_count == MAX_RLIMIT_CAUTION)
+				printk(KERN_WARNING "If unexpected your system behavior, you can try ulimit -i unlimited\n");
+			rlimit_caution_count++;
+		}
+	}
+
 	if (unlikely(q == NULL)) {
 		atomic_dec(&user->sigpending);
 		free_uid(user);
-- 
1.5.4.1


^ permalink raw reply related	[flat|nested] 22+ messages in thread
* [PATCH] show message when exceeded rlimit of pending signals
@ 2009-10-30 11:36 Naohiro Ooiwa
  2009-10-30 21:33 ` Andrew Morton
  0 siblings, 1 reply; 22+ messages in thread
From: Naohiro Ooiwa @ 2009-10-30 11:36 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Hiroshi Shimamoto, roland, Peter Zijlstra, Thomas Gleixner, LKML,
	oleg, akpm

Hi Ingo,

I wrote proper changelog entry.
And I resent the patch. I added KERN_INFO to printk.



When the system has too many timers or too many aggregate
queued signals, the EAGAIN error is returned to application
from kernel, including timer_create().
It means that exceeded limit of pending signals at all.
But we can't imagine it.

This patch show the message when reached limit of pending signals.
If you see this message and your system behaved unexpectedly,
you can run following command.
   # ulimit -i unlimited

With help from Hiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>.

Signed-off-by: Naohiro Ooiwa <nooiwa@miraclelinux.com>
Acked-by: Ingo Molnar <mingo@elte.hu>
---
 Documentation/kernel-parameters.txt |   11 +++++++++--
 kernel/signal.c                     |   20 ++++++++++++++++----
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 9107b38..3bbd92f 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2032,8 +2032,15 @@ and is between 256 and 4096 characters. It is defined in the file

 	print-fatal-signals=
 			[KNL] debug: print fatal signals
-			print-fatal-signals=1: print segfault info to
-			the kernel console.
+
+			If enabled, warn about various signal handling
+			related application anomalies: too many signals,
+			too many POSIX.1 timers, fatal signals causing a
+			coredump - etc.
+
+			If you hit the warning due to signal overflow,
+			you might want to try "ulimit -i unlimited".
+
 			default: off.

 	printk.time=	Show timing data prefixed to each printk message line
diff --git a/kernel/signal.c b/kernel/signal.c
index 6705320..50e10dc 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -41,6 +41,8 @@

 static struct kmem_cache *sigqueue_cachep;

+int print_fatal_signals __read_mostly;
+
 static void __user *sig_handler(struct task_struct *t, int sig)
 {
 	return t->sighand->action[sig - 1].sa.sa_handler;
@@ -188,6 +190,14 @@ int next_signal(struct sigpending *pending, sigset_t *mask)
 	return sig;
 }

+static void show_reach_rlimit_sigpending(void)
+{
+	if (!printk_ratelimit())
+		return;
+	printk(KERN_INFO "%s/%d: reached the limit of pending signals.\n",
+				current->comm, current->pid);
+}
+
 /*
  * allocate a new signal queue record
  * - this may be called without locks if and only if t == current, otherwise an
@@ -209,8 +219,12 @@ static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags,
 	atomic_inc(&user->sigpending);
 	if (override_rlimit ||
 	    atomic_read(&user->sigpending) <=
-			t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
+			t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur) {
 		q = kmem_cache_alloc(sigqueue_cachep, flags);
+	} else {
+		if (print_fatal_signals)
+			show_reach_rlimit_sigpending();
+	}
 	if (unlikely(q == NULL)) {
 		atomic_dec(&user->sigpending);
 		free_uid(user);
@@ -925,11 +939,9 @@ static int send_signal(int sig, struct siginfo *info, struct task_struct *t,
 	return __send_signal(sig, info, t, group, from_ancestor_ns);
 }

-int print_fatal_signals;
-
 static void print_fatal_signal(struct pt_regs *regs, int signr)
 {
-	printk("%s/%d: potentially unexpected fatal signal %d.\n",
+	printk(KERN_INFO "%s/%d: potentially unexpected fatal signal %d.\n",
 		current->comm, task_pid_nr(current), signr);

 #if defined(__i386__) && !defined(__arch_um__)

^ permalink raw reply related	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2009-10-31 11:05 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-23 10:07 [PATCH] show message when exceeded rlimit of pending signals Naohiro Ooiwa
2009-10-23 11:46 ` Ingo Molnar
2009-10-24  7:02   ` Naohiro Ooiwa
2009-10-24  8:56     ` Naohiro Ooiwa
2009-10-24  8:58       ` Ingo Molnar
2009-10-26 10:17         ` nooiwa
2009-10-26 11:38           ` Ingo Molnar
2009-10-26 16:37             ` Roland McGrath
2009-10-26 16:39             ` Naohiro Ooiwa
2009-10-26 20:28               ` Ingo Molnar
2009-10-27  2:58                 ` Naohiro Ooiwa
2009-10-27  4:36                   ` Hiroshi Shimamoto
2009-10-27  8:27                     ` nooiwa
2009-10-23 21:07 ` Roland McGrath
2009-10-24  8:27   ` Naohiro Ooiwa
  -- strict thread matches above, loose matches on Subject: below --
2009-10-30 11:36 Naohiro Ooiwa
2009-10-30 21:33 ` Andrew Morton
2009-10-30 21:45   ` Joe Perches
2009-10-31  7:58   ` Naohiro Ooiwa
2009-10-31  8:50     ` Naohiro Ooiwa
2009-10-31  8:57       ` Andrew Morton
2009-10-31 11:05         ` Naohiro Ooiwa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox