#define TK_CLEAR_NTP           (1 << 0)
 #define TK_MIRROR              (1 << 1)
+#define TK_CLOCK_WAS_SET       (1 << 2)
 
 static struct timekeeper timekeeper;
 static DEFINE_RAW_SPINLOCK(timekeeper_lock);
 
 static RAW_NOTIFIER_HEAD(pvclock_gtod_chain);
 
-static void update_pvclock_gtod(struct timekeeper *tk)
+static void update_pvclock_gtod(struct timekeeper *tk, bool was_set)
 {
-       raw_notifier_call_chain(&pvclock_gtod_chain, 0, tk);
+       raw_notifier_call_chain(&pvclock_gtod_chain, was_set, tk);
 }
 
 /**
 
        raw_spin_lock_irqsave(&timekeeper_lock, flags);
        ret = raw_notifier_chain_register(&pvclock_gtod_chain, nb);
-       update_pvclock_gtod(tk);
+       update_pvclock_gtod(tk, true);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
 
        return ret;
                ntp_clear();
        }
        update_vsyscall(tk);
-       update_pvclock_gtod(tk);
+       update_pvclock_gtod(tk, action & TK_CLOCK_WAS_SET);
 
        if (action & TK_MIRROR)
                memcpy(&shadow_timekeeper, &timekeeper, sizeof(timekeeper));
 
        tk_set_xtime(tk, tv);
 
-       timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR);
+       timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET);
 
        write_seqcount_end(&timekeeper_seq);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
        tk_set_wall_to_mono(tk, timespec_sub(tk->wall_to_monotonic, *ts));
 
 error: /* even if we error out, we forwarded the time, so call update */
-       timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR);
+       timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET);
 
        write_seqcount_end(&timekeeper_seq);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
                        module_put(new->owner);
                }
        }
-       timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR);
+       timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET);
 
        write_seqcount_end(&timekeeper_seq);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
 
        __timekeeping_inject_sleeptime(tk, delta);
 
-       timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR);
+       timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET);
 
        write_seqcount_end(&timekeeper_seq);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
        tk->cycle_last = clock->cycle_last = cycle_now;
        tk->ntp_error = 0;
        timekeeping_suspended = 0;
-       timekeeping_update(tk, TK_MIRROR);
+       timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET);
        write_seqcount_end(&timekeeper_seq);
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
 
  * It also calls into the NTP code to handle leapsecond processing.
  *
  */
-static inline void accumulate_nsecs_to_secs(struct timekeeper *tk)
+static inline unsigned int accumulate_nsecs_to_secs(struct timekeeper *tk)
 {
        u64 nsecps = (u64)NSEC_PER_SEC << tk->shift;
+       unsigned int action = 0;
 
        while (tk->xtime_nsec >= nsecps) {
                int leap;
                        __timekeeping_set_tai_offset(tk, tk->tai_offset - leap);
 
                        clock_was_set_delayed();
+                       action = TK_CLOCK_WAS_SET;
                }
        }
+       return action;
 }
 
 /**
        struct timekeeper *tk = &shadow_timekeeper;
        cycle_t offset;
        int shift = 0, maxshift;
+       unsigned int action;
        unsigned long flags;
 
        raw_spin_lock_irqsave(&timekeeper_lock, flags);
         * Finally, make sure that after the rounding
         * xtime_nsec isn't larger than NSEC_PER_SEC
         */
-       accumulate_nsecs_to_secs(tk);
+       action = accumulate_nsecs_to_secs(tk);
 
        write_seqcount_begin(&timekeeper_seq);
        /* Update clock->cycle_last with the new value */
         * updating.
         */
        memcpy(real_tk, tk, sizeof(*tk));
-       timekeeping_update(real_tk, 0);
+       timekeeping_update(real_tk, action);
        write_seqcount_end(&timekeeper_seq);
 out:
        raw_spin_unlock_irqrestore(&timekeeper_lock, flags);
 
        if (tai != orig_tai) {
                __timekeeping_set_tai_offset(tk, tai);
+               update_pvclock_gtod(tk, true);
                clock_was_set_delayed();
        }
        write_seqcount_end(&timekeeper_seq);