diff options
Diffstat (limited to 'kernel/posix-cpu-timers.c')
-rw-r--r-- | kernel/posix-cpu-timers.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 68c96376e84a..2c076b36c4f6 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c | |||
@@ -967,6 +967,7 @@ static void check_thread_timers(struct task_struct *tsk, | |||
967 | { | 967 | { |
968 | int maxfire; | 968 | int maxfire; |
969 | struct list_head *timers = tsk->cpu_timers; | 969 | struct list_head *timers = tsk->cpu_timers; |
970 | struct signal_struct *const sig = tsk->signal; | ||
970 | 971 | ||
971 | maxfire = 20; | 972 | maxfire = 20; |
972 | tsk->it_prof_expires = cputime_zero; | 973 | tsk->it_prof_expires = cputime_zero; |
@@ -1011,6 +1012,34 @@ static void check_thread_timers(struct task_struct *tsk, | |||
1011 | t->firing = 1; | 1012 | t->firing = 1; |
1012 | list_move_tail(&t->entry, firing); | 1013 | list_move_tail(&t->entry, firing); |
1013 | } | 1014 | } |
1015 | |||
1016 | /* | ||
1017 | * Check for the special case thread timers. | ||
1018 | */ | ||
1019 | if (sig->rlim[RLIMIT_RTTIME].rlim_cur != RLIM_INFINITY) { | ||
1020 | unsigned long hard = sig->rlim[RLIMIT_RTTIME].rlim_max; | ||
1021 | unsigned long *soft = &sig->rlim[RLIMIT_RTTIME].rlim_cur; | ||
1022 | |||
1023 | if (tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) { | ||
1024 | /* | ||
1025 | * At the hard limit, we just die. | ||
1026 | * No need to calculate anything else now. | ||
1027 | */ | ||
1028 | __group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk); | ||
1029 | return; | ||
1030 | } | ||
1031 | if (tsk->rt.timeout > DIV_ROUND_UP(*soft, USEC_PER_SEC/HZ)) { | ||
1032 | /* | ||
1033 | * At the soft limit, send a SIGXCPU every second. | ||
1034 | */ | ||
1035 | if (sig->rlim[RLIMIT_RTTIME].rlim_cur | ||
1036 | < sig->rlim[RLIMIT_RTTIME].rlim_max) { | ||
1037 | sig->rlim[RLIMIT_RTTIME].rlim_cur += | ||
1038 | USEC_PER_SEC; | ||
1039 | } | ||
1040 | __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk); | ||
1041 | } | ||
1042 | } | ||
1014 | } | 1043 | } |
1015 | 1044 | ||
1016 | /* | 1045 | /* |