diff options
Diffstat (limited to 'kernel/signal.c')
-rw-r--r-- | kernel/signal.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/kernel/signal.c b/kernel/signal.c index 6904bbbfe116..8d6e64dfa5c6 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -277,7 +277,6 @@ static struct sigqueue *__sigqueue_alloc(struct task_struct *t, gfp_t flags, | |||
277 | } else { | 277 | } else { |
278 | INIT_LIST_HEAD(&q->list); | 278 | INIT_LIST_HEAD(&q->list); |
279 | q->flags = 0; | 279 | q->flags = 0; |
280 | q->lock = NULL; | ||
281 | q->user = get_uid(t->user); | 280 | q->user = get_uid(t->user); |
282 | } | 281 | } |
283 | return(q); | 282 | return(q); |
@@ -1371,11 +1370,12 @@ void sigqueue_free(struct sigqueue *q) | |||
1371 | * pending queue. | 1370 | * pending queue. |
1372 | */ | 1371 | */ |
1373 | if (unlikely(!list_empty(&q->list))) { | 1372 | if (unlikely(!list_empty(&q->list))) { |
1374 | read_lock(&tasklist_lock); | 1373 | spinlock_t *lock = ¤t->sighand->siglock; |
1375 | spin_lock_irqsave(q->lock, flags); | 1374 | read_lock(&tasklist_lock); |
1375 | spin_lock_irqsave(lock, flags); | ||
1376 | if (!list_empty(&q->list)) | 1376 | if (!list_empty(&q->list)) |
1377 | list_del_init(&q->list); | 1377 | list_del_init(&q->list); |
1378 | spin_unlock_irqrestore(q->lock, flags); | 1378 | spin_unlock_irqrestore(lock, flags); |
1379 | read_unlock(&tasklist_lock); | 1379 | read_unlock(&tasklist_lock); |
1380 | } | 1380 | } |
1381 | q->flags &= ~SIGQUEUE_PREALLOC; | 1381 | q->flags &= ~SIGQUEUE_PREALLOC; |
@@ -1414,7 +1414,6 @@ send_sigqueue(int sig, struct sigqueue *q, struct task_struct *p) | |||
1414 | goto out; | 1414 | goto out; |
1415 | } | 1415 | } |
1416 | 1416 | ||
1417 | q->lock = &p->sighand->siglock; | ||
1418 | list_add_tail(&q->list, &p->pending.list); | 1417 | list_add_tail(&q->list, &p->pending.list); |
1419 | sigaddset(&p->pending.signal, sig); | 1418 | sigaddset(&p->pending.signal, sig); |
1420 | if (!sigismember(&p->blocked, sig)) | 1419 | if (!sigismember(&p->blocked, sig)) |
@@ -1462,7 +1461,6 @@ send_group_sigqueue(int sig, struct sigqueue *q, struct task_struct *p) | |||
1462 | * We always use the shared queue for process-wide signals, | 1461 | * We always use the shared queue for process-wide signals, |
1463 | * to avoid several races. | 1462 | * to avoid several races. |
1464 | */ | 1463 | */ |
1465 | q->lock = &p->sighand->siglock; | ||
1466 | list_add_tail(&q->list, &p->signal->shared_pending.list); | 1464 | list_add_tail(&q->list, &p->signal->shared_pending.list); |
1467 | sigaddset(&p->signal->shared_pending.signal, sig); | 1465 | sigaddset(&p->signal->shared_pending.signal, sig); |
1468 | 1466 | ||