hrtimer: Add bases argument to clock_was_set()
[platform/kernel/linux-rpi.git] / kernel / time / timekeeping.c
index 8a364aa..b348749 100644 (file)
@@ -1323,8 +1323,8 @@ out:
        write_seqcount_end(&tk_core.seq);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
 
-       /* signal hrtimers about time change */
-       clock_was_set();
+       /* Signal hrtimers about time change */
+       clock_was_set(CLOCK_SET_WALL);
 
        if (!ret)
                audit_tk_injoffset(ts_delta);
@@ -1371,8 +1371,8 @@ error: /* even if we error out, we forwarded the time, so call update */
        write_seqcount_end(&tk_core.seq);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
 
-       /* signal hrtimers about time change */
-       clock_was_set();
+       /* Signal hrtimers about time change */
+       clock_was_set(CLOCK_SET_WALL);
 
        return ret;
 }
@@ -1746,8 +1746,8 @@ void timekeeping_inject_sleeptime64(const struct timespec64 *delta)
        write_seqcount_end(&tk_core.seq);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
 
-       /* signal hrtimers about time change */
-       clock_was_set();
+       /* Signal hrtimers about time change */
+       clock_was_set(CLOCK_SET_WALL | CLOCK_SET_BOOT);
 }
 #endif
 
@@ -1810,8 +1810,10 @@ void timekeeping_resume(void)
 
        touch_softlockup_watchdog();
 
+       /* Resume the clockevent device(s) and hrtimers */
        tick_resume();
-       hrtimers_resume();
+       /* Notify timerfd as resume is equivalent to clock_was_set() */
+       timerfd_resume();
 }
 
 int timekeeping_suspend(void)
@@ -2125,7 +2127,7 @@ static u64 logarithmic_accumulation(struct timekeeper *tk, u64 offset,
  * timekeeping_advance - Updates the timekeeper to the current time and
  * current NTP tick length
  */
-static void timekeeping_advance(enum timekeeping_adv_mode mode)
+static bool timekeeping_advance(enum timekeeping_adv_mode mode)
 {
        struct timekeeper *real_tk = &tk_core.timekeeper;
        struct timekeeper *tk = &shadow_timekeeper;
@@ -2196,9 +2198,8 @@ static void timekeeping_advance(enum timekeeping_adv_mode mode)
        write_seqcount_end(&tk_core.seq);
 out:
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
-       if (clock_set)
-               /* Have to call _delayed version, since in irq context*/
-               clock_was_set_delayed();
+
+       return !!clock_set;
 }
 
 /**
@@ -2207,7 +2208,8 @@ out:
  */
 void update_wall_time(void)
 {
-       timekeeping_advance(TK_ADV_TICK);
+       if (timekeeping_advance(TK_ADV_TICK))
+               clock_was_set_delayed();
 }
 
 /**
@@ -2387,8 +2389,9 @@ int do_adjtimex(struct __kernel_timex *txc)
 {
        struct timekeeper *tk = &tk_core.timekeeper;
        struct audit_ntp_data ad;
-       unsigned long flags;
+       bool clock_set = false;
        struct timespec64 ts;
+       unsigned long flags;
        s32 orig_tai, tai;
        int ret;
 
@@ -2423,6 +2426,7 @@ int do_adjtimex(struct __kernel_timex *txc)
        if (tai != orig_tai) {
                __timekeeping_set_tai_offset(tk, tai);
                timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET);
+               clock_set = true;
        }
        tk_update_leap_state(tk);
 
@@ -2433,10 +2437,10 @@ int do_adjtimex(struct __kernel_timex *txc)
 
        /* Update the multiplier immediately if frequency was set directly */
        if (txc->modes & (ADJ_FREQUENCY | ADJ_TICK))
-               timekeeping_advance(TK_ADV_FREQ);
+               clock_set |= timekeeping_advance(TK_ADV_FREQ);
 
-       if (tai != orig_tai)
-               clock_was_set();
+       if (clock_set)
+               clock_was_set(CLOCK_REALTIME);
 
        ntp_notify_cmos_timer();