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: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
4c87917029
commit
ee83655512
@ -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);
|
|||||||
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);
|
|||||||
*/
|
*/
|
||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user