linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / kernel / itimer.c
index 204ed79..379be2f 100644 (file)
@@ -128,75 +128,21 @@ asmlinkage long sys_getitimer(int which, struct itimerval __user *value)
 /*
  * The timer is automagically restarted, when interval != 0
  */
-int it_real_fn(struct hrtimer *timer)
+int it_real_fn(void *data)
 {
-       struct signal_struct *sig =
-           container_of(timer, struct signal_struct, real_timer);
+       struct task_struct *tsk = (struct task_struct *) data;
 
-       send_group_sig_info(SIGALRM, SEND_SIG_PRIV, sig->tsk);
+       send_group_sig_info(SIGALRM, SEND_SIG_PRIV, tsk);
+
+       if (tsk->signal->it_real_incr.tv64 != 0) {
+               hrtimer_forward(&tsk->signal->real_timer,
+                              tsk->signal->it_real_incr);
 
-       if (sig->it_real_incr.tv64 != 0) {
-               hrtimer_forward(timer, timer->base->softirq_time,
-                               sig->it_real_incr);
                return HRTIMER_RESTART;
        }
        return HRTIMER_NORESTART;
 }
 
-/*
- * We do not care about correctness. We just sanitize the values so
- * the ktime_t operations which expect normalized values do not
- * break. This converts negative values to long timeouts similar to
- * the code in kernel versions < 2.6.16
- *
- * Print a limited number of warning messages when an invalid timeval
- * is detected.
- */
-static void fixup_timeval(struct timeval *tv, int interval)
-{
-       static int warnlimit = 10;
-       unsigned long tmp;
-
-       if (warnlimit > 0) {
-               warnlimit--;
-               printk(KERN_WARNING
-                      "setitimer: %s (pid = %d) provided "
-                      "invalid timeval %s: tv_sec = %ld tv_usec = %ld\n",
-                      current->comm, current->pid,
-                      interval ? "it_interval" : "it_value",
-                      tv->tv_sec, (long) tv->tv_usec);
-       }
-
-       tmp = tv->tv_usec;
-       if (tmp >= USEC_PER_SEC) {
-               tv->tv_usec = tmp % USEC_PER_SEC;
-               tv->tv_sec += tmp / USEC_PER_SEC;
-       }
-
-       tmp = tv->tv_sec;
-       if (tmp > LONG_MAX)
-               tv->tv_sec = LONG_MAX;
-}
-
-/*
- * Returns true if the timeval is in canonical form
- */
-#define timeval_valid(t) \
-       (((t)->tv_sec >= 0) && (((unsigned long) (t)->tv_usec) < USEC_PER_SEC))
-
-/*
- * Check for invalid timevals, sanitize them and print a limited
- * number of warnings.
- */
-static void check_itimerval(struct itimerval *value) {
-
-       if (unlikely(!timeval_valid(&value->it_value)))
-               fixup_timeval(&value->it_value, 0);
-
-       if (unlikely(!timeval_valid(&value->it_interval)))
-               fixup_timeval(&value->it_interval, 1);
-}
-
 int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
 {
        struct task_struct *tsk = current;
@@ -204,18 +150,6 @@ int do_setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
        ktime_t expires;
        cputime_t cval, cinterval, nval, ninterval;
 
-       /*
-        * Validate the timevals in value.
-        *
-        * Note: Although the spec requires that invalid values shall
-        * return -EINVAL, we just fixup the value and print a limited
-        * number of warnings in order not to break users of this
-        * historical misfeature.
-        *
-        * Scheduled for replacement in March 2007
-        */
-       check_itimerval(value);
-
        switch (which) {
        case ITIMER_REAL:
 again:
@@ -292,43 +226,6 @@ again:
        return 0;
 }
 
-/**
- * alarm_setitimer - set alarm in seconds
- *
- * @seconds:   number of seconds until alarm
- *             0 disables the alarm
- *
- * Returns the remaining time in seconds of a pending timer or 0 when
- * the timer is not active.
- *
- * On 32 bit machines the seconds value is limited to (INT_MAX/2) to avoid
- * negative timeval settings which would cause immediate expiry.
- */
-unsigned int alarm_setitimer(unsigned int seconds)
-{
-       struct itimerval it_new, it_old;
-
-#if BITS_PER_LONG < 64
-       if (seconds > INT_MAX)
-               seconds = INT_MAX;
-#endif
-       it_new.it_value.tv_sec = seconds;
-       it_new.it_value.tv_usec = 0;
-       it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
-
-       do_setitimer(ITIMER_REAL, &it_new, &it_old);
-
-       /*
-        * We can't return 0 if we have an alarm pending ...  And we'd
-        * better return too much than too little anyway
-        */
-       if ((!it_old.it_value.tv_sec && it_old.it_value.tv_usec) ||
-             it_old.it_value.tv_usec >= 500000)
-               it_old.it_value.tv_sec++;
-
-       return it_old.it_value.tv_sec;
-}
-
 asmlinkage long sys_setitimer(int which,
                              struct itimerval __user *value,
                              struct itimerval __user *ovalue)