powerpc/64: entry cpu time accounting in C
authorNicholas Piggin <npiggin@gmail.com>
Sat, 30 Jan 2021 13:08:48 +0000 (23:08 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 8 Feb 2021 13:10:49 +0000 (00:10 +1100)
There is no need for this to be in asm, use the new interrupt entry wrapper.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210130130852.2952424-39-npiggin@gmail.com
arch/powerpc/include/asm/interrupt.h
arch/powerpc/include/asm/ppc_asm.h
arch/powerpc/kernel/exceptions-64e.S
arch/powerpc/kernel/exceptions-64s.S

index e96d215..ca8e08b 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <linux/context_tracking.h>
 #include <linux/hardirq.h>
+#include <asm/cputime.h>
 #include <asm/ftrace.h>
 
 struct interrupt_state {
@@ -25,6 +26,9 @@ static inline void interrupt_enter_prepare(struct pt_regs *regs, struct interrup
        if (user_mode(regs)) {
                CT_WARN_ON(ct_state() != CONTEXT_USER);
                user_exit_irqoff();
+
+               account_cpu_user_entry();
+               account_stolen_time();
        } else {
                /*
                 * CT_WARN_ON comes here via program_check_exception,
@@ -37,6 +41,8 @@ static inline void interrupt_enter_prepare(struct pt_regs *regs, struct interrup
 
 #ifdef CONFIG_PPC_BOOK3E_64
        state->ctx_state = exception_enter();
+       if (user_mode(regs))
+               account_cpu_user_entry();
 #endif
 }
 
index cc1bca5..3dceb64 100644 (file)
@@ -25,7 +25,6 @@
 #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
 #define ACCOUNT_CPU_USER_ENTRY(ptr, ra, rb)
 #define ACCOUNT_CPU_USER_EXIT(ptr, ra, rb)
-#define ACCOUNT_STOLEN_TIME
 #else
 #define ACCOUNT_CPU_USER_ENTRY(ptr, ra, rb)                            \
        MFTB(ra);                       /* get timebase */              \
        PPC_LL  ra, ACCOUNT_SYSTEM_TIME(ptr);                           \
        add     ra,ra,rb;               /* add on to system time */     \
        PPC_STL ra, ACCOUNT_SYSTEM_TIME(ptr)
-
-#ifdef CONFIG_PPC_SPLPAR
-#define ACCOUNT_STOLEN_TIME                                            \
-BEGIN_FW_FTR_SECTION;                                                  \
-       beq     33f;                                                    \
-       /* from user - see if there are any DTL entries to process */   \
-       ld      r10,PACALPPACAPTR(r13); /* get ptr to VPA */            \
-       ld      r11,PACA_DTL_RIDX(r13); /* get log read index */        \
-       addi    r10,r10,LPPACA_DTLIDX;                                  \
-       LDX_BE  r10,0,r10;              /* get log write index */       \
-       cmpd    cr1,r11,r10;                                            \
-       beq+    cr1,33f;                                                \
-       bl      accumulate_stolen_time;                         \
-       ld      r12,_MSR(r1);                                           \
-       andi.   r10,r12,MSR_PR;         /* Restore cr0 (coming from user) */ \
-33:                                                                    \
-END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
-
-#else  /* CONFIG_PPC_SPLPAR */
-#define ACCOUNT_STOLEN_TIME
-
-#endif /* CONFIG_PPC_SPLPAR */
-
 #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
 
 /*
index 003999c..e8eb999 100644 (file)
@@ -398,7 +398,6 @@ exc_##n##_common:                                                       \
        std     r10,_NIP(r1);           /* save SRR0 to stackframe */       \
        std     r11,_MSR(r1);           /* save SRR1 to stackframe */       \
        beq     2f;                     /* if from kernel mode */           \
-       ACCOUNT_CPU_USER_ENTRY(r13,r10,r11);/* accounting (uses cr0+eq) */  \
 2:     ld      r3,excf+EX_R10(r13);    /* get back r10 */                  \
        ld      r4,excf+EX_R11(r13);    /* get back r11 */                  \
        mfspr   r5,scratch;             /* get back r13 */                  \
index 88b4896..898698c 100644 (file)
@@ -577,7 +577,6 @@ DEFINE_FIXED_SYMBOL(\name\()_common_real)
        kuap_save_amr_and_lock r9, r10, cr1, cr0
        .endif
        beq     101f                    /* if from kernel mode          */
-       ACCOUNT_CPU_USER_ENTRY(r13, r9, r10)
 BEGIN_FTR_SECTION
        ld      r9,IAREA+EX_PPR(r13)    /* Read PPR from paca           */
        std     r9,_PPR(r1)
@@ -645,10 +644,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
        ld      r11,exception_marker@toc(r2)
        std     r10,RESULT(r1)          /* clear regs->result           */
        std     r11,STACK_FRAME_OVERHEAD-16(r1) /* mark the frame       */
-
-       .if ISTACK
-       ACCOUNT_STOLEN_TIME
-       .endif
 .endm
 
 /*