• Christophe Leroy's avatar
    powerpc/mm: Evaluate user_mode(regs) only once in do_page_fault() · da929f6a
    Christophe Leroy authored
    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: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
    Reviewed-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    da929f6a
fault.c 16.1 KB