@@ -54,7 +54,6 @@ struct io_worker {
5454 spinlock_t lock ;
5555
5656 struct completion ref_done ;
57- struct completion started ;
5857
5958 struct rcu_head rcu ;
6059};
@@ -116,7 +115,6 @@ struct io_wq {
116115 struct io_wq_hash * hash ;
117116
118117 refcount_t refs ;
119- struct completion started ;
120118 struct completion exited ;
121119
122120 atomic_t worker_refs ;
@@ -199,6 +197,7 @@ static void io_worker_exit(struct io_worker *worker)
199197 kfree_rcu (worker , rcu );
200198 if (atomic_dec_and_test (& wqe -> wq -> worker_refs ))
201199 complete (& wqe -> wq -> worker_done );
200+ do_exit (0 );
202201}
203202
204203static inline bool io_wqe_run_queue (struct io_wqe * wqe )
@@ -273,14 +272,6 @@ static void io_wqe_dec_running(struct io_worker *worker)
273272 io_wqe_wake_worker (wqe , acct );
274273}
275274
276- static void io_worker_start (struct io_worker * worker )
277- {
278- current -> flags |= PF_NOFREEZE ;
279- worker -> flags |= (IO_WORKER_F_UP | IO_WORKER_F_RUNNING );
280- io_wqe_inc_running (worker );
281- complete (& worker -> started );
282- }
283-
284275/*
285276 * Worker will start processing some work. Move it to the busy list, if
286277 * it's currently on the freelist
@@ -489,8 +480,13 @@ static int io_wqe_worker(void *data)
489480 struct io_worker * worker = data ;
490481 struct io_wqe * wqe = worker -> wqe ;
491482 struct io_wq * wq = wqe -> wq ;
483+ char buf [TASK_COMM_LEN ];
492484
493- io_worker_start (worker );
485+ worker -> flags |= (IO_WORKER_F_UP | IO_WORKER_F_RUNNING );
486+ io_wqe_inc_running (worker );
487+
488+ sprintf (buf , "iou-wrk-%d" , wq -> task_pid );
489+ set_task_comm (current , buf );
494490
495491 while (!test_bit (IO_WQ_BIT_EXIT , & wq -> state )) {
496492 set_current_state (TASK_INTERRUPTIBLE );
@@ -565,67 +561,11 @@ void io_wq_worker_sleeping(struct task_struct *tsk)
565561 raw_spin_unlock_irq (& worker -> wqe -> lock );
566562}
567563
568- static int task_thread (void * data , int index )
569- {
570- struct io_worker * worker = data ;
571- struct io_wqe * wqe = worker -> wqe ;
572- struct io_wqe_acct * acct = & wqe -> acct [index ];
573- struct io_wq * wq = wqe -> wq ;
574- char buf [TASK_COMM_LEN ];
575-
576- sprintf (buf , "iou-wrk-%d" , wq -> task_pid );
577- set_task_comm (current , buf );
578-
579- current -> pf_io_worker = worker ;
580- worker -> task = current ;
581-
582- set_cpus_allowed_ptr (current , cpumask_of_node (wqe -> node ));
583- current -> flags |= PF_NO_SETAFFINITY ;
584-
585- raw_spin_lock_irq (& wqe -> lock );
586- hlist_nulls_add_head_rcu (& worker -> nulls_node , & wqe -> free_list );
587- list_add_tail_rcu (& worker -> all_list , & wqe -> all_list );
588- worker -> flags |= IO_WORKER_F_FREE ;
589- if (index == IO_WQ_ACCT_BOUND )
590- worker -> flags |= IO_WORKER_F_BOUND ;
591- if (!acct -> nr_workers && (worker -> flags & IO_WORKER_F_BOUND ))
592- worker -> flags |= IO_WORKER_F_FIXED ;
593- acct -> nr_workers ++ ;
594- raw_spin_unlock_irq (& wqe -> lock );
595-
596- io_wqe_worker (data );
597- do_exit (0 );
598- }
599-
600- static int task_thread_bound (void * data )
601- {
602- return task_thread (data , IO_WQ_ACCT_BOUND );
603- }
604-
605- static int task_thread_unbound (void * data )
606- {
607- return task_thread (data , IO_WQ_ACCT_UNBOUND );
608- }
609-
610- pid_t io_wq_fork_thread (int (* fn )(void * ), void * arg )
611- {
612- unsigned long flags = CLONE_FS |CLONE_FILES |CLONE_SIGHAND |CLONE_THREAD |
613- CLONE_IO |SIGCHLD ;
614- struct kernel_clone_args args = {
615- .flags = ((lower_32_bits (flags ) | CLONE_VM |
616- CLONE_UNTRACED ) & ~CSIGNAL ),
617- .exit_signal = (lower_32_bits (flags ) & CSIGNAL ),
618- .stack = (unsigned long )fn ,
619- .stack_size = (unsigned long )arg ,
620- };
621-
622- return kernel_clone (& args );
623- }
624-
625564static bool create_io_worker (struct io_wq * wq , struct io_wqe * wqe , int index )
626565{
566+ struct io_wqe_acct * acct = & wqe -> acct [index ];
627567 struct io_worker * worker ;
628- pid_t pid ;
568+ struct task_struct * tsk ;
629569
630570 __set_current_state (TASK_RUNNING );
631571
@@ -638,21 +578,33 @@ static bool create_io_worker(struct io_wq *wq, struct io_wqe *wqe, int index)
638578 worker -> wqe = wqe ;
639579 spin_lock_init (& worker -> lock );
640580 init_completion (& worker -> ref_done );
641- init_completion (& worker -> started );
642581
643582 atomic_inc (& wq -> worker_refs );
644583
645- if (index == IO_WQ_ACCT_BOUND )
646- pid = io_wq_fork_thread (task_thread_bound , worker );
647- else
648- pid = io_wq_fork_thread (task_thread_unbound , worker );
649- if (pid < 0 ) {
584+ tsk = create_io_thread (io_wqe_worker , worker , wqe -> node );
585+ if (IS_ERR (tsk )) {
650586 if (atomic_dec_and_test (& wq -> worker_refs ))
651587 complete (& wq -> worker_done );
652588 kfree (worker );
653589 return false;
654590 }
655- wait_for_completion (& worker -> started );
591+
592+ tsk -> pf_io_worker = worker ;
593+ worker -> task = tsk ;
594+ set_cpus_allowed_ptr (tsk , cpumask_of_node (wqe -> node ));
595+ tsk -> flags |= PF_NOFREEZE | PF_NO_SETAFFINITY ;
596+
597+ raw_spin_lock_irq (& wqe -> lock );
598+ hlist_nulls_add_head_rcu (& worker -> nulls_node , & wqe -> free_list );
599+ list_add_tail_rcu (& worker -> all_list , & wqe -> all_list );
600+ worker -> flags |= IO_WORKER_F_FREE ;
601+ if (index == IO_WQ_ACCT_BOUND )
602+ worker -> flags |= IO_WORKER_F_BOUND ;
603+ if (!acct -> nr_workers && (worker -> flags & IO_WORKER_F_BOUND ))
604+ worker -> flags |= IO_WORKER_F_FIXED ;
605+ acct -> nr_workers ++ ;
606+ raw_spin_unlock_irq (& wqe -> lock );
607+ wake_up_new_task (tsk );
656608 return true;
657609}
658610
@@ -696,6 +648,7 @@ static bool io_wq_for_each_worker(struct io_wqe *wqe,
696648
697649static bool io_wq_worker_wake (struct io_worker * worker , void * data )
698650{
651+ set_notify_signal (worker -> task );
699652 wake_up_process (worker -> task );
700653 return false;
701654}
@@ -752,10 +705,6 @@ static int io_wq_manager(void *data)
752705
753706 sprintf (buf , "iou-mgr-%d" , wq -> task_pid );
754707 set_task_comm (current , buf );
755- current -> flags |= PF_IO_WORKER ;
756- wq -> manager = get_task_struct (current );
757-
758- complete (& wq -> started );
759708
760709 do {
761710 set_current_state (TASK_INTERRUPTIBLE );
@@ -815,21 +764,20 @@ static void io_wqe_insert_work(struct io_wqe *wqe, struct io_wq_work *work)
815764
816765static int io_wq_fork_manager (struct io_wq * wq )
817766{
818- int ret ;
767+ struct task_struct * tsk ;
819768
820769 if (wq -> manager )
821770 return 0 ;
822771
823772 reinit_completion (& wq -> worker_done );
824- current -> flags |= PF_IO_WORKER ;
825- ret = io_wq_fork_thread (io_wq_manager , wq );
826- current -> flags &= ~PF_IO_WORKER ;
827- if (ret >= 0 ) {
828- wait_for_completion (& wq -> started );
773+ tsk = create_io_thread (io_wq_manager , wq , NUMA_NO_NODE );
774+ if (!IS_ERR (tsk )) {
775+ wq -> manager = get_task_struct (tsk );
776+ wake_up_new_task (tsk );
829777 return 0 ;
830778 }
831779
832- return ret ;
780+ return PTR_ERR ( tsk ) ;
833781}
834782
835783static void io_wqe_enqueue (struct io_wqe * wqe , struct io_wq_work * work )
@@ -1062,7 +1010,6 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data)
10621010 }
10631011
10641012 wq -> task_pid = current -> pid ;
1065- init_completion (& wq -> started );
10661013 init_completion (& wq -> exited );
10671014 refcount_set (& wq -> refs , 1 );
10681015
0 commit comments