* [PATCH] make __sigqueue_alloc() a general helper
@ 2004-10-21 21:54 Chris Wright
0 siblings, 0 replies; only message in thread
From: Chris Wright @ 2004-10-21 21:54 UTC (permalink / raw)
To: akpm, torvalds; +Cc: jim.houston, linux-kernel
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(¤t->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);
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2004-10-21 22:18 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-10-21 21:54 [PATCH] make __sigqueue_alloc() a general helper Chris Wright
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®