Lines Matching refs:task

46 static void			 rpc_release_task(struct rpc_task *task);
65 __rpc_disable_timer(struct rpc_wait_queue *queue, struct rpc_task *task) in __rpc_disable_timer() argument
67 if (task->tk_timeout == 0) in __rpc_disable_timer()
69 dprintk("RPC: %5u disabling timer\n", task->tk_pid); in __rpc_disable_timer()
70 task->tk_timeout = 0; in __rpc_disable_timer()
71 list_del(&task->u.tk_wait.timer_list); in __rpc_disable_timer()
87 __rpc_add_timer(struct rpc_wait_queue *queue, struct rpc_task *task) in __rpc_add_timer() argument
89 if (!task->tk_timeout) in __rpc_add_timer()
93 task->tk_pid, jiffies_to_msecs(task->tk_timeout)); in __rpc_add_timer()
95 task->u.tk_wait.expires = jiffies + task->tk_timeout; in __rpc_add_timer()
96 …if (list_empty(&queue->timer_list.list) || time_before(task->u.tk_wait.expires, queue->timer_list.… in __rpc_add_timer()
97 rpc_set_queue_timer(queue, task->u.tk_wait.expires); in __rpc_add_timer()
98 list_add(&task->u.tk_wait.timer_list, &queue->timer_list.list); in __rpc_add_timer()
104 struct rpc_task *task; in rpc_rotate_queue_owner() local
107 task = list_first_entry(q, struct rpc_task, u.tk_wait.list); in rpc_rotate_queue_owner()
108 if (task->tk_owner == queue->owner) in rpc_rotate_queue_owner()
109 list_move_tail(&task->u.tk_wait.list, q); in rpc_rotate_queue_owner()
138 struct rpc_task *task, in __rpc_add_wait_queue_priority() argument
144 INIT_LIST_HEAD(&task->u.tk_wait.links); in __rpc_add_wait_queue_priority()
151 if (t->tk_owner == task->tk_owner) { in __rpc_add_wait_queue_priority()
152 list_add_tail(&task->u.tk_wait.list, &t->u.tk_wait.links); in __rpc_add_wait_queue_priority()
156 list_add_tail(&task->u.tk_wait.list, q); in __rpc_add_wait_queue_priority()
168 struct rpc_task *task, in __rpc_add_wait_queue() argument
171 WARN_ON_ONCE(RPC_IS_QUEUED(task)); in __rpc_add_wait_queue()
172 if (RPC_IS_QUEUED(task)) in __rpc_add_wait_queue()
176 __rpc_add_wait_queue_priority(queue, task, queue_priority); in __rpc_add_wait_queue()
177 else if (RPC_IS_SWAPPER(task)) in __rpc_add_wait_queue()
178 list_add(&task->u.tk_wait.list, &queue->tasks[0]); in __rpc_add_wait_queue()
180 list_add_tail(&task->u.tk_wait.list, &queue->tasks[0]); in __rpc_add_wait_queue()
181 task->tk_waitqueue = queue; in __rpc_add_wait_queue()
185 rpc_set_queued(task); in __rpc_add_wait_queue()
188 task->tk_pid, queue, rpc_qname(queue)); in __rpc_add_wait_queue()
194 static void __rpc_remove_wait_queue_priority(struct rpc_task *task) in __rpc_remove_wait_queue_priority() argument
198 if (!list_empty(&task->u.tk_wait.links)) { in __rpc_remove_wait_queue_priority()
199 t = list_entry(task->u.tk_wait.links.next, struct rpc_task, u.tk_wait.list); in __rpc_remove_wait_queue_priority()
200 list_move(&t->u.tk_wait.list, &task->u.tk_wait.list); in __rpc_remove_wait_queue_priority()
201 list_splice_init(&task->u.tk_wait.links, &t->u.tk_wait.links); in __rpc_remove_wait_queue_priority()
209 static void __rpc_remove_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *task) in __rpc_remove_wait_queue() argument
211 __rpc_disable_timer(queue, task); in __rpc_remove_wait_queue()
213 __rpc_remove_wait_queue_priority(task); in __rpc_remove_wait_queue()
214 list_del(&task->u.tk_wait.list); in __rpc_remove_wait_queue()
217 task->tk_pid, queue, rpc_qname(queue)); in __rpc_remove_wait_queue()
262 static void rpc_task_set_debuginfo(struct rpc_task *task) in rpc_task_set_debuginfo() argument
266 task->tk_pid = atomic_inc_return(&rpc_pid); in rpc_task_set_debuginfo()
269 static inline void rpc_task_set_debuginfo(struct rpc_task *task) in rpc_task_set_debuginfo() argument
274 static void rpc_set_active(struct rpc_task *task) in rpc_set_active() argument
276 trace_rpc_task_begin(task->tk_client, task, NULL); in rpc_set_active()
278 rpc_task_set_debuginfo(task); in rpc_set_active()
279 set_bit(RPC_TASK_ACTIVE, &task->tk_runstate); in rpc_set_active()
286 static int rpc_complete_task(struct rpc_task *task) in rpc_complete_task() argument
288 void *m = &task->tk_runstate; in rpc_complete_task()
294 trace_rpc_task_complete(task->tk_client, task, NULL); in rpc_complete_task()
297 clear_bit(RPC_TASK_ACTIVE, &task->tk_runstate); in rpc_complete_task()
298 ret = atomic_dec_and_test(&task->tk_count); in rpc_complete_task()
312 int __rpc_wait_for_completion_task(struct rpc_task *task, wait_bit_action_f *action) in __rpc_wait_for_completion_task() argument
316 return out_of_line_wait_on_bit(&task->tk_runstate, RPC_TASK_ACTIVE, in __rpc_wait_for_completion_task()
332 static void rpc_make_runnable(struct rpc_task *task) in rpc_make_runnable() argument
334 bool need_wakeup = !rpc_test_and_set_running(task); in rpc_make_runnable()
336 rpc_clear_queued(task); in rpc_make_runnable()
339 if (RPC_IS_ASYNC(task)) { in rpc_make_runnable()
340 INIT_WORK(&task->u.tk_work, rpc_async_schedule); in rpc_make_runnable()
341 queue_work(rpciod_workqueue, &task->u.tk_work); in rpc_make_runnable()
343 wake_up_bit(&task->tk_runstate, RPC_TASK_QUEUED); in rpc_make_runnable()
353 struct rpc_task *task, in __rpc_sleep_on_priority() argument
358 task->tk_pid, rpc_qname(q), jiffies); in __rpc_sleep_on_priority()
360 trace_rpc_task_sleep(task->tk_client, task, q); in __rpc_sleep_on_priority()
362 __rpc_add_wait_queue(q, task, queue_priority); in __rpc_sleep_on_priority()
364 WARN_ON_ONCE(task->tk_callback != NULL); in __rpc_sleep_on_priority()
365 task->tk_callback = action; in __rpc_sleep_on_priority()
366 __rpc_add_timer(q, task); in __rpc_sleep_on_priority()
369 void rpc_sleep_on(struct rpc_wait_queue *q, struct rpc_task *task, in rpc_sleep_on() argument
373 WARN_ON_ONCE(!RPC_IS_ACTIVATED(task)); in rpc_sleep_on()
374 if (!RPC_IS_ACTIVATED(task)) { in rpc_sleep_on()
375 task->tk_status = -EIO; in rpc_sleep_on()
376 rpc_put_task_async(task); in rpc_sleep_on()
384 __rpc_sleep_on_priority(q, task, action, task->tk_priority); in rpc_sleep_on()
389 void rpc_sleep_on_priority(struct rpc_wait_queue *q, struct rpc_task *task, in rpc_sleep_on_priority() argument
393 WARN_ON_ONCE(!RPC_IS_ACTIVATED(task)); in rpc_sleep_on_priority()
394 if (!RPC_IS_ACTIVATED(task)) { in rpc_sleep_on_priority()
395 task->tk_status = -EIO; in rpc_sleep_on_priority()
396 rpc_put_task_async(task); in rpc_sleep_on_priority()
404 __rpc_sleep_on_priority(q, task, action, priority - RPC_PRIORITY_LOW); in rpc_sleep_on_priority()
416 static void __rpc_do_wake_up_task(struct rpc_wait_queue *queue, struct rpc_task *task) in __rpc_do_wake_up_task() argument
419 task->tk_pid, jiffies); in __rpc_do_wake_up_task()
422 if (!RPC_IS_ACTIVATED(task)) { in __rpc_do_wake_up_task()
423 printk(KERN_ERR "RPC: Inactive task (%p) being woken up!\n", task); in __rpc_do_wake_up_task()
427 trace_rpc_task_wakeup(task->tk_client, task, queue); in __rpc_do_wake_up_task()
429 __rpc_remove_wait_queue(queue, task); in __rpc_do_wake_up_task()
431 rpc_make_runnable(task); in __rpc_do_wake_up_task()
439 static void rpc_wake_up_task_queue_locked(struct rpc_wait_queue *queue, struct rpc_task *task) in rpc_wake_up_task_queue_locked() argument
441 if (RPC_IS_QUEUED(task)) { in rpc_wake_up_task_queue_locked()
443 if (task->tk_waitqueue == queue) in rpc_wake_up_task_queue_locked()
444 __rpc_do_wake_up_task(queue, task); in rpc_wake_up_task_queue_locked()
451 void rpc_wake_up_queued_task(struct rpc_wait_queue *queue, struct rpc_task *task) in rpc_wake_up_queued_task() argument
454 rpc_wake_up_task_queue_locked(queue, task); in rpc_wake_up_queued_task()
465 struct rpc_task *task; in __rpc_find_next_queued_priority() local
472 task = list_entry(q->next, struct rpc_task, u.tk_wait.list); in __rpc_find_next_queued_priority()
473 if (queue->owner == task->tk_owner) { in __rpc_find_next_queued_priority()
476 list_move_tail(&task->u.tk_wait.list, q); in __rpc_find_next_queued_priority()
493 task = list_entry(q->next, struct rpc_task, u.tk_wait.list); in __rpc_find_next_queued_priority()
504 rpc_set_waitqueue_owner(queue, task->tk_owner); in __rpc_find_next_queued_priority()
506 return task; in __rpc_find_next_queued_priority()
524 struct rpc_task *task = NULL; in rpc_wake_up_first() local
529 task = __rpc_find_next_queued(queue); in rpc_wake_up_first()
530 if (task != NULL) { in rpc_wake_up_first()
531 if (func(task, data)) in rpc_wake_up_first()
532 rpc_wake_up_task_queue_locked(queue, task); in rpc_wake_up_first()
534 task = NULL; in rpc_wake_up_first()
538 return task; in rpc_wake_up_first()
542 static bool rpc_wake_up_next_func(struct rpc_task *task, void *data) in rpc_wake_up_next_func() argument
570 struct rpc_task *task; in rpc_wake_up() local
571 task = list_first_entry(head, in rpc_wake_up()
574 rpc_wake_up_task_queue_locked(queue, task); in rpc_wake_up()
599 struct rpc_task *task; in rpc_wake_up_status() local
600 task = list_first_entry(head, in rpc_wake_up_status()
603 task->tk_status = status; in rpc_wake_up_status()
604 rpc_wake_up_task_queue_locked(queue, task); in rpc_wake_up_status()
617 struct rpc_task *task, *n; in __rpc_queue_timer_fn() local
622 list_for_each_entry_safe(task, n, &queue->timer_list.list, u.tk_wait.timer_list) { in __rpc_queue_timer_fn()
623 timeo = task->u.tk_wait.expires; in __rpc_queue_timer_fn()
625 dprintk("RPC: %5u timeout\n", task->tk_pid); in __rpc_queue_timer_fn()
626 task->tk_status = -ETIMEDOUT; in __rpc_queue_timer_fn()
627 rpc_wake_up_task_queue_locked(queue, task); in __rpc_queue_timer_fn()
638 static void __rpc_atrun(struct rpc_task *task) in __rpc_atrun() argument
640 if (task->tk_status == -ETIMEDOUT) in __rpc_atrun()
641 task->tk_status = 0; in __rpc_atrun()
647 void rpc_delay(struct rpc_task *task, unsigned long delay) in rpc_delay() argument
649 task->tk_timeout = delay; in rpc_delay()
650 rpc_sleep_on(&delay_queue, task, __rpc_atrun); in rpc_delay()
657 void rpc_prepare_task(struct rpc_task *task) in rpc_prepare_task() argument
659 task->tk_ops->rpc_call_prepare(task, task->tk_calldata); in rpc_prepare_task()
663 rpc_init_task_statistics(struct rpc_task *task) in rpc_init_task_statistics() argument
666 task->tk_garb_retry = 2; in rpc_init_task_statistics()
667 task->tk_cred_retry = 2; in rpc_init_task_statistics()
668 task->tk_rebind_retry = 2; in rpc_init_task_statistics()
671 task->tk_start = ktime_get(); in rpc_init_task_statistics()
675 rpc_reset_task_statistics(struct rpc_task *task) in rpc_reset_task_statistics() argument
677 task->tk_timeouts = 0; in rpc_reset_task_statistics()
678 task->tk_flags &= ~(RPC_CALL_MAJORSEEN|RPC_TASK_KILLED|RPC_TASK_SENT); in rpc_reset_task_statistics()
680 rpc_init_task_statistics(task); in rpc_reset_task_statistics()
686 void rpc_exit_task(struct rpc_task *task) in rpc_exit_task() argument
688 task->tk_action = NULL; in rpc_exit_task()
689 if (task->tk_ops->rpc_call_done != NULL) { in rpc_exit_task()
690 task->tk_ops->rpc_call_done(task, task->tk_calldata); in rpc_exit_task()
691 if (task->tk_action != NULL) { in rpc_exit_task()
692 WARN_ON(RPC_ASSASSINATED(task)); in rpc_exit_task()
694 xprt_release(task); in rpc_exit_task()
695 rpc_reset_task_statistics(task); in rpc_exit_task()
700 void rpc_exit(struct rpc_task *task, int status) in rpc_exit() argument
702 task->tk_status = status; in rpc_exit()
703 task->tk_action = rpc_exit_task; in rpc_exit()
704 if (RPC_IS_QUEUED(task)) in rpc_exit()
705 rpc_wake_up_queued_task(task->tk_waitqueue, task); in rpc_exit()
718 static void __rpc_execute(struct rpc_task *task) in __rpc_execute() argument
721 int task_is_async = RPC_IS_ASYNC(task); in __rpc_execute()
725 task->tk_pid, task->tk_flags); in __rpc_execute()
727 WARN_ON_ONCE(RPC_IS_QUEUED(task)); in __rpc_execute()
728 if (RPC_IS_QUEUED(task)) in __rpc_execute()
737 do_action = task->tk_callback; in __rpc_execute()
738 task->tk_callback = NULL; in __rpc_execute()
746 do_action = task->tk_action; in __rpc_execute()
750 trace_rpc_task_run_action(task->tk_client, task, task->tk_action); in __rpc_execute()
751 do_action(task); in __rpc_execute()
756 if (!RPC_IS_QUEUED(task)) in __rpc_execute()
767 queue = task->tk_waitqueue; in __rpc_execute()
769 if (!RPC_IS_QUEUED(task)) { in __rpc_execute()
773 rpc_clear_running(task); in __rpc_execute()
779 dprintk("RPC: %5u sync task going to sleep\n", task->tk_pid); in __rpc_execute()
780 status = out_of_line_wait_on_bit(&task->tk_runstate, in __rpc_execute()
790 dprintk("RPC: %5u got signal\n", task->tk_pid); in __rpc_execute()
791 task->tk_flags |= RPC_TASK_KILLED; in __rpc_execute()
792 rpc_exit(task, -ERESTARTSYS); in __rpc_execute()
794 dprintk("RPC: %5u sync task resuming\n", task->tk_pid); in __rpc_execute()
797 dprintk("RPC: %5u return %d, status %d\n", task->tk_pid, status, in __rpc_execute()
798 task->tk_status); in __rpc_execute()
800 rpc_release_task(task); in __rpc_execute()
812 void rpc_execute(struct rpc_task *task) in rpc_execute() argument
814 bool is_async = RPC_IS_ASYNC(task); in rpc_execute()
816 rpc_set_active(task); in rpc_execute()
817 rpc_make_runnable(task); in rpc_execute()
819 __rpc_execute(task); in rpc_execute()
844 void *rpc_malloc(struct rpc_task *task, size_t size) in rpc_malloc() argument
849 if (RPC_IS_SWAPPER(task)) in rpc_malloc()
863 task->tk_pid, size, buf); in rpc_malloc()
897 static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *task_setup_data) in rpc_init_task() argument
899 memset(task, 0, sizeof(*task)); in rpc_init_task()
900 atomic_set(&task->tk_count, 1); in rpc_init_task()
901 task->tk_flags = task_setup_data->flags; in rpc_init_task()
902 task->tk_ops = task_setup_data->callback_ops; in rpc_init_task()
903 task->tk_calldata = task_setup_data->callback_data; in rpc_init_task()
904 INIT_LIST_HEAD(&task->tk_task); in rpc_init_task()
906 task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; in rpc_init_task()
907 task->tk_owner = current->tgid; in rpc_init_task()
910 task->tk_workqueue = task_setup_data->workqueue; in rpc_init_task()
912 if (task->tk_ops->rpc_call_prepare != NULL) in rpc_init_task()
913 task->tk_action = rpc_prepare_task; in rpc_init_task()
915 rpc_init_task_statistics(task); in rpc_init_task()
932 struct rpc_task *task = setup_data->task; in rpc_new_task() local
935 if (task == NULL) { in rpc_new_task()
936 task = rpc_alloc_task(); in rpc_new_task()
937 if (task == NULL) { in rpc_new_task()
945 rpc_init_task(task, setup_data); in rpc_new_task()
946 task->tk_flags |= flags; in rpc_new_task()
947 dprintk("RPC: allocated task %p\n", task); in rpc_new_task()
948 return task; in rpc_new_task()
970 static void rpc_free_task(struct rpc_task *task) in rpc_free_task() argument
972 unsigned short tk_flags = task->tk_flags; in rpc_free_task()
974 rpc_release_calldata(task->tk_ops, task->tk_calldata); in rpc_free_task()
977 dprintk("RPC: %5u freeing task\n", task->tk_pid); in rpc_free_task()
978 mempool_free(task, rpc_task_mempool); in rpc_free_task()
987 static void rpc_release_resources_task(struct rpc_task *task) in rpc_release_resources_task() argument
989 xprt_release(task); in rpc_release_resources_task()
990 if (task->tk_msg.rpc_cred) { in rpc_release_resources_task()
991 put_rpccred(task->tk_msg.rpc_cred); in rpc_release_resources_task()
992 task->tk_msg.rpc_cred = NULL; in rpc_release_resources_task()
994 rpc_task_release_client(task); in rpc_release_resources_task()
997 static void rpc_final_put_task(struct rpc_task *task, in rpc_final_put_task() argument
1001 INIT_WORK(&task->u.tk_work, rpc_async_release); in rpc_final_put_task()
1002 queue_work(q, &task->u.tk_work); in rpc_final_put_task()
1004 rpc_free_task(task); in rpc_final_put_task()
1007 static void rpc_do_put_task(struct rpc_task *task, struct workqueue_struct *q) in rpc_do_put_task() argument
1009 if (atomic_dec_and_test(&task->tk_count)) { in rpc_do_put_task()
1010 rpc_release_resources_task(task); in rpc_do_put_task()
1011 rpc_final_put_task(task, q); in rpc_do_put_task()
1015 void rpc_put_task(struct rpc_task *task) in rpc_put_task() argument
1017 rpc_do_put_task(task, NULL); in rpc_put_task()
1021 void rpc_put_task_async(struct rpc_task *task) in rpc_put_task_async() argument
1023 rpc_do_put_task(task, task->tk_workqueue); in rpc_put_task_async()
1027 static void rpc_release_task(struct rpc_task *task) in rpc_release_task() argument
1029 dprintk("RPC: %5u release task\n", task->tk_pid); in rpc_release_task()
1031 WARN_ON_ONCE(RPC_IS_QUEUED(task)); in rpc_release_task()
1033 rpc_release_resources_task(task); in rpc_release_task()
1040 if (atomic_read(&task->tk_count) != 1 + !RPC_IS_ASYNC(task)) { in rpc_release_task()
1042 if (!rpc_complete_task(task)) in rpc_release_task()
1045 if (!atomic_dec_and_test(&task->tk_count)) in rpc_release_task()
1048 rpc_final_put_task(task, task->tk_workqueue); in rpc_release_task()