Commit ee836555 authored by Steffen Klassert's avatar Steffen Klassert Committed by Herbert Xu

padata: Block until the instance is unused on stop

This patch makes padata_stop to block until the padata
instance is unused. Also we split padata_stop to a locked
and a unlocked version. This is in preparation to be able
to change the cpumask after a call to patata stop.
Signed-off-by: 's avatarSteffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: 's avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 4c879170
...@@ -490,6 +490,20 @@ static void __padata_start(struct padata_instance *pinst) ...@@ -490,6 +490,20 @@ static void __padata_start(struct padata_instance *pinst)
pinst->flags |= PADATA_INIT; pinst->flags |= PADATA_INIT;
} }
static void __padata_stop(struct padata_instance *pinst)
{
if (!(pinst->flags & PADATA_INIT))
return;
pinst->flags &= ~PADATA_INIT;
synchronize_rcu();
get_online_cpus();
padata_flush_queues(pinst->pd);
put_online_cpus();
}
/* Replace the internal control stucture with a new one. */ /* Replace the internal control stucture with a new one. */
static void padata_replace(struct padata_instance *pinst, static void padata_replace(struct padata_instance *pinst,
struct parallel_data *pd_new) struct parallel_data *pd_new)
...@@ -649,7 +663,7 @@ EXPORT_SYMBOL(padata_start); ...@@ -649,7 +663,7 @@ EXPORT_SYMBOL(padata_start);
void padata_stop(struct padata_instance *pinst) void padata_stop(struct padata_instance *pinst)
{ {
mutex_lock(&pinst->lock); mutex_lock(&pinst->lock);
pinst->flags &= ~PADATA_INIT; __padata_stop(pinst);
mutex_unlock(&pinst->lock); mutex_unlock(&pinst->lock);
} }
EXPORT_SYMBOL(padata_stop); EXPORT_SYMBOL(padata_stop);
...@@ -770,17 +784,11 @@ EXPORT_SYMBOL(padata_alloc); ...@@ -770,17 +784,11 @@ EXPORT_SYMBOL(padata_alloc);
*/ */
void padata_free(struct padata_instance *pinst) void padata_free(struct padata_instance *pinst)
{ {
padata_stop(pinst);
synchronize_rcu();
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
unregister_hotcpu_notifier(&pinst->cpu_notifier); unregister_hotcpu_notifier(&pinst->cpu_notifier);
#endif #endif
get_online_cpus();
padata_flush_queues(pinst->pd);
put_online_cpus();
padata_stop(pinst);
padata_free_pd(pinst->pd); padata_free_pd(pinst->pd);
free_cpumask_var(pinst->cpumask); free_cpumask_var(pinst->cpumask);
kfree(pinst); kfree(pinst);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment