|
@@ -832,6 +832,7 @@ static int __send_signal(int sig, struct siginfo *info, struct task_struct *t,
|
|
|
{
|
|
|
struct sigpending *pending;
|
|
|
struct sigqueue *q;
|
|
|
+ int override_rlimit;
|
|
|
|
|
|
trace_sched_signal_send(sig, t);
|
|
|
|
|
@@ -863,9 +864,13 @@ static int __send_signal(int sig, struct siginfo *info, struct task_struct *t,
|
|
|
make sure at least one signal gets delivered and don't
|
|
|
pass on the info struct. */
|
|
|
|
|
|
- q = __sigqueue_alloc(t, GFP_ATOMIC, (sig < SIGRTMIN &&
|
|
|
- (is_si_special(info) ||
|
|
|
- info->si_code >= 0)));
|
|
|
+ if (sig < SIGRTMIN)
|
|
|
+ override_rlimit = (is_si_special(info) || info->si_code >= 0);
|
|
|
+ else
|
|
|
+ override_rlimit = 0;
|
|
|
+
|
|
|
+ q = __sigqueue_alloc(t, GFP_ATOMIC | __GFP_NOTRACK_FALSE_POSITIVE,
|
|
|
+ override_rlimit);
|
|
|
if (q) {
|
|
|
list_add_tail(&q->list, &pending->list);
|
|
|
switch ((unsigned long) info) {
|