powerpc/64s: Don't unbalance the return branch predictor in __replay_interrupt()
authorNicholas Piggin <npiggin@gmail.com>
Tue, 13 Jun 2017 13:05:49 +0000 (23:05 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 19 Jun 2017 09:46:28 +0000 (19:46 +1000)
The __replay_interrupt() code is branched to with bl, but the caller is
returned to directly with rfid from the interrupt.

Instead, rfid to a stub that returns to the caller with blr, which
should keep the return branch predictor balanced.

Reviewed-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/exceptions-64s.S

index 1752bee..cad3b4b 100644 (file)
@@ -1639,6 +1639,10 @@ doorbell_super_common_msgclr:
  * Note: While MSR:EE is off, we need to make sure that _MSR
  * in the generated frame has EE set to 1 or the exception
  * handler will not properly re-enable them.
+ *
+ * Note that we don't specify LR as the NIP (return address) for
+ * the interrupt because that would unbalance the return branch
+ * predictor.
  */
 _GLOBAL(__replay_interrupt)
        /* We are going to jump to the exception common code which
@@ -1646,7 +1650,7 @@ _GLOBAL(__replay_interrupt)
         * we don't give a damn about, so we don't bother storing them.
         */
        mfmsr   r12
-       mflr    r11
+       LOAD_REG_ADDR(r11, .L__replay_interrupt_return)
        mfcr    r9
        ori     r12,r12,MSR_EE
        cmpwi   r3,0x900
@@ -1664,4 +1668,6 @@ FTR_SECTION_ELSE
        cmpwi   r3,0xa00
        beq     doorbell_super_common_msgclr
 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
+.L__replay_interrupt_return:
        blr
+