powerpc/mm: Evaluate user_mode(regs) only once in do_page_fault()
authorChristophe Leroy <christophe.leroy@c-s.fr>
Wed, 19 Apr 2017 12:56:30 +0000 (14:56 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 2 Jun 2017 09:19:45 +0000 (19:19 +1000)
commitda929f6af4689c75868dc373b4549f53945b5af0
treee633d60f85772ef78209233568d692e12c3bb80c
parent97a011e69b42bec8ac10f8510d3cd73b50882d88
powerpc/mm: Evaluate user_mode(regs) only once in do_page_fault()

Analysis of the assembly code shows that when using user_mode(regs),
at least the 'andi.' is redone all the time, and also
the 'lwz ,132(r31)' most of the time. With the new form, the 'is_user'
is mapped to cr4, then all further use of is_user results in just
things like 'beq cr4,218 <do_page_fault+0x218>'

Without the patch:

  50: 81 1e 00 84  lwz     r8,132(r30)
  54: 71 09 40 00  andi.   r9,r8,16384
  58: 40 82 00 0c  bne     64 <do_page_fault+0x64>

  84: 81 3e 00 84  lwz     r9,132(r30)
  8c: 71 2a 40 00  andi.   r10,r9,16384
  90: 41 a2 01 64  beq     1f4 <do_page_fault+0x1f4>

  d4: 81 3e 00 84  lwz     r9,132(r30)
  dc: 71 28 40 00  andi.   r8,r9,16384
  e0: 41 82 02 08  beq     2e8 <do_page_fault+0x2e8>

 108: 81 3e 00 84  lwz     r9,132(r30)
 110: 71 28 40 00  andi.   r8,r9,16384
 118: 41 82 02 28  beq     340 <do_page_fault+0x340>

 1e4: 81 3e 00 84  lwz     r9,132(r30)
 1e8: 71 2a 40 00  andi.   r10,r9,16384
 1ec: 40 82 01 68  bne     354 <do_page_fault+0x354>

 228: 81 3e 00 84  lwz     r9,132(r30)
 22c: 71 28 40 00  andi.   r8,r9,16384
 230: 41 82 ff c4  beq     1f4 <do_page_fault+0x1f4>

 288: 71 2a 40 00  andi.   r10,r9,16384
 294: 41 a2 fe 60  beq     f4 <do_page_fault+0xf4>

 50c: 81 3e 00 84  lwz     r9,132(r30)
 514: 71 2a 40 00  andi.   r10,r9,16384
 518: 40 a2 fc e0  bne     1f8 <do_page_fault+0x1f8>

 534: 81 3e 00 84  lwz     r9,132(r30)
 53c: 71 2a 40 00  andi.   r10,r9,16384
 540: 41 82 fc b8  beq     1f8 <do_page_fault+0x1f8>

This patch creates a local var called 'is_user' which contains the
result of user_mode(regs)

With the patch:

  20: 81 03 00 84  lwz     r8,132(r3)
  48: 55 09 97 fe  rlwinm  r9,r8,18,31,31
  58: 2e 09 00 00  cmpwi   cr4,r9,0
  5c: 40 92 00 0c  bne     cr4,68 <do_page_fault+0x68>

  88: 41 b2 01 90  beq     cr4,218 <do_page_fault+0x218>

  d4: 40 92 01 d0  bne     cr4,2a4 <do_page_fault+0x2a4>

 120: 41 b2 00 f8  beq     cr4,218 <do_page_fault+0x218>

 138: 41 b2 ff a0  beq     cr4,d8 <do_page_fault+0xd8>

 1d4: 40 92 00 e0  bne     cr4,2b4 <do_page_fault+0x2b4>

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/fault.c