Lines Matching refs:wq
106 struct io_wq *wq; member
143 static bool create_io_worker(struct io_wq *wq, struct io_wqe *wqe, int index);
149 static void io_wq_cancel_tw_create(struct io_wq *wq);
178 static void io_worker_ref_put(struct io_wq *wq) in io_worker_ref_put() argument
180 if (atomic_dec_and_test(&wq->worker_refs)) in io_worker_ref_put()
181 complete(&wq->worker_done); in io_worker_ref_put()
188 struct io_wq *wq = wqe->wq; in io_worker_cancel_cb() local
194 io_worker_ref_put(wq); in io_worker_cancel_cb()
212 struct io_wq *wq = wqe->wq; in io_worker_exit() local
215 struct callback_head *cb = task_work_cancel_match(wq->task, in io_worker_exit()
238 io_worker_ref_put(wqe->wq); in io_worker_exit()
309 atomic_inc(&wqe->wq->worker_refs); in io_wqe_create_worker()
310 return create_io_worker(wqe->wq, wqe, acct->index); in io_wqe_create_worker()
323 struct io_wq *wq; in create_worker_cb() local
330 wq = wqe->wq; in create_worker_cb()
339 create_io_worker(wq, wqe, worker->create_index); in create_worker_cb()
342 io_worker_ref_put(wq); in create_worker_cb()
353 struct io_wq *wq = wqe->wq; in io_queue_worker_create() local
356 if (test_bit(IO_WQ_BIT_EXIT, &wq->state)) in io_queue_worker_create()
370 atomic_inc(&wq->worker_refs); in io_queue_worker_create()
373 if (!task_work_add(wq->task, &worker->create_work, TWA_SIGNAL)) { in io_queue_worker_create()
380 if (test_bit(IO_WQ_BIT_EXIT, &wq->state)) in io_queue_worker_create()
381 io_wq_cancel_tw_create(wq); in io_queue_worker_create()
382 io_worker_ref_put(wq); in io_queue_worker_create()
385 io_worker_ref_put(wq); in io_queue_worker_create()
391 io_worker_ref_put(wq); in io_queue_worker_create()
409 atomic_inc(&wqe->wq->worker_refs); in io_wqe_dec_running()
450 struct io_wq *wq = wqe->wq; in io_wait_on_hash() local
453 spin_lock_irq(&wq->hash->wait.lock); in io_wait_on_hash()
455 __add_wait_queue(&wq->hash->wait, &wqe->wait); in io_wait_on_hash()
456 if (!test_bit(hash, &wq->hash->map)) { in io_wait_on_hash()
462 spin_unlock_irq(&wq->hash->wait.lock); in io_wait_on_hash()
491 if (!test_and_set_bit(hash, &wqe->wq->hash->map)) { in io_get_next_work()
515 if (wq_has_sleeper(&wqe->wq->hash->wait)) in io_get_next_work()
516 wake_up(&wqe->wq->hash->wait); in io_get_next_work()
543 struct io_wq *wq = wqe->wq; in io_worker_handle_work() local
544 bool do_kill = test_bit(IO_WQ_BIT_EXIT, &wq->state); in io_worker_handle_work()
587 wq->do_work(work); in io_worker_handle_work()
590 linked = wq->free_work(work); in io_worker_handle_work()
602 spin_lock_irq(&wq->hash->wait.lock); in io_worker_handle_work()
603 clear_bit(hash, &wq->hash->map); in io_worker_handle_work()
605 spin_unlock_irq(&wq->hash->wait.lock); in io_worker_handle_work()
606 if (wq_has_sleeper(&wq->hash->wait)) in io_worker_handle_work()
607 wake_up(&wq->hash->wait); in io_worker_handle_work()
618 struct io_wq *wq = wqe->wq; in io_wqe_worker() local
624 snprintf(buf, sizeof(buf), "iou-wrk-%d", wq->task->pid); in io_wqe_worker()
627 while (!test_bit(IO_WQ_BIT_EXIT, &wq->state)) { in io_wqe_worker()
658 if (test_bit(IO_WQ_BIT_EXIT, &wq->state)) in io_wqe_worker()
774 io_worker_ref_put(wqe->wq); in create_worker_cont()
793 static bool create_io_worker(struct io_wq *wq, struct io_wqe *wqe, int index) in create_io_worker() argument
808 io_worker_ref_put(wq); in create_io_worker()
868 struct io_wq *wq = wqe->wq; in io_run_cancel() local
872 wq->do_work(work); in io_run_cancel()
873 work = wq->free_work(work); in io_run_cancel()
914 if (test_bit(IO_WQ_BIT_EXIT, &wqe->wq->state) || in io_wqe_enqueue()
956 void io_wq_enqueue(struct io_wq *wq, struct io_wq_work *work) in io_wq_enqueue() argument
958 struct io_wqe *wqe = wq->wqes[numa_node_id()]; in io_wq_enqueue()
1072 enum io_wq_cancel io_wq_cancel_cb(struct io_wq *wq, work_cancel_fn *cancel, in io_wq_cancel_cb() argument
1096 struct io_wqe *wqe = wq->wqes[node]; in io_wq_cancel_cb()
1138 struct io_wq *wq; in io_wq_create() local
1145 wq = kzalloc(struct_size(wq, wqes, nr_node_ids), GFP_KERNEL); in io_wq_create()
1146 if (!wq) in io_wq_create()
1148 ret = cpuhp_state_add_instance_nocalls(io_wq_online, &wq->cpuhp_node); in io_wq_create()
1153 wq->hash = data->hash; in io_wq_create()
1154 wq->free_work = data->free_work; in io_wq_create()
1155 wq->do_work = data->do_work; in io_wq_create()
1167 wq->wqes[node] = wqe; in io_wq_create()
1185 wqe->wq = wq; in io_wq_create()
1191 wq->task = get_task_struct(data->task); in io_wq_create()
1192 atomic_set(&wq->worker_refs, 1); in io_wq_create()
1193 init_completion(&wq->worker_done); in io_wq_create()
1194 return wq; in io_wq_create()
1197 cpuhp_state_remove_instance_nocalls(io_wq_online, &wq->cpuhp_node); in io_wq_create()
1199 if (!wq->wqes[node]) in io_wq_create()
1201 free_cpumask_var(wq->wqes[node]->cpu_mask); in io_wq_create()
1202 kfree(wq->wqes[node]); in io_wq_create()
1205 kfree(wq); in io_wq_create()
1216 return worker->wqe->wq == data; in io_task_work_match()
1219 void io_wq_exit_start(struct io_wq *wq) in io_wq_exit_start() argument
1221 set_bit(IO_WQ_BIT_EXIT, &wq->state); in io_wq_exit_start()
1224 static void io_wq_cancel_tw_create(struct io_wq *wq) in io_wq_cancel_tw_create() argument
1228 while ((cb = task_work_cancel_match(wq->task, io_task_work_match, wq)) != NULL) { in io_wq_cancel_tw_create()
1242 static void io_wq_exit_workers(struct io_wq *wq) in io_wq_exit_workers() argument
1246 if (!wq->task) in io_wq_exit_workers()
1249 io_wq_cancel_tw_create(wq); in io_wq_exit_workers()
1253 struct io_wqe *wqe = wq->wqes[node]; in io_wq_exit_workers()
1258 io_worker_ref_put(wq); in io_wq_exit_workers()
1259 wait_for_completion(&wq->worker_done); in io_wq_exit_workers()
1262 spin_lock_irq(&wq->hash->wait.lock); in io_wq_exit_workers()
1263 list_del_init(&wq->wqes[node]->wait.entry); in io_wq_exit_workers()
1264 spin_unlock_irq(&wq->hash->wait.lock); in io_wq_exit_workers()
1266 put_task_struct(wq->task); in io_wq_exit_workers()
1267 wq->task = NULL; in io_wq_exit_workers()
1270 static void io_wq_destroy(struct io_wq *wq) in io_wq_destroy() argument
1274 cpuhp_state_remove_instance_nocalls(io_wq_online, &wq->cpuhp_node); in io_wq_destroy()
1277 struct io_wqe *wqe = wq->wqes[node]; in io_wq_destroy()
1286 io_wq_put_hash(wq->hash); in io_wq_destroy()
1287 kfree(wq); in io_wq_destroy()
1290 void io_wq_put_and_exit(struct io_wq *wq) in io_wq_put_and_exit() argument
1292 WARN_ON_ONCE(!test_bit(IO_WQ_BIT_EXIT, &wq->state)); in io_wq_put_and_exit()
1294 io_wq_exit_workers(wq); in io_wq_put_and_exit()
1295 io_wq_destroy(wq); in io_wq_put_and_exit()
1314 static int __io_wq_cpu_online(struct io_wq *wq, unsigned int cpu, bool online) in __io_wq_cpu_online() argument
1324 io_wq_for_each_worker(wq->wqes[i], io_wq_worker_affinity, &od); in __io_wq_cpu_online()
1331 struct io_wq *wq = hlist_entry_safe(node, struct io_wq, cpuhp_node); in io_wq_cpu_online() local
1333 return __io_wq_cpu_online(wq, cpu, true); in io_wq_cpu_online()
1338 struct io_wq *wq = hlist_entry_safe(node, struct io_wq, cpuhp_node); in io_wq_cpu_offline() local
1340 return __io_wq_cpu_online(wq, cpu, false); in io_wq_cpu_offline()
1343 int io_wq_cpu_affinity(struct io_wq *wq, cpumask_var_t mask) in io_wq_cpu_affinity() argument
1349 struct io_wqe *wqe = wq->wqes[i]; in io_wq_cpu_affinity()
1364 int io_wq_max_workers(struct io_wq *wq, int *new_count) in io_wq_max_workers() argument
1384 struct io_wqe *wqe = wq->wqes[node]; in io_wq_max_workers()