Merge branch 'sparc64-early-boot-timestamp'
authorDavid S. Miller <davem@davemloft.net>
Mon, 12 Jun 2017 22:44:11 +0000 (15:44 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 12 Jun 2017 22:44:11 +0000 (15:44 -0700)
Pavel Tatashin says:

====================
sparc64: Early boot timestamp

Changelog:
v2 - v3:
- __aligned(64) -> __cacheline_aligned
- Replaced in sched_clock() wmb() with barrier()
v1 - v2:
- Early boot timestamps are now available on all 64-bit
  sparc processors
- New hot-patched get_tick() function.

This patch set:
- enables early boot timestamps on SPARC,
- adds offset so we count time from zero, the same as it is done on other
  platforms
- improves the performance by inling, hot patching, and combining loads
  into the same cacheline. (and few other optimizations).

So, the final performance of sched_clock() is faster than now: the fewer
number of loads, and all of them are coming from the same cacheline. Loads
can run while we are reading tick value, and we do not do function call.

Current sched_clock():
sethi  %hi(0xb9b400), %g1
ldx  [ %g1 + 0x250 ], %g1
ldx  [ %g1 ], %g1
call  %g1
nop
sethi  %hi(0xb9b400), %g1
ldx  [ %g1 + 0x300 ], %g1
mulx  %o0, %g1, %g1
rett  %i7 + 8
srlx  %g1, 0xa, %o0

Final sched_clock():
sethi  %hi(0xb9b400), %g1
ldx  [ %g1 + 0x2c8 ], %g2
ldx  [ %g1 + 0x2c0 ], %g1
b  42f638 <sched_clock+0x44>
rd  %asr24, %i0
...
sllx  %i0, 1, %i0
srlx  %i0, 1, %i0
mulx  %i0, %g1, %i0
srlx  %i0, 0xa, %i0
rett  %i7 + 8
sub  %o0, %g2, %o0
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

Trivial merge