powerpc/8xx: Reduce time spent in allow_user_access() and friends
authorChristophe Leroy <christophe.leroy@c-s.fr>
Wed, 15 Apr 2020 10:06:09 +0000 (10:06 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 2 Jun 2020 10:59:13 +0000 (20:59 +1000)
commit332ce969b763553e9c4d55069e1e15aba4ea560f
treeae04fe33265d08cfe4e7d5177b39090fe884790f
parente51c3e13709fe55d4d0eb50ba435bc53a64152bf
powerpc/8xx: Reduce time spent in allow_user_access() and friends

To enable/disable kernel access to user space, the 8xx has to
modify the properties of access group 1. This is done by writing
predefined values into SPRN_Mx_AP registers.

As of today, a __put_user() gives:

00000d64 <my_test>:
 d64: 3d 20 4f ff  lis     r9,20479
 d68: 61 29 ff ff  ori     r9,r9,65535
 d6c: 7d 3a c3 a6  mtspr   794,r9
 d70: 39 20 00 00  li      r9,0
 d74: 90 83 00 00  stw     r4,0(r3)
 d78: 3d 20 6f ff  lis     r9,28671
 d7c: 61 29 ff ff  ori     r9,r9,65535
 d80: 7d 3a c3 a6  mtspr   794,r9
 d84: 4e 80 00 20  blr

Because only groups 0 and 1 are used, the definition of
groups 2 to 15 doesn't matter.
By setting unused bits to 0 instead on 1, one instruction is
removed for each lock and unlock action:

00000d5c <my_test>:
 d5c: 3d 20 40 00  lis     r9,16384
 d60: 7d 3a c3 a6  mtspr   794,r9
 d64: 39 20 00 00  li      r9,0
 d68: 90 83 00 00  stw     r4,0(r3)
 d6c: 3d 20 60 00  lis     r9,24576
 d70: 7d 3a c3 a6  mtspr   794,r9
 d74: 4e 80 00 20  blr

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/57425c33dd72f292b1a23570244b81419072a7aa.1586945153.git.christophe.leroy@c-s.fr
arch/powerpc/include/asm/nohash/32/mmu-8xx.h