From eba2131f34db2f28a2d3228db739fc87e78a4f48 Mon Sep 17 00:00:00 2001 From: "Shiratori, Takehiro" Date: Fri, 8 Mar 2019 20:55:58 +0900 Subject: [PATCH] clv: Change no_preempt from int to ihk_atomic_t. Fix the issue where the value of no_preempt gets unexpected value (-1, 1, 2 etc.) after process ends when running the UTI tests. Change-Id: I7d9c08b754a171ea3fdec20ab2e635df3b607cbd --- kernel/cls.c | 10 +++++----- kernel/include/cls.h | 2 +- kernel/include/kmalloc.h | 6 ++++-- kernel/process.c | 4 ++-- kernel/syscall.c | 3 ++- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/kernel/cls.c b/kernel/cls.c index bfa669c3..7e8981b5 100644 --- a/kernel/cls.c +++ b/kernel/cls.c @@ -66,15 +66,15 @@ void preempt_enable(void) { #ifndef ENABLE_FUGAKU_HACKS if (cpu_local_var_initialized) - --cpu_local_var(no_preempt); + ihk_atomic_dec(&cpu_local_var(no_preempt)); #else if (cpu_local_var_initialized) { - --cpu_local_var(no_preempt); + ihk_atomic_dec(&cpu_local_var(no_preempt)); - if (cpu_local_var(no_preempt) < 0) { + if (ihk_atomic_read(&cpu_local_var(no_preempt)) < 0) { //cpu_disable_interrupt(); - __kprintf("%s: %d\n", __func__, cpu_local_var(no_preempt)); + __kprintf("%s: %d\n", __func__, ihk_atomic_read(&cpu_local_var(no_preempt))); __kprintf("TID: %d, call stack from builtin frame (most recent first):\n", cpu_local_var(current)->tid); __show_context_stack(cpu_local_var(current), (uintptr_t)&preempt_enable, @@ -93,7 +93,7 @@ void preempt_enable(void) void preempt_disable(void) { if (cpu_local_var_initialized) { - ++cpu_local_var(no_preempt); + ihk_atomic_inc(&cpu_local_var(no_preempt)); } } diff --git a/kernel/include/cls.h b/kernel/include/cls.h index 0cd2ad11..6516718f 100644 --- a/kernel/include/cls.h +++ b/kernel/include/cls.h @@ -107,7 +107,7 @@ struct cpu_local_var { struct list_head migq; int in_interrupt; int in_page_fault; - int no_preempt; + ihk_atomic_t no_preempt; int timer_enabled; unsigned long nr_ctx_switches; int kmalloc_initialized; diff --git a/kernel/include/kmalloc.h b/kernel/include/kmalloc.h index a389ee7c..e7fb8526 100644 --- a/kernel/include/kmalloc.h +++ b/kernel/include/kmalloc.h @@ -19,8 +19,10 @@ #define kmalloc(size, flag) ({\ void *r = _kmalloc(size, flag, __FILE__, __LINE__);\ -if(r == NULL){\ -kprintf("kmalloc: out of memory %s:%d no_preempt=%d\n", __FILE__, __LINE__, cpu_local_var(no_preempt)); \ +if (r == NULL) {\ + kprintf("kmalloc: out of memory %s:%d no_preempt=%d\n", \ + __FILE__, __LINE__, \ + ihk_atomic_read(&cpu_local_var(no_preempt))); \ }\ r;\ }) diff --git a/kernel/process.c b/kernel/process.c index 6d3c1d27..6edf61e0 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -3726,9 +3726,9 @@ void schedule(void) int prevpid; unsigned long irqstate = 0; - if (cpu_local_var(no_preempt)) { + if (ihk_atomic_read(&cpu_local_var(no_preempt))) { kprintf("%s: WARNING can't schedule() while no preemption, cnt: %d\n", - __func__, cpu_local_var(no_preempt)); + __func__, ihk_atomic_read(&cpu_local_var(no_preempt))); irqstate = cpu_disable_interrupt_save(); ihk_mc_spinlock_lock_noirq( diff --git a/kernel/syscall.c b/kernel/syscall.c index b5ecdb05..d6509b6d 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -260,7 +260,8 @@ long do_syscall(struct syscall_request *req, int cpu) cpu_pause(); /* Spin if not preemptable */ - if (cpu_local_var(no_preempt) || !thread->tid) { + if (ihk_atomic_read(&cpu_local_var(no_preempt)) + || !thread->tid) { continue; }