aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c b/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c
index 7ba39d22ca..4999af6642 100644
--- a/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c
+++ b/xenolinux-2.4.16-sparse/arch/xeno/kernel/time.c
@@ -101,16 +101,12 @@ static inline long long get_s_time(void)
spin_lock_irqsave(&hyp_stime_lock, flags);
- pcc = HYPERVISOR_shared_info->st_timestamp;
- mb();
- if (pcc != shadow_st_pcc) {
-st_again:
- shadow_st_pcc = HYPERVISOR_shared_info->st_timestamp;
+ while ((pcc = HYPERVISOR_shared_info->st_timestamp) != shadow_st_pcc)
+ {
+ barrier();
+ shadow_st_pcc = pcc;
shadow_st = HYPERVISOR_shared_info->system_time;
- pcc = HYPERVISOR_shared_info->st_timestamp;
- mb();
- if (pcc != shadow_st_pcc)
- goto st_again;
+ barrier();
}
now = shadow_st;
@@ -120,7 +116,9 @@ st_again:
delta = ((u64)delta_tsc * st_scale_f);
delta >>= 32;
delta += ((u64)delta_tsc * st_scale_i);
+
spin_unlock_irqrestore(&hyp_time_lock, flags);
+
return now + delta;
}
@@ -145,19 +143,14 @@ void do_gettimeofday(struct timeval *tv)
spin_lock_irqsave(&hyp_wctime_lock, flags);
- version = HYPERVISOR_shared_info->wc_version;
- mb();
- if (version != shadow_wc_version) {
- wc_again:
- shadow_wc_version = HYPERVISOR_shared_info->wc_version;
+ while ((version = HYPERVISOR_shared_info->wc_version)!= shadow_wc_version)
+ {
+ barrier();
+ shadow_wc_version = version;
shadow_tv_sec = HYPERVISOR_shared_info->tv_sec;
shadow_tv_usec = HYPERVISOR_shared_info->tv_usec;
shadow_wc_timestamp = HYPERVISOR_shared_info->wc_timestamp;
- shadow_wc_version = HYPERVISOR_shared_info->wc_version;
- version = HYPERVISOR_shared_info->wc_version;
- mb();
- if (version != shadow_wc_version)
- goto wc_again;
+ barrier();
}
now = NOW();