소스 검색

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>
Steffen Klassert 15 년 전
부모
커밋
ee83655512
1개의 변경된 파일16개의 추가작업 그리고 8개의 파일을 삭제
  1. 16 8
      kernel/padata.c

+ 16 - 8
kernel/padata.c

@@ -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);