Messages in this thread Patch in this message | | | Date | Fri, 23 Oct 2009 19:07:06 +0900 | From | Naohiro Ooiwa <> | Subject | [PATCH] show message when exceeded rlimit of pending signals |
| |
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
| |