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)
commit9300d9c4ad29b0e79c55c0ba7a16cfc4c13442b8
tree46e76b92d42fe97e75fe59c77c2cca8e5f7713d6
parent0abdfaf4a95435c0197603a262149019ca2f448d
parenteae3fc9871111e9bbc77dad5481a3e805e02ac46
Merge branch 'sparc64-early-boot-timestamp'

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>