]> Pileus Git - ~andy/linux/blobdiff - kernel/time/ntp.c
ntp: Remove ntp_lock, using the timekeeping locks to protect ntp state
[~andy/linux] / kernel / time / ntp.c
index d17e13c0147dfac8a947681df33ff15fdb26ac1c..12ff13a838c652967d83212baf4742d71862720a 100644 (file)
 
 /*
  * NTP timekeeping variables:
+ *
+ * Note: All of the NTP state is protected by the timekeeping locks.
  */
 
-DEFINE_RAW_SPINLOCK(ntp_lock);
-
 
 /* USER_HZ period (usecs): */
 unsigned long                  tick_usec = TICK_USEC;
@@ -132,8 +132,6 @@ static inline void pps_reset_freq_interval(void)
 
 /**
  * pps_clear - Clears the PPS state variables
- *
- * Must be called while holding a write on the ntp_lock
  */
 static inline void pps_clear(void)
 {
@@ -148,8 +146,6 @@ static inline void pps_clear(void)
 /* Decrease pps_valid to indicate that another second has passed since
  * the last PPS signal. When it reaches 0, indicate that PPS signal is
  * missing.
- *
- * Must be called while holding a write on the ntp_lock
  */
 static inline void pps_dec_valid(void)
 {
@@ -344,10 +340,6 @@ static void ntp_update_offset(long offset)
  */
 void ntp_clear(void)
 {
-       unsigned long flags;
-
-       raw_spin_lock_irqsave(&ntp_lock, flags);
-
        time_adjust     = 0;            /* stop active adjtime() */
        time_status     |= STA_UNSYNC;
        time_maxerror   = NTP_PHASE_LIMIT;
@@ -360,20 +352,12 @@ void ntp_clear(void)
 
        /* Clear PPS state variables */
        pps_clear();
-       raw_spin_unlock_irqrestore(&ntp_lock, flags);
-
 }
 
 
 u64 ntp_tick_length(void)
 {
-       unsigned long flags;
-       s64 ret;
-
-       raw_spin_lock_irqsave(&ntp_lock, flags);
-       ret = tick_length;
-       raw_spin_unlock_irqrestore(&ntp_lock, flags);
-       return ret;
+       return tick_length;
 }
 
 
@@ -391,9 +375,6 @@ int second_overflow(unsigned long secs)
 {
        s64 delta;
        int leap = 0;
-       unsigned long flags;
-
-       raw_spin_lock_irqsave(&ntp_lock, flags);
 
        /*
         * Leap second processing. If in leap-insert state at the end of the
@@ -475,8 +456,6 @@ int second_overflow(unsigned long secs)
        time_adjust = 0;
 
 out:
-       raw_spin_unlock_irqrestore(&ntp_lock, flags);
-
        return leap;
 }
 
@@ -571,10 +550,7 @@ static inline void process_adj_status(struct timex *txc, struct timespec *ts)
        time_status |= txc->status & ~STA_RONLY;
 }
 
-/*
- * Called with ntp_lock held, so we can access and modify
- * all the global NTP state:
- */
+
 static inline void process_adjtimex_modes(struct timex *txc,
                                                struct timespec *ts,
                                                s32 *time_tai)
@@ -666,19 +642,6 @@ int __do_adjtimex(struct timex *txc, struct timespec *ts, s32 *time_tai)
 {
        int result;
 
-       if (txc->modes & ADJ_SETOFFSET) {
-               struct timespec delta;
-               delta.tv_sec  = txc->time.tv_sec;
-               delta.tv_nsec = txc->time.tv_usec;
-               if (!(txc->modes & ADJ_NANO))
-                       delta.tv_nsec *= 1000;
-               result = timekeeping_inject_offset(&delta);
-               if (result)
-                       return result;
-       }
-
-       raw_spin_lock_irq(&ntp_lock);
-
        if (txc->modes & ADJ_ADJTIME) {
                long save_adjust = time_adjust;
 
@@ -719,8 +682,6 @@ int __do_adjtimex(struct timex *txc, struct timespec *ts, s32 *time_tai)
        /* fill PPS status fields */
        pps_fill_timex(txc);
 
-       raw_spin_unlock_irq(&ntp_lock);
-
        txc->time.tv_sec = ts->tv_sec;
        txc->time.tv_usec = ts->tv_nsec;
        if (!(time_status & STA_NANO))
@@ -917,8 +878,6 @@ void __hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
 
        pts_norm = pps_normalize_ts(*phase_ts);
 
-       raw_spin_lock_irqsave(&ntp_lock, flags);
-
        /* clear the error bits, they will be set again if needed */
        time_status &= ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR);
 
@@ -930,7 +889,6 @@ void __hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
         * just start the frequency interval */
        if (unlikely(pps_fbase.tv_sec == 0)) {
                pps_fbase = *raw_ts;
-               raw_spin_unlock_irqrestore(&ntp_lock, flags);
                return;
        }
 
@@ -945,7 +903,6 @@ void __hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
                time_status |= STA_PPSJITTER;
                /* restart the frequency calibration interval */
                pps_fbase = *raw_ts;
-               raw_spin_unlock_irqrestore(&ntp_lock, flags);
                pr_err("hardpps: PPSJITTER: bad pulse\n");
                return;
        }
@@ -962,7 +919,6 @@ void __hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
 
        hardpps_update_phase(pts_norm.nsec);
 
-       raw_spin_unlock_irqrestore(&ntp_lock, flags);
 }
 #endif /* CONFIG_NTP_PPS */