s390/idle: add missing mt_cycles calculation
authorSven Schnelle <svens@linux.ibm.com>
Thu, 3 Dec 2020 21:03:32 +0000 (22:03 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 30 Dec 2020 10:54:08 +0000 (11:54 +0100)
commit e259b3fafa7de362b04ecd86e7fa9a9e9273e5fb upstream.

During removal of the critical section cleanup the calculation
of mt_cycles during idle was removed. This causes invalid
accounting on systems with SMT enabled.

Fixes: 0b0ed657fe00 ("s390: remove critical section cleanup from entry.S")
Cc: <stable@vger.kernel.org> # 5.8
Reviewed-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/s390/kernel/entry.S

index 92beb14..2a4bd25 100644 (file)
@@ -112,7 +112,7 @@ _LPP_OFFSET = __LC_LPP
 
        .macro  SWITCH_ASYNC savearea,timer
        tmhh    %r8,0x0001              # interrupting from user ?
-       jnz     2f
+       jnz     4f
 #if IS_ENABLED(CONFIG_KVM)
        lgr     %r14,%r9
        larl    %r13,.Lsie_gmap
@@ -125,9 +125,25 @@ _LPP_OFFSET        = __LC_LPP
 #endif
 0:     larl    %r13,.Lpsw_idle_exit
        cgr     %r13,%r9
-       jne     1f
+       jne     3f
 
-       mvc     __CLOCK_IDLE_EXIT(8,%r2), __LC_INT_CLOCK
+       larl    %r1,smp_cpu_mtid
+       llgf    %r1,0(%r1)
+       ltgr    %r1,%r1
+       jz      2f                      # no SMT, skip mt_cycles calculation
+       .insn   rsy,0xeb0000000017,%r1,5,__SF_EMPTY+80(%r15)
+       larl    %r3,mt_cycles
+       ag      %r3,__LC_PERCPU_OFFSET
+       la      %r4,__SF_EMPTY+16(%r15)
+1:     lg      %r0,0(%r3)
+       slg     %r0,0(%r4)
+       alg     %r0,64(%r4)
+       stg     %r0,0(%r3)
+       la      %r3,8(%r3)
+       la      %r4,8(%r4)
+       brct    %r1,1b
+
+2:     mvc     __CLOCK_IDLE_EXIT(8,%r2), __LC_INT_CLOCK
        mvc     __TIMER_IDLE_EXIT(8,%r2), __LC_ASYNC_ENTER_TIMER
        # account system time going idle
        ni      __LC_CPU_FLAGS+7,255-_CIF_ENABLED_WAIT
@@ -146,17 +162,17 @@ _LPP_OFFSET       = __LC_LPP
        mvc     __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2)
 
        nihh    %r8,0xfcfd              # clear wait state and irq bits
-1:     lg      %r14,__LC_ASYNC_STACK   # are we already on the target stack?
+3:     lg      %r14,__LC_ASYNC_STACK   # are we already on the target stack?
        slgr    %r14,%r15
        srag    %r14,%r14,STACK_SHIFT
-       jnz     3f
+       jnz     5f
        CHECK_STACK \savearea
        aghi    %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
-       j       4f
-2:     UPDATE_VTIME %r14,%r15,\timer
+       j       6f
+4:     UPDATE_VTIME %r14,%r15,\timer
        BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP
-3:     lg      %r15,__LC_ASYNC_STACK   # load async stack
-4:     la      %r11,STACK_FRAME_OVERHEAD(%r15)
+5:     lg      %r15,__LC_ASYNC_STACK   # load async stack
+6:     la      %r11,STACK_FRAME_OVERHEAD(%r15)
        .endm
 
        .macro UPDATE_VTIME w1,w2,enter_timer