From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753273AbbFZCQs (ORCPT ); Thu, 25 Jun 2015 22:16:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33181 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751655AbbFZCQi (ORCPT ); Thu, 25 Jun 2015 22:16:38 -0400 Date: Fri, 26 Jun 2015 04:15:19 +0200 From: Oleg Nesterov To: Peter Zijlstra , paulmck@linux.vnet.ibm.com, tj@kernel.org, mingo@redhat.com, der.herr@hofr.at, dave@stgolabs.net, riel@redhat.com, viro@ZenIV.linux.org.uk, torvalds@linux-foundation.org Cc: linux-kernel@vger.kernel.org Subject: [RFC PATCH 4/6] stop_machine: kill stop_cpus_mutex Message-ID: <20150626021519.GA5707@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150626021455.GA5675@redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Change the users of stop_cpus_mutex to rely on stop_work_alloc() and stop_work_free(). This means that 2 stop_cpus() can run in parallel as long a their cpumask's do not overlap. Signed-off-by: Oleg Nesterov --- kernel/stop_machine.c | 16 ++++++---------- 1 files changed, 6 insertions(+), 10 deletions(-) diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c index 3d5d810..4b23875 100644 --- a/kernel/stop_machine.c +++ b/kernel/stop_machine.c @@ -343,9 +343,6 @@ void stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg, cpu_stop_queue_work(cpu, work_buf); } -/* static data for stop_cpus */ -static DEFINE_MUTEX(stop_cpus_mutex); - static void queue_stop_cpus_work(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg, struct cpu_stop_done *done) @@ -412,10 +409,9 @@ int stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg) { int ret; - /* static works are used, process one request at a time */ - mutex_lock(&stop_cpus_mutex); + stop_work_alloc(cpumask, true); ret = __stop_cpus(cpumask, fn, arg); - mutex_unlock(&stop_cpus_mutex); + stop_work_free(cpumask); return ret; } @@ -442,10 +438,10 @@ int try_stop_cpus(const struct cpumask *cpumask, cpu_stop_fn_t fn, void *arg) int ret; /* static works are used, process one request at a time */ - if (!mutex_trylock(&stop_cpus_mutex)) + if (!stop_work_alloc(cpumask, false)) return -EAGAIN; ret = __stop_cpus(cpumask, fn, arg); - mutex_unlock(&stop_cpus_mutex); + stop_work_free(cpumask); return ret; } @@ -643,7 +639,7 @@ int stop_machine_from_inactive_cpu(int (*fn)(void *), void *data, msdata.num_threads = num_active_cpus() + 1; /* +1 for local */ /* No proper task established and can't sleep - busy wait for lock. */ - while (!mutex_trylock(&stop_cpus_mutex)) + while (!stop_work_alloc(cpus, false)) cpu_relax(); /* Schedule work on other CPUs and execute directly for local CPU */ @@ -656,8 +652,8 @@ int stop_machine_from_inactive_cpu(int (*fn)(void *), void *data, /* Busy wait for completion. */ while (!completion_done(&done.completion)) cpu_relax(); + stop_work_free(cpus); - mutex_unlock(&stop_cpus_mutex); return ret ?: done.ret; } -- 1.5.5.1