alarmtimer: Do not signal SIGEV_NONE timers
[pandora-kernel.git] / kernel / time / timekeeping.c
index 36440c8..068c092 100644 (file)
@@ -382,7 +382,7 @@ int do_settimeofday(const struct timespec *tv)
        struct timespec ts_delta;
        unsigned long flags;
 
-       if (!timespec_valid(tv))
+       if (!timespec_valid_strict(tv))
                return -EINVAL;
 
        write_seqlock_irqsave(&xtime_lock, flags);
@@ -428,7 +428,7 @@ int timekeeping_inject_offset(struct timespec *ts)
        timekeeping_forward_now();
 
        tmp = timespec_add(xtime,  *ts);
-       if (!timespec_valid(&tmp)) {
+       if (!timespec_valid_strict(&tmp)) {
                ret = -EINVAL;
                goto error;
        }
@@ -591,7 +591,7 @@ void __init timekeeping_init(void)
        struct timespec now, boot;
 
        read_persistent_clock(&now);
-       if (!timespec_valid(&now)) {
+       if (!timespec_valid_strict(&now)) {
                pr_warn("WARNING: Persistent clock returned invalid value!\n"
                        "         Check your CMOS/BIOS settings.\n");
                now.tv_sec = 0;
@@ -599,7 +599,7 @@ void __init timekeeping_init(void)
        }
 
        read_boot_clock(&boot);
-       if (!timespec_valid(&boot)) {
+       if (!timespec_valid_strict(&boot)) {
                pr_warn("WARNING: Boot clock returned invalid value!\n"
                        "         Check your CMOS/BIOS settings.\n");
                boot.tv_sec = 0;
@@ -649,7 +649,7 @@ static void update_sleep_time(struct timespec t)
  */
 static void __timekeeping_inject_sleeptime(struct timespec *delta)
 {
-       if (!timespec_valid(delta)) {
+       if (!timespec_valid_strict(delta)) {
                printk(KERN_WARNING "__timekeeping_inject_sleeptime: Invalid "
                                        "sleep delta value!\n");
                return;
@@ -992,7 +992,7 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int shift)
        }
 
        /* Accumulate raw time */
-       raw_nsecs = timekeeper.raw_interval << shift;
+       raw_nsecs = (u64)timekeeper.raw_interval << shift;
        raw_nsecs += raw_time.tv_nsec;
        if (raw_nsecs >= NSEC_PER_SEC) {
                u64 raw_secs = raw_nsecs;
@@ -1033,6 +1033,10 @@ static void update_wall_time(void)
 #else
        offset = (clock->read(clock) - clock->cycle_last) & clock->mask;
 #endif
+       /* Check if there's really nothing to do */
+       if (offset < timekeeper.cycle_interval)
+               return;
+
        timekeeper.xtime_nsec = (s64)xtime.tv_nsec << timekeeper.shift;
 
        /*
@@ -1157,7 +1161,7 @@ void get_monotonic_boottime(struct timespec *ts)
        } while (read_seqretry(&xtime_lock, seq));
 
        set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec,
-                       ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec + nsecs);
+               (s64)ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec + nsecs);
 }
 EXPORT_SYMBOL_GPL(get_monotonic_boottime);