git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'stable-3.2' into pandora-3.2
[pandora-kernel.git]
/
kernel
/
signal.c
diff --git
a/kernel/signal.c
b/kernel/signal.c
index
6c4cc94
..
82a3d92
100644
(file)
--- a/
kernel/signal.c
+++ b/
kernel/signal.c
@@
-535,7
+535,8
@@
unblock_all_signals(void)
spin_unlock_irqrestore(¤t->sighand->siglock, flags);
}
spin_unlock_irqrestore(¤t->sighand->siglock, flags);
}
-static void collect_signal(int sig, struct sigpending *list, siginfo_t *info)
+static void collect_signal(int sig, struct sigpending *list, siginfo_t *info,
+ bool *resched_timer)
{
struct sigqueue *q, *first = NULL;
{
struct sigqueue *q, *first = NULL;
@@
-557,6
+558,12
@@
static void collect_signal(int sig, struct sigpending *list, siginfo_t *info)
still_pending:
list_del_init(&first->list);
copy_siginfo(info, &first->info);
still_pending:
list_del_init(&first->list);
copy_siginfo(info, &first->info);
+
+ *resched_timer =
+ (first->flags & SIGQUEUE_PREALLOC) &&
+ (info->si_code == SI_TIMER) &&
+ (info->si_sys_private);
+
__sigqueue_free(first);
} else {
/*
__sigqueue_free(first);
} else {
/*
@@
-573,7
+580,7
@@
still_pending:
}
static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
}
static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
- siginfo_t *info)
+ siginfo_t *info
, bool *resched_timer
)
{
int sig = next_signal(pending, mask);
{
int sig = next_signal(pending, mask);
@@
-587,7
+594,7
@@
static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
}
}
}
}
- collect_signal(sig, pending, info);
+ collect_signal(sig, pending, info
, resched_timer
);
}
return sig;
}
return sig;
@@
-601,15
+608,16
@@
static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
*/
int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
{
*/
int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
{
+ bool resched_timer = false;
int signr;
/* We only dequeue private signals from ourselves, we don't let
* signalfd steal them
*/
int signr;
/* We only dequeue private signals from ourselves, we don't let
* signalfd steal them
*/
- signr = __dequeue_signal(&tsk->pending, mask, info);
+ signr = __dequeue_signal(&tsk->pending, mask, info
, &resched_timer
);
if (!signr) {
signr = __dequeue_signal(&tsk->signal->shared_pending,
if (!signr) {
signr = __dequeue_signal(&tsk->signal->shared_pending,
- mask, info);
+ mask, info
, &resched_timer
);
/*
* itimer signal ?
*
/*
* itimer signal ?
*
@@
-654,7
+662,7
@@
int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
*/
current->jobctl |= JOBCTL_STOP_DEQUEUED;
}
*/
current->jobctl |= JOBCTL_STOP_DEQUEUED;
}
- if (
(info->si_code & __SI_MASK) == __SI_TIMER && info->si_sys_private
) {
+ if (
resched_timer
) {
/*
* Release the siglock to ensure proper locking order
* of timer locks outside of siglocks. Note, we leave
/*
* Release the siglock to ensure proper locking order
* of timer locks outside of siglocks. Note, we leave