mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
powerpc/64: entry cpu time accounting in C
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
This commit is contained in:
parent
2994e1babf
commit
56acfdd8bf
4 changed files with 6 additions and 30 deletions
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include <linux/context_tracking.h>
|
#include <linux/context_tracking.h>
|
||||||
#include <linux/hardirq.h>
|
#include <linux/hardirq.h>
|
||||||
|
#include <asm/cputime.h>
|
||||||
#include <asm/ftrace.h>
|
#include <asm/ftrace.h>
|
||||||
|
|
||||||
struct interrupt_state {
|
struct interrupt_state {
|
||||||
|
@ -25,6 +26,9 @@ static inline void interrupt_enter_prepare(struct pt_regs *regs, struct interrup
|
||||||
if (user_mode(regs)) {
|
if (user_mode(regs)) {
|
||||||
CT_WARN_ON(ct_state() != CONTEXT_USER);
|
CT_WARN_ON(ct_state() != CONTEXT_USER);
|
||||||
user_exit_irqoff();
|
user_exit_irqoff();
|
||||||
|
|
||||||
|
account_cpu_user_entry();
|
||||||
|
account_stolen_time();
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* CT_WARN_ON comes here via program_check_exception,
|
* 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
|
#ifdef CONFIG_PPC_BOOK3E_64
|
||||||
state->ctx_state = exception_enter();
|
state->ctx_state = exception_enter();
|
||||||
|
if (user_mode(regs))
|
||||||
|
account_cpu_user_entry();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
|
#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
|
||||||
#define ACCOUNT_CPU_USER_ENTRY(ptr, ra, rb)
|
#define ACCOUNT_CPU_USER_ENTRY(ptr, ra, rb)
|
||||||
#define ACCOUNT_CPU_USER_EXIT(ptr, ra, rb)
|
#define ACCOUNT_CPU_USER_EXIT(ptr, ra, rb)
|
||||||
#define ACCOUNT_STOLEN_TIME
|
|
||||||
#else
|
#else
|
||||||
#define ACCOUNT_CPU_USER_ENTRY(ptr, ra, rb) \
|
#define ACCOUNT_CPU_USER_ENTRY(ptr, ra, rb) \
|
||||||
MFTB(ra); /* get timebase */ \
|
MFTB(ra); /* get timebase */ \
|
||||||
|
@ -44,29 +43,6 @@
|
||||||
PPC_LL ra, ACCOUNT_SYSTEM_TIME(ptr); \
|
PPC_LL ra, ACCOUNT_SYSTEM_TIME(ptr); \
|
||||||
add ra,ra,rb; /* add on to system time */ \
|
add ra,ra,rb; /* add on to system time */ \
|
||||||
PPC_STL ra, ACCOUNT_SYSTEM_TIME(ptr)
|
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 */
|
#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -398,7 +398,6 @@ exc_##n##_common: \
|
||||||
std r10,_NIP(r1); /* save SRR0 to stackframe */ \
|
std r10,_NIP(r1); /* save SRR0 to stackframe */ \
|
||||||
std r11,_MSR(r1); /* save SRR1 to stackframe */ \
|
std r11,_MSR(r1); /* save SRR1 to stackframe */ \
|
||||||
beq 2f; /* if from kernel mode */ \
|
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 */ \
|
2: ld r3,excf+EX_R10(r13); /* get back r10 */ \
|
||||||
ld r4,excf+EX_R11(r13); /* get back r11 */ \
|
ld r4,excf+EX_R11(r13); /* get back r11 */ \
|
||||||
mfspr r5,scratch; /* get back r13 */ \
|
mfspr r5,scratch; /* get back r13 */ \
|
||||||
|
|
|
@ -577,7 +577,6 @@ DEFINE_FIXED_SYMBOL(\name\()_common_real)
|
||||||
kuap_save_amr_and_lock r9, r10, cr1, cr0
|
kuap_save_amr_and_lock r9, r10, cr1, cr0
|
||||||
.endif
|
.endif
|
||||||
beq 101f /* if from kernel mode */
|
beq 101f /* if from kernel mode */
|
||||||
ACCOUNT_CPU_USER_ENTRY(r13, r9, r10)
|
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
ld r9,IAREA+EX_PPR(r13) /* Read PPR from paca */
|
ld r9,IAREA+EX_PPR(r13) /* Read PPR from paca */
|
||||||
std r9,_PPR(r1)
|
std r9,_PPR(r1)
|
||||||
|
@ -645,10 +644,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
|
||||||
ld r11,exception_marker@toc(r2)
|
ld r11,exception_marker@toc(r2)
|
||||||
std r10,RESULT(r1) /* clear regs->result */
|
std r10,RESULT(r1) /* clear regs->result */
|
||||||
std r11,STACK_FRAME_OVERHEAD-16(r1) /* mark the frame */
|
std r11,STACK_FRAME_OVERHEAD-16(r1) /* mark the frame */
|
||||||
|
|
||||||
.if ISTACK
|
|
||||||
ACCOUNT_STOLEN_TIME
|
|
||||||
.endif
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue