|
@@ -967,6 +967,7 @@ static void check_thread_timers(struct task_struct *tsk,
|
|
|
{
|
|
|
int maxfire;
|
|
|
struct list_head *timers = tsk->cpu_timers;
|
|
|
+ struct signal_struct *const sig = tsk->signal;
|
|
|
|
|
|
maxfire = 20;
|
|
|
tsk->it_prof_expires = cputime_zero;
|
|
@@ -1011,6 +1012,34 @@ static void check_thread_timers(struct task_struct *tsk,
|
|
|
t->firing = 1;
|
|
|
list_move_tail(&t->entry, firing);
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Check for the special case thread timers.
|
|
|
+ */
|
|
|
+ if (sig->rlim[RLIMIT_RTTIME].rlim_cur != RLIM_INFINITY) {
|
|
|
+ unsigned long hard = sig->rlim[RLIMIT_RTTIME].rlim_max;
|
|
|
+ unsigned long *soft = &sig->rlim[RLIMIT_RTTIME].rlim_cur;
|
|
|
+
|
|
|
+ if (tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) {
|
|
|
+ /*
|
|
|
+ * At the hard limit, we just die.
|
|
|
+ * No need to calculate anything else now.
|
|
|
+ */
|
|
|
+ __group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (tsk->rt.timeout > DIV_ROUND_UP(*soft, USEC_PER_SEC/HZ)) {
|
|
|
+ /*
|
|
|
+ * At the soft limit, send a SIGXCPU every second.
|
|
|
+ */
|
|
|
+ if (sig->rlim[RLIMIT_RTTIME].rlim_cur
|
|
|
+ < sig->rlim[RLIMIT_RTTIME].rlim_max) {
|
|
|
+ sig->rlim[RLIMIT_RTTIME].rlim_cur +=
|
|
|
+ USEC_PER_SEC;
|
|
|
+ }
|
|
|
+ __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|