rcu/exp: Move expedited kthread worker creation functions above rcutree_prepare_cpu()
[linux-2.6-microblaze.git] / kernel / rcu / tree.c
index cdb8083..657ac12 100644 (file)
@@ -4394,6 +4394,54 @@ rcu_boot_init_percpu_data(int cpu)
        rcu_boot_init_nocb_percpu_data(rdp);
 }
 
+#ifdef CONFIG_RCU_EXP_KTHREAD
+struct kthread_worker *rcu_exp_gp_kworker;
+struct kthread_worker *rcu_exp_par_gp_kworker;
+
+static void __init rcu_start_exp_gp_kworkers(void)
+{
+       const char *par_gp_kworker_name = "rcu_exp_par_gp_kthread_worker";
+       const char *gp_kworker_name = "rcu_exp_gp_kthread_worker";
+       struct sched_param param = { .sched_priority = kthread_prio };
+
+       rcu_exp_gp_kworker = kthread_create_worker(0, gp_kworker_name);
+       if (IS_ERR_OR_NULL(rcu_exp_gp_kworker)) {
+               pr_err("Failed to create %s!\n", gp_kworker_name);
+               rcu_exp_gp_kworker = NULL;
+               return;
+       }
+
+       rcu_exp_par_gp_kworker = kthread_create_worker(0, par_gp_kworker_name);
+       if (IS_ERR_OR_NULL(rcu_exp_par_gp_kworker)) {
+               pr_err("Failed to create %s!\n", par_gp_kworker_name);
+               rcu_exp_par_gp_kworker = NULL;
+               kthread_destroy_worker(rcu_exp_gp_kworker);
+               rcu_exp_gp_kworker = NULL;
+               return;
+       }
+
+       sched_setscheduler_nocheck(rcu_exp_gp_kworker->task, SCHED_FIFO, &param);
+       sched_setscheduler_nocheck(rcu_exp_par_gp_kworker->task, SCHED_FIFO,
+                                  &param);
+}
+
+static inline void rcu_alloc_par_gp_wq(void)
+{
+}
+#else /* !CONFIG_RCU_EXP_KTHREAD */
+struct workqueue_struct *rcu_par_gp_wq;
+
+static void __init rcu_start_exp_gp_kworkers(void)
+{
+}
+
+static inline void rcu_alloc_par_gp_wq(void)
+{
+       rcu_par_gp_wq = alloc_workqueue("rcu_par_gp", WQ_MEM_RECLAIM, 0);
+       WARN_ON(!rcu_par_gp_wq);
+}
+#endif /* CONFIG_RCU_EXP_KTHREAD */
+
 /*
  * Invoked early in the CPU-online process, when pretty much all services
  * are available.  The incoming CPU is not present.
@@ -4730,54 +4778,6 @@ static int rcu_pm_notify(struct notifier_block *self,
        return NOTIFY_OK;
 }
 
-#ifdef CONFIG_RCU_EXP_KTHREAD
-struct kthread_worker *rcu_exp_gp_kworker;
-struct kthread_worker *rcu_exp_par_gp_kworker;
-
-static void __init rcu_start_exp_gp_kworkers(void)
-{
-       const char *par_gp_kworker_name = "rcu_exp_par_gp_kthread_worker";
-       const char *gp_kworker_name = "rcu_exp_gp_kthread_worker";
-       struct sched_param param = { .sched_priority = kthread_prio };
-
-       rcu_exp_gp_kworker = kthread_create_worker(0, gp_kworker_name);
-       if (IS_ERR_OR_NULL(rcu_exp_gp_kworker)) {
-               pr_err("Failed to create %s!\n", gp_kworker_name);
-               rcu_exp_gp_kworker = NULL;
-               return;
-       }
-
-       rcu_exp_par_gp_kworker = kthread_create_worker(0, par_gp_kworker_name);
-       if (IS_ERR_OR_NULL(rcu_exp_par_gp_kworker)) {
-               pr_err("Failed to create %s!\n", par_gp_kworker_name);
-               rcu_exp_par_gp_kworker = NULL;
-               kthread_destroy_worker(rcu_exp_gp_kworker);
-               rcu_exp_gp_kworker = NULL;
-               return;
-       }
-
-       sched_setscheduler_nocheck(rcu_exp_gp_kworker->task, SCHED_FIFO, &param);
-       sched_setscheduler_nocheck(rcu_exp_par_gp_kworker->task, SCHED_FIFO,
-                                  &param);
-}
-
-static inline void rcu_alloc_par_gp_wq(void)
-{
-}
-#else /* !CONFIG_RCU_EXP_KTHREAD */
-struct workqueue_struct *rcu_par_gp_wq;
-
-static void __init rcu_start_exp_gp_kworkers(void)
-{
-}
-
-static inline void rcu_alloc_par_gp_wq(void)
-{
-       rcu_par_gp_wq = alloc_workqueue("rcu_par_gp", WQ_MEM_RECLAIM, 0);
-       WARN_ON(!rcu_par_gp_wq);
-}
-#endif /* CONFIG_RCU_EXP_KTHREAD */
-
 /*
  * Spawn the kthreads that handle RCU's grace periods.
  */