@@ -4394,6 +4394,54 @@ rcu_boot_init_percpu_data(int cpu)
4394
4394
rcu_boot_init_nocb_percpu_data (rdp );
4395
4395
}
4396
4396
4397
+ #ifdef CONFIG_RCU_EXP_KTHREAD
4398
+ struct kthread_worker * rcu_exp_gp_kworker ;
4399
+ struct kthread_worker * rcu_exp_par_gp_kworker ;
4400
+
4401
+ static void __init rcu_start_exp_gp_kworkers (void )
4402
+ {
4403
+ const char * par_gp_kworker_name = "rcu_exp_par_gp_kthread_worker" ;
4404
+ const char * gp_kworker_name = "rcu_exp_gp_kthread_worker" ;
4405
+ struct sched_param param = { .sched_priority = kthread_prio };
4406
+
4407
+ rcu_exp_gp_kworker = kthread_create_worker (0 , gp_kworker_name );
4408
+ if (IS_ERR_OR_NULL (rcu_exp_gp_kworker )) {
4409
+ pr_err ("Failed to create %s!\n" , gp_kworker_name );
4410
+ rcu_exp_gp_kworker = NULL ;
4411
+ return ;
4412
+ }
4413
+
4414
+ rcu_exp_par_gp_kworker = kthread_create_worker (0 , par_gp_kworker_name );
4415
+ if (IS_ERR_OR_NULL (rcu_exp_par_gp_kworker )) {
4416
+ pr_err ("Failed to create %s!\n" , par_gp_kworker_name );
4417
+ rcu_exp_par_gp_kworker = NULL ;
4418
+ kthread_destroy_worker (rcu_exp_gp_kworker );
4419
+ rcu_exp_gp_kworker = NULL ;
4420
+ return ;
4421
+ }
4422
+
4423
+ sched_setscheduler_nocheck (rcu_exp_gp_kworker -> task , SCHED_FIFO , & param );
4424
+ sched_setscheduler_nocheck (rcu_exp_par_gp_kworker -> task , SCHED_FIFO ,
4425
+ & param );
4426
+ }
4427
+
4428
+ static inline void rcu_alloc_par_gp_wq (void )
4429
+ {
4430
+ }
4431
+ #else /* !CONFIG_RCU_EXP_KTHREAD */
4432
+ struct workqueue_struct * rcu_par_gp_wq ;
4433
+
4434
+ static void __init rcu_start_exp_gp_kworkers (void )
4435
+ {
4436
+ }
4437
+
4438
+ static inline void rcu_alloc_par_gp_wq (void )
4439
+ {
4440
+ rcu_par_gp_wq = alloc_workqueue ("rcu_par_gp" , WQ_MEM_RECLAIM , 0 );
4441
+ WARN_ON (!rcu_par_gp_wq );
4442
+ }
4443
+ #endif /* CONFIG_RCU_EXP_KTHREAD */
4444
+
4397
4445
/*
4398
4446
* Invoked early in the CPU-online process, when pretty much all services
4399
4447
* are available. The incoming CPU is not present.
@@ -4730,54 +4778,6 @@ static int rcu_pm_notify(struct notifier_block *self,
4730
4778
return NOTIFY_OK ;
4731
4779
}
4732
4780
4733
- #ifdef CONFIG_RCU_EXP_KTHREAD
4734
- struct kthread_worker * rcu_exp_gp_kworker ;
4735
- struct kthread_worker * rcu_exp_par_gp_kworker ;
4736
-
4737
- static void __init rcu_start_exp_gp_kworkers (void )
4738
- {
4739
- const char * par_gp_kworker_name = "rcu_exp_par_gp_kthread_worker" ;
4740
- const char * gp_kworker_name = "rcu_exp_gp_kthread_worker" ;
4741
- struct sched_param param = { .sched_priority = kthread_prio };
4742
-
4743
- rcu_exp_gp_kworker = kthread_create_worker (0 , gp_kworker_name );
4744
- if (IS_ERR_OR_NULL (rcu_exp_gp_kworker )) {
4745
- pr_err ("Failed to create %s!\n" , gp_kworker_name );
4746
- rcu_exp_gp_kworker = NULL ;
4747
- return ;
4748
- }
4749
-
4750
- rcu_exp_par_gp_kworker = kthread_create_worker (0 , par_gp_kworker_name );
4751
- if (IS_ERR_OR_NULL (rcu_exp_par_gp_kworker )) {
4752
- pr_err ("Failed to create %s!\n" , par_gp_kworker_name );
4753
- rcu_exp_par_gp_kworker = NULL ;
4754
- kthread_destroy_worker (rcu_exp_gp_kworker );
4755
- rcu_exp_gp_kworker = NULL ;
4756
- return ;
4757
- }
4758
-
4759
- sched_setscheduler_nocheck (rcu_exp_gp_kworker -> task , SCHED_FIFO , & param );
4760
- sched_setscheduler_nocheck (rcu_exp_par_gp_kworker -> task , SCHED_FIFO ,
4761
- & param );
4762
- }
4763
-
4764
- static inline void rcu_alloc_par_gp_wq (void )
4765
- {
4766
- }
4767
- #else /* !CONFIG_RCU_EXP_KTHREAD */
4768
- struct workqueue_struct * rcu_par_gp_wq ;
4769
-
4770
- static void __init rcu_start_exp_gp_kworkers (void )
4771
- {
4772
- }
4773
-
4774
- static inline void rcu_alloc_par_gp_wq (void )
4775
- {
4776
- rcu_par_gp_wq = alloc_workqueue ("rcu_par_gp" , WQ_MEM_RECLAIM , 0 );
4777
- WARN_ON (!rcu_par_gp_wq );
4778
- }
4779
- #endif /* CONFIG_RCU_EXP_KTHREAD */
4780
-
4781
4781
/*
4782
4782
* Spawn the kthreads that handle RCU's grace periods.
4783
4783
*/
0 commit comments