[PATCH v5 17/21] powerpc/64: entry cpu time accounting in C
Christophe Leroy
christophe.leroy at csgroup.eu
Thu Jan 14 02:05:54 AEDT 2021
Le 13/01/2021 à 08:32, Nicholas Piggin a écrit :
> There is no need for this to be in asm, use the new intrrupt entry wrapper.
>
> Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
> ---
> arch/powerpc/include/asm/interrupt.h | 7 +++++++
> arch/powerpc/include/asm/ppc_asm.h | 24 ------------------------
> arch/powerpc/kernel/exceptions-64e.S | 1 -
> arch/powerpc/kernel/exceptions-64s.S | 5 -----
> 4 files changed, 7 insertions(+), 30 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/interrupt.h b/arch/powerpc/include/asm/interrupt.h
> index 6eba7c489753..e278dffe7657 100644
> --- a/arch/powerpc/include/asm/interrupt.h
> +++ b/arch/powerpc/include/asm/interrupt.h
> @@ -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();
Are interrupts still disabled here ? Otherwise you risk getting IRQ time accounted on user.
> + account_stolen_time();
> } else {
> /*
> * CT_WARN_ON comes here via program_check_exception,
> @@ -38,6 +42,9 @@ static inline void interrupt_enter_prepare(struct pt_regs *regs, struct interrup
> #ifdef CONFIG_PPC_BOOK3E_64
> state->ctx_state = exception_enter();
> #endif
> +
> + if (!IS_ENABLED(CONFIG_PPC_BOOK3S_64) && user_mode(regs))
> + account_cpu_user_entry();
Isn't this interrupt_enter_prepare() function called also on PPC32 ?
Have you removed the ACCOUNT_CPU_USER_ENTRY() from entry_32.S ?
> }
>
> /*
> diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h
> index cc1bca571332..3dceb64fc9af 100644
> --- a/arch/powerpc/include/asm/ppc_asm.h
> +++ b/arch/powerpc/include/asm/ppc_asm.h
> @@ -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 */ \
> @@ -44,29 +43,6 @@
> 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 */
>
> /*
> diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
> index 52421042a020..87b3e74ded41 100644
> --- a/arch/powerpc/kernel/exceptions-64e.S
> +++ b/arch/powerpc/kernel/exceptions-64e.S
> @@ -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 */ \
> diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
> index df4ee073386b..68505e35bcf7 100644
> --- a/arch/powerpc/kernel/exceptions-64s.S
> +++ b/arch/powerpc/kernel/exceptions-64s.S
> @@ -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 at 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
>
> /*
>
More information about the Linuxppc-dev
mailing list