From 7aa2d6429468c92fb1299a4dd00d4e95b4c1ce2d Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Tue, 13 Aug 2019 15:03:00 +0900 Subject: [PATCH] obtain_clone_cpuid(): avoid locking while partitioned execution Change-Id: Iabb4784835be7dc9b2f555acc3a711fcc23ee7da --- arch/arm64/kernel/syscall.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index c494df1f..b3ade1fa 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c @@ -59,9 +59,11 @@ int obtain_clone_cpuid(cpu_set_t *cpu_set, int use_last) { int min_queue_len = -1; int cpu, min_cpu = -1, uti_cpu = -1; - unsigned long irqstate; + unsigned long irqstate = 0; - irqstate = ihk_mc_spinlock_lock(&runq_reservation_lock); + if (!cpu_local_var(current)->proc->nr_processes) { + irqstate = ihk_mc_spinlock_lock(&runq_reservation_lock); + } /* Find the first allowed core with the shortest run queue */ for (cpu = 0; cpu < num_processors; ++cpu) { @@ -104,7 +106,10 @@ int obtain_clone_cpuid(cpu_set_t *cpu_set, int use_last) __sync_fetch_and_add(&get_cpu_local_var(min_cpu)->runq_reserved, 1); } - ihk_mc_spinlock_unlock(&runq_reservation_lock, irqstate); + + if (!cpu_local_var(current)->proc->nr_processes) { + ihk_mc_spinlock_unlock(&runq_reservation_lock, irqstate); + } return min_cpu; }