aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjohn stultz <johnstul@us.ibm.com>2007-07-24 20:47:43 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-25 13:09:20 -0400
commit2c6b47de17c75d553de3e2fb426d8298d2074585 (patch)
treec8edc3d727d85cb3e1c043583c350a04a133e1a3
parent0de085bb474f64e4fdb2f1ff3268590792648c7b (diff)
Cleanup non-arch xtime uses, use get_seconds() or current_kernel_time().
This avoids use of the kernel-internal "xtime" variable directly outside of the actual time-related functions. Instead, use the helper functions that we already have available to us. This doesn't actually change any behaviour, but this will allow us to fix the fact that "xtime" isn't updated very often with CONFIG_NO_HZ (because much of the realtime information is maintained as separate offsets to 'xtime'), which has caused interfaces that use xtime directly to get a time that is out of sync with the real-time clock by up to a third of a second or so. Signed-off-by: John Stultz <johnstul@us.ibm.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/rtc/class.c5
-rw-r--r--drivers/s390/net/ctcmain.c6
-rw-r--r--drivers/s390/net/netiucv.c4
-rw-r--r--include/linux/time.h2
-rw-r--r--kernel/acct.c2
-rw-r--r--kernel/hrtimer.c2
-rw-r--r--kernel/time.c16
-rw-r--r--kernel/time/timekeeping.c16
-rw-r--r--kernel/tsacct.c2
-rw-r--r--net/rxrpc/af_rxrpc.c2
-rw-r--r--net/rxrpc/ar-connection.c4
-rw-r--r--net/rxrpc/ar-transport.c4
-rw-r--r--net/rxrpc/rxkad.c2
13 files changed, 34 insertions, 33 deletions
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c
index 8b3cd31d6a61..10ab3b71ffc6 100644
--- a/drivers/rtc/class.c
+++ b/drivers/rtc/class.c
@@ -46,6 +46,7 @@ static int rtc_suspend(struct device *dev, pm_message_t mesg)
46{ 46{
47 struct rtc_device *rtc = to_rtc_device(dev); 47 struct rtc_device *rtc = to_rtc_device(dev);
48 struct rtc_time tm; 48 struct rtc_time tm;
49 struct timespec ts = current_kernel_time();
49 50
50 if (strncmp(rtc->dev.bus_id, 51 if (strncmp(rtc->dev.bus_id,
51 CONFIG_RTC_HCTOSYS_DEVICE, 52 CONFIG_RTC_HCTOSYS_DEVICE,
@@ -57,8 +58,8 @@ static int rtc_suspend(struct device *dev, pm_message_t mesg)
57 58
58 /* RTC precision is 1 second; adjust delta for avg 1/2 sec err */ 59 /* RTC precision is 1 second; adjust delta for avg 1/2 sec err */
59 set_normalized_timespec(&delta, 60 set_normalized_timespec(&delta,
60 xtime.tv_sec - oldtime, 61 ts.tv_sec - oldtime,
61 xtime.tv_nsec - (NSEC_PER_SEC >> 1)); 62 ts.tv_nsec - (NSEC_PER_SEC >> 1));
62 63
63 return 0; 64 return 0;
64} 65}
diff --git a/drivers/s390/net/ctcmain.c b/drivers/s390/net/ctcmain.c
index b20fd0681733..92e8a37b5022 100644
--- a/drivers/s390/net/ctcmain.c
+++ b/drivers/s390/net/ctcmain.c
@@ -674,7 +674,7 @@ ch_action_txdone(fsm_instance * fi, int event, void *arg)
674 int first = 1; 674 int first = 1;
675 int i; 675 int i;
676 unsigned long duration; 676 unsigned long duration;
677 struct timespec done_stamp = xtime; 677 struct timespec done_stamp = current_kernel_time();
678 678
679 DBF_TEXT(trace, 4, __FUNCTION__); 679 DBF_TEXT(trace, 4, __FUNCTION__);
680 680
@@ -730,7 +730,7 @@ ch_action_txdone(fsm_instance * fi, int event, void *arg)
730 spin_unlock(&ch->collect_lock); 730 spin_unlock(&ch->collect_lock);
731 ch->ccw[1].count = ch->trans_skb->len; 731 ch->ccw[1].count = ch->trans_skb->len;
732 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch); 732 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
733 ch->prof.send_stamp = xtime; 733 ch->prof.send_stamp = current_kernel_time();
734 rc = ccw_device_start(ch->cdev, &ch->ccw[0], 734 rc = ccw_device_start(ch->cdev, &ch->ccw[0],
735 (unsigned long) ch, 0xff, 0); 735 (unsigned long) ch, 0xff, 0);
736 ch->prof.doios_multi++; 736 ch->prof.doios_multi++;
@@ -2281,7 +2281,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
2281 fsm_newstate(ch->fsm, CH_STATE_TX); 2281 fsm_newstate(ch->fsm, CH_STATE_TX);
2282 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch); 2282 fsm_addtimer(&ch->timer, CTC_TIMEOUT_5SEC, CH_EVENT_TIMER, ch);
2283 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags); 2283 spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
2284 ch->prof.send_stamp = xtime; 2284 ch->prof.send_stamp = current_kernel_time();
2285 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx], 2285 rc = ccw_device_start(ch->cdev, &ch->ccw[ccw_idx],
2286 (unsigned long) ch, 0xff, 0); 2286 (unsigned long) ch, 0xff, 0);
2287 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags); 2287 spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c
index 3d28e1a5bf79..268889474339 100644
--- a/drivers/s390/net/netiucv.c
+++ b/drivers/s390/net/netiucv.c
@@ -753,7 +753,7 @@ static void conn_action_txdone(fsm_instance *fi, int event, void *arg)
753 753
754 header.next = 0; 754 header.next = 0;
755 memcpy(skb_put(conn->tx_buff, NETIUCV_HDRLEN), &header, NETIUCV_HDRLEN); 755 memcpy(skb_put(conn->tx_buff, NETIUCV_HDRLEN), &header, NETIUCV_HDRLEN);
756 conn->prof.send_stamp = xtime; 756 conn->prof.send_stamp = current_kernel_time();
757 txmsg.class = 0; 757 txmsg.class = 0;
758 txmsg.tag = 0; 758 txmsg.tag = 0;
759 rc = iucv_message_send(conn->path, &txmsg, 0, 0, 759 rc = iucv_message_send(conn->path, &txmsg, 0, 0,
@@ -1185,7 +1185,7 @@ static int netiucv_transmit_skb(struct iucv_connection *conn,
1185 memcpy(skb_put(nskb, NETIUCV_HDRLEN), &header, NETIUCV_HDRLEN); 1185 memcpy(skb_put(nskb, NETIUCV_HDRLEN), &header, NETIUCV_HDRLEN);
1186 1186
1187 fsm_newstate(conn->fsm, CONN_STATE_TX); 1187 fsm_newstate(conn->fsm, CONN_STATE_TX);
1188 conn->prof.send_stamp = xtime; 1188 conn->prof.send_stamp = current_kernel_time();
1189 1189
1190 msg.tag = 1; 1190 msg.tag = 1;
1191 msg.class = 0; 1191 msg.class = 0;
diff --git a/include/linux/time.h b/include/linux/time.h
index e6aea5146e5d..71181df8b744 100644
--- a/include/linux/time.h
+++ b/include/linux/time.h
@@ -107,7 +107,7 @@ static inline unsigned long get_seconds(void)
107struct timespec current_kernel_time(void); 107struct timespec current_kernel_time(void);
108 108
109#define CURRENT_TIME (current_kernel_time()) 109#define CURRENT_TIME (current_kernel_time())
110#define CURRENT_TIME_SEC ((struct timespec) { xtime.tv_sec, 0 }) 110#define CURRENT_TIME_SEC ((struct timespec) { get_seconds(), 0 })
111 111
112extern void do_gettimeofday(struct timeval *tv); 112extern void do_gettimeofday(struct timeval *tv);
113extern int do_settimeofday(struct timespec *tv); 113extern int do_settimeofday(struct timespec *tv);
diff --git a/kernel/acct.c b/kernel/acct.c
index 70d0d88e5554..24f0f8b2ba72 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -468,7 +468,7 @@ static void do_acct_process(struct file *file)
468 } 468 }
469#endif 469#endif
470 do_div(elapsed, AHZ); 470 do_div(elapsed, AHZ);
471 ac.ac_btime = xtime.tv_sec - elapsed; 471 ac.ac_btime = get_seconds() - elapsed;
472 /* we really need to bite the bullet and change layout */ 472 /* we really need to bite the bullet and change layout */
473 ac.ac_uid = current->uid; 473 ac.ac_uid = current->uid;
474 ac.ac_gid = current->gid; 474 ac.ac_gid = current->gid;
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index eb1ddebd2c04..a7bb05e6cb63 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -144,7 +144,7 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base)
144#ifdef CONFIG_NO_HZ 144#ifdef CONFIG_NO_HZ
145 getnstimeofday(&xts); 145 getnstimeofday(&xts);
146#else 146#else
147 xts = xtime; 147 xts = current_kernel_time();
148#endif 148#endif
149 tom = wall_to_monotonic; 149 tom = wall_to_monotonic;
150 } while (read_seqretry(&xtime_lock, seq)); 150 } while (read_seqretry(&xtime_lock, seq));
diff --git a/kernel/time.c b/kernel/time.c
index 5b81da08bbdb..2289a8d68314 100644
--- a/kernel/time.c
+++ b/kernel/time.c
@@ -215,22 +215,6 @@ asmlinkage long sys_adjtimex(struct timex __user *txc_p)
215 return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret; 215 return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
216} 216}
217 217
218inline struct timespec current_kernel_time(void)
219{
220 struct timespec now;
221 unsigned long seq;
222
223 do {
224 seq = read_seqbegin(&xtime_lock);
225
226 now = xtime;
227 } while (read_seqretry(&xtime_lock, seq));
228
229 return now;
230}
231
232EXPORT_SYMBOL(current_kernel_time);
233
234/** 218/**
235 * current_fs_time - Return FS time 219 * current_fs_time - Return FS time
236 * @sb: Superblock. 220 * @sb: Superblock.
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
index 88c81026e003..07a3f1420c27 100644
--- a/kernel/time/timekeeping.c
+++ b/kernel/time/timekeeping.c
@@ -509,3 +509,19 @@ void monotonic_to_bootbased(struct timespec *ts)
509{ 509{
510 ts->tv_sec += total_sleep_time; 510 ts->tv_sec += total_sleep_time;
511} 511}
512
513struct timespec current_kernel_time(void)
514{
515 struct timespec now;
516 unsigned long seq;
517
518 do {
519 seq = read_seqbegin(&xtime_lock);
520
521 now = xtime;
522 } while (read_seqretry(&xtime_lock, seq));
523
524 return now;
525}
526
527EXPORT_SYMBOL(current_kernel_time);
diff --git a/kernel/tsacct.c b/kernel/tsacct.c
index 658f638c402c..c122131a122f 100644
--- a/kernel/tsacct.c
+++ b/kernel/tsacct.c
@@ -39,7 +39,7 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk)
39 ac_etime = timespec_to_ns(&ts); 39 ac_etime = timespec_to_ns(&ts);
40 do_div(ac_etime, NSEC_PER_USEC); 40 do_div(ac_etime, NSEC_PER_USEC);
41 stats->ac_etime = ac_etime; 41 stats->ac_etime = ac_etime;
42 stats->ac_btime = xtime.tv_sec - ts.tv_sec; 42 stats->ac_btime = get_seconds() - ts.tv_sec;
43 if (thread_group_leader(tsk)) { 43 if (thread_group_leader(tsk)) {
44 stats->ac_exitcode = tsk->exit_code; 44 stats->ac_exitcode = tsk->exit_code;
45 if (tsk->flags & PF_FORKNOEXEC) 45 if (tsk->flags & PF_FORKNOEXEC)
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c
index 16a68df4e36b..c58fa0d1be26 100644
--- a/net/rxrpc/af_rxrpc.c
+++ b/net/rxrpc/af_rxrpc.c
@@ -787,7 +787,7 @@ static int __init af_rxrpc_init(void)
787 787
788 BUILD_BUG_ON(sizeof(struct rxrpc_skb_priv) > sizeof(dummy_skb->cb)); 788 BUILD_BUG_ON(sizeof(struct rxrpc_skb_priv) > sizeof(dummy_skb->cb));
789 789
790 rxrpc_epoch = htonl(xtime.tv_sec); 790 rxrpc_epoch = htonl(get_seconds());
791 791
792 ret = -ENOMEM; 792 ret = -ENOMEM;
793 rxrpc_call_jar = kmem_cache_create( 793 rxrpc_call_jar = kmem_cache_create(
diff --git a/net/rxrpc/ar-connection.c b/net/rxrpc/ar-connection.c
index 482750efc235..372b24466dc7 100644
--- a/net/rxrpc/ar-connection.c
+++ b/net/rxrpc/ar-connection.c
@@ -791,7 +791,7 @@ void rxrpc_put_connection(struct rxrpc_connection *conn)
791 791
792 ASSERTCMP(atomic_read(&conn->usage), >, 0); 792 ASSERTCMP(atomic_read(&conn->usage), >, 0);
793 793
794 conn->put_time = xtime.tv_sec; 794 conn->put_time = get_seconds();
795 if (atomic_dec_and_test(&conn->usage)) { 795 if (atomic_dec_and_test(&conn->usage)) {
796 _debug("zombie"); 796 _debug("zombie");
797 rxrpc_queue_delayed_work(&rxrpc_connection_reap, 0); 797 rxrpc_queue_delayed_work(&rxrpc_connection_reap, 0);
@@ -835,7 +835,7 @@ void rxrpc_connection_reaper(struct work_struct *work)
835 835
836 _enter(""); 836 _enter("");
837 837
838 now = xtime.tv_sec; 838 now = get_seconds();
839 earliest = ULONG_MAX; 839 earliest = ULONG_MAX;
840 840
841 write_lock_bh(&rxrpc_connection_lock); 841 write_lock_bh(&rxrpc_connection_lock);
diff --git a/net/rxrpc/ar-transport.c b/net/rxrpc/ar-transport.c
index d43d78f19302..bb282a6a19f0 100644
--- a/net/rxrpc/ar-transport.c
+++ b/net/rxrpc/ar-transport.c
@@ -183,7 +183,7 @@ void rxrpc_put_transport(struct rxrpc_transport *trans)
183 183
184 ASSERTCMP(atomic_read(&trans->usage), >, 0); 184 ASSERTCMP(atomic_read(&trans->usage), >, 0);
185 185
186 trans->put_time = xtime.tv_sec; 186 trans->put_time = get_seconds();
187 if (unlikely(atomic_dec_and_test(&trans->usage))) 187 if (unlikely(atomic_dec_and_test(&trans->usage)))
188 _debug("zombie"); 188 _debug("zombie");
189 /* let the reaper determine the timeout to avoid a race with 189 /* let the reaper determine the timeout to avoid a race with
@@ -219,7 +219,7 @@ static void rxrpc_transport_reaper(struct work_struct *work)
219 219
220 _enter(""); 220 _enter("");
221 221
222 now = xtime.tv_sec; 222 now = get_seconds();
223 earliest = ULONG_MAX; 223 earliest = ULONG_MAX;
224 224
225 /* extract all the transports that have been dead too long */ 225 /* extract all the transports that have been dead too long */
diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
index 5ec705144e10..ac3cabdca78c 100644
--- a/net/rxrpc/rxkad.c
+++ b/net/rxrpc/rxkad.c
@@ -916,7 +916,7 @@ static int rxkad_decrypt_ticket(struct rxrpc_connection *conn,
916 issue = be32_to_cpu(stamp); 916 issue = be32_to_cpu(stamp);
917 } 917 }
918 p += 4; 918 p += 4;
919 now = xtime.tv_sec; 919 now = get_seconds();
920 _debug("KIV ISSUE: %lx [%lx]", issue, now); 920 _debug("KIV ISSUE: %lx [%lx]", issue, now);
921 921
922 /* check the ticket is in date */ 922 /* check the ticket is in date */