lkml.org 
[lkml]   [2004]   [Oct]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] make __sigqueue_alloc() a general helper
Posix timers preallocate siqueue structures during timer creation
and keep them for reuse. This allocation happens in user context
with no locks held, however it's designated as an atomic allocation.
Loosen this restriction, and while we're at it let's do a bit of code
consolidation so signal sending uses same __sigqueue_alloc() helper.

Signed-off-by: Chris Wright <chrisw@osdl.org>

kernel/signal.c | 20 +++++++-------------
1 files changed, 7 insertions(+), 13 deletions(-)

===== kernel/signal.c 1.139 vs edited =====
--- 1.139/kernel/signal.c 2004-10-19 21:12:13 -07:00
+++ edited/kernel/signal.c 2004-10-21 13:46:54 -07:00
@@ -265,18 +265,18 @@
return sig;
}

-static struct sigqueue *__sigqueue_alloc(void)
+static inline struct sigqueue *__sigqueue_alloc(struct task_struct *t, int flags)
{
struct sigqueue *q = NULL;

- if (atomic_read(&current->user->sigpending) <
- current->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
- q = kmem_cache_alloc(sigqueue_cachep, GFP_ATOMIC);
+ if (atomic_read(&t->user->sigpending) <
+ t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
+ q = kmem_cache_alloc(sigqueue_cachep, flags);
if (q) {
INIT_LIST_HEAD(&q->list);
q->flags = 0;
q->lock = NULL;
- q->user = get_uid(current->user);
+ q->user = get_uid(t->user);
atomic_inc(&q->user->sigpending);
}
return(q);
@@ -764,14 +764,8 @@
make sure at least one signal gets delivered and don't
pass on the info struct. */

- if (atomic_read(&t->user->sigpending) <
- t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur)
- q = kmem_cache_alloc(sigqueue_cachep, GFP_ATOMIC);
-
+ q = __sigqueue_alloc(t, GFP_ATOMIC);
if (q) {
- q->flags = 0;
- q->user = get_uid(t->user);
- atomic_inc(&q->user->sigpending);
list_add_tail(&q->list, &signals->list);
switch ((unsigned long) info) {
case 0:
@@ -1298,7 +1292,7 @@
{
struct sigqueue *q;

- if ((q = __sigqueue_alloc()))
+ if ((q = __sigqueue_alloc(current, GFP_KERNEL)))
q->flags |= SIGQUEUE_PREALLOC;
return(q);
}
-
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/
\
 
 \ /
  Last update: 2005-03-22 14:07    [W:0.035 / U:0.524 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site