Messages in this thread Patch in this message | | | Date | Fri, 26 Jun 2015 04:15:19 +0200 | From | Oleg Nesterov <> | Subject | [RFC PATCH 4/6] stop_machine: kill stop_cpus_mutex |
| |
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 <oleg@redhat.com> --- 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
| |