diff options
Diffstat (limited to 'arch/x86/kernel/uv_time.c')
| -rw-r--r-- | arch/x86/kernel/uv_time.c | 13 | 
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/x86/kernel/uv_time.c b/arch/x86/kernel/uv_time.c index 3c84aa001c1..2b75ef638db 100644 --- a/arch/x86/kernel/uv_time.c +++ b/arch/x86/kernel/uv_time.c @@ -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);  }  /*  |