From dc1f96fee386bf66113e65159a1ab078d2389906 Mon Sep 17 00:00:00 2001 From: "Shiratori, Takehiro" Date: Thu, 22 Nov 2018 17:17:39 +0900 Subject: [PATCH] Add set_cputime() kernel to kernel case and mode enum. Change-Id: Id4584389f39f255335d3bf7b5606f054f108ad51 Fujitsu: POSTK_DEBUG_TEMP_FIX_84 --- arch/x86_64/kernel/cpu.c | 24 ++++++++++++++++-------- kernel/include/syscall.h | 8 +++++++- kernel/mem.c | 6 ++++-- kernel/syscall.c | 23 +++++++++-------------- 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/arch/x86_64/kernel/cpu.c b/arch/x86_64/kernel/cpu.c index dacb16c3..b4cae14c 100644 --- a/arch/x86_64/kernel/cpu.c +++ b/arch/x86_64/kernel/cpu.c @@ -889,7 +889,8 @@ void handle_interrupt(int vector, struct x86_user_context *regs) lapic_ack(); ++v->in_interrupt; - set_cputime(interrupt_from_user(regs)? 1: 2); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_U2K : CPUTIME_MODE_K2K_IN); dkprintf("CPU[%d] got interrupt, vector: %d, RIP: 0x%lX\n", ihk_mc_get_processor_id(), vector, regs->gpr.rip); @@ -1004,7 +1005,8 @@ void handle_interrupt(int vector, struct x86_user_context *regs) } interrupt_exit(regs); - set_cputime(interrupt_from_user(regs)? 0: 1); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_K2U : CPUTIME_MODE_K2K_OUT); --v->in_interrupt; @@ -1017,7 +1019,8 @@ void handle_interrupt(int vector, struct x86_user_context *regs) void gpe_handler(struct x86_user_context *regs) { - set_cputime(interrupt_from_user(regs)? 1: 2); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_U2K : CPUTIME_MODE_K2K_IN); kprintf("General protection fault (err: %lx, %lx:%lx)\n", regs->gpr.error, regs->gpr.cs, regs->gpr.rip); arch_show_interrupt_context(regs); @@ -1026,7 +1029,8 @@ void gpe_handler(struct x86_user_context *regs) } set_signal(SIGSEGV, regs, NULL); interrupt_exit(regs); - set_cputime(interrupt_from_user(regs)? 0: 1); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_K2U : CPUTIME_MODE_K2K_OUT); panic("GPF"); } @@ -1036,7 +1040,8 @@ void debug_handler(struct x86_user_context *regs) int si_code = 0; struct siginfo info; - set_cputime(interrupt_from_user(regs)? 1: 2); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_U2K : CPUTIME_MODE_K2K_IN); #ifdef DEBUG_PRINT_CPU kprintf("debug exception (err: %lx, %lx:%lx)\n", regs->gpr.error, regs->gpr.cs, regs->gpr.rip); @@ -1055,14 +1060,16 @@ void debug_handler(struct x86_user_context *regs) info.si_code = si_code; set_signal(SIGTRAP, regs, &info); interrupt_exit(regs); - set_cputime(interrupt_from_user(regs)? 0: 1); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_K2U : CPUTIME_MODE_K2K_OUT); } void int3_handler(struct x86_user_context *regs) { struct siginfo info; - set_cputime(interrupt_from_user(regs)? 1: 2); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_U2K : CPUTIME_MODE_K2K_IN); #ifdef DEBUG_PRINT_CPU kprintf("int3 exception (err: %lx, %lx:%lx)\n", regs->gpr.error, regs->gpr.cs, regs->gpr.rip); @@ -1073,7 +1080,8 @@ void int3_handler(struct x86_user_context *regs) info.si_code = TRAP_BRKPT; set_signal(SIGTRAP, regs, &info); interrupt_exit(regs); - set_cputime(interrupt_from_user(regs)? 0: 1); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_K2U : CPUTIME_MODE_K2K_OUT); } void diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index 5871fd69..c5c34526 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -465,7 +465,13 @@ static inline unsigned long timespec_to_jiffy(const struct timespec *ats) } void reset_cputime(void); -void set_cputime(int mode); +enum set_cputime_mode { + CPUTIME_MODE_K2U = 0, + CPUTIME_MODE_U2K, + CPUTIME_MODE_K2K_IN, + CPUTIME_MODE_K2K_OUT, +}; +void set_cputime(enum set_cputime_mode mode); int do_munmap(void *addr, size_t len, int holding_memory_range_lock); intptr_t do_mmap(uintptr_t addr0, size_t len0, int prot, int flags, int fd, off_t off0); diff --git a/kernel/mem.c b/kernel/mem.c index fa2e347f..1e0d8f8d 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -1158,7 +1158,8 @@ static void page_fault_handler(void *fault_addr, uint64_t reason, void *regs) t_s = rdtsc(); #endif // PROFILE_ENABLE - set_cputime(interrupt_from_user(regs)? 1: 2); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_U2K : CPUTIME_MODE_K2K_IN); dkprintf("%s: addr: %p, reason: %lx, regs: %p\n", __FUNCTION__, fault_addr, reason, regs); @@ -1219,7 +1220,8 @@ out: check_need_resched(); check_signal(0, regs, -1); } - set_cputime(interrupt_from_user(regs)? 0: 1); + set_cputime(interrupt_from_user(regs) ? + CPUTIME_MODE_K2U : CPUTIME_MODE_K2K_OUT); #ifdef PROFILE_ENABLE if (thread->profile) profile_event_add(PROFILE_page_fault, (rdtsc() - t_s)); diff --git a/kernel/syscall.c b/kernel/syscall.c index 9d18d605..c652f3ba 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -9574,13 +9574,8 @@ reset_cputime() thread->base_tsc = 0; } -/** - * mode == 0: kernel -> user - * mode == 1: user -> kernel - * mode == 2: kernel -> kernel - */ void -set_cputime(int mode) +set_cputime(enum set_cputime_mode mode) { struct thread *thread; unsigned long tsc; @@ -9597,10 +9592,10 @@ set_cputime(int mode) if(thread == &v->idle) return; monitor = v->monitor; - if(mode == 0){ + if (mode == CPUTIME_MODE_K2U) { monitor->status = IHK_OS_MONITOR_USER; } - else if(mode == 1){ + else if (mode == CPUTIME_MODE_U2K) { monitor->counter++; monitor->status = IHK_OS_MONITOR_KERNEL; } @@ -9617,7 +9612,7 @@ set_cputime(int mode) struct timespec dts; tsc_to_ts(dtsc, &dts); - if(mode == 1){ + if (mode == CPUTIME_MODE_U2K) { thread->user_tsc += dtsc; v->rusage->user_tsc += dtsc; ts_add(&thread->itimer_virtual_value, &dts); @@ -9630,7 +9625,7 @@ set_cputime(int mode) } } - if(mode == 2){ + if (mode == CPUTIME_MODE_K2K_IN) { thread->base_tsc = 0; } else{ @@ -9638,7 +9633,7 @@ set_cputime(int mode) } thread->times_update = 1; - thread->in_kernel = mode; + thread->in_kernel = (int)mode; if(thread->itimer_enabled){ struct timeval tv; @@ -9703,7 +9698,7 @@ long syscall(int num, ihk_mc_user_context_t *ctx) #ifdef DISABLE_SCHED_YIELD if (num != __NR_sched_yield) #endif // DISABLE_SCHED_YIELD - set_cputime(1); + set_cputime(CPUTIME_MODE_U2K); //kprintf("syscall=%d\n", num); #ifdef PROFILE_ENABLE @@ -9718,7 +9713,7 @@ long syscall(int num, ihk_mc_user_context_t *ctx) (num != __NR_exit && num != __NR_exit_group)){ save_syscall_return_value(num, -EINVAL); check_signal(-EINVAL, NULL, -1); - set_cputime(0); + set_cputime(CPUTIME_MODE_K2U); return -EINVAL; } @@ -9812,7 +9807,7 @@ long syscall(int num, ihk_mc_user_context_t *ctx) #ifdef DISABLE_SCHED_YIELD if (num != __NR_sched_yield) #endif // DISABLE_SCHED_YIELD - set_cputime(0); + set_cputime(CPUTIME_MODE_K2U); if (thread->proc->nohost) { // mcexec termination was detected terminate(0, SIGKILL);