[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