x86, UV: Fix RTC latency bug by reading replicated cachelines
[sfrench/cifs-2.6.git] / arch / x86 / kernel / uv_time.c
index 3c84aa001c118275829783da04a5cdda9557a47d..2b75ef638dbc6f0716d02c58dd23cc8a97acc45a 100644 (file)
@@ -282,10 +282,21 @@ static int uv_rtc_unset_timer(int cpu, int force)
 
 /*
  * Read the RTC.
+ *
+ * Starting with HUB rev 2.0, the UV RTC register is replicated across all
+ * cachelines of it's own page.  This allows faster simultaneous reads
+ * from a given socket.
  */
 static cycle_t uv_read_rtc(struct clocksource *cs)
 {
-       return (cycle_t)uv_read_local_mmr(UVH_RTC);
+       unsigned long offset;
+
+       if (uv_get_min_hub_revision_id() == 1)
+               offset = 0;
+       else
+               offset = (uv_blade_processor_id() * L1_CACHE_BYTES) % PAGE_SIZE;
+
+       return (cycle_t)uv_read_local_mmr(UVH_RTC | offset);
 }
 
 /*