Lines Matching refs:task
69 static void xprt_connect_status(struct rpc_task *task);
181 int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_reserve_xprt() argument
183 struct rpc_rqst *req = task->tk_rqstp; in xprt_reserve_xprt()
187 if (task == xprt->snd_task) in xprt_reserve_xprt()
191 xprt->snd_task = task; in xprt_reserve_xprt()
199 task->tk_pid, xprt); in xprt_reserve_xprt()
200 task->tk_timeout = 0; in xprt_reserve_xprt()
201 task->tk_status = -EAGAIN; in xprt_reserve_xprt()
208 rpc_sleep_on_priority(&xprt->sending, task, NULL, priority); in xprt_reserve_xprt()
232 int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_reserve_xprt_cong() argument
234 struct rpc_rqst *req = task->tk_rqstp; in xprt_reserve_xprt_cong()
238 if (task == xprt->snd_task) in xprt_reserve_xprt_cong()
243 xprt->snd_task = task; in xprt_reserve_xprt_cong()
246 if (__xprt_get_cong(xprt, task)) { in xprt_reserve_xprt_cong()
247 xprt->snd_task = task; in xprt_reserve_xprt_cong()
253 dprintk("RPC: %5u failed to lock transport %p\n", task->tk_pid, xprt); in xprt_reserve_xprt_cong()
254 task->tk_timeout = 0; in xprt_reserve_xprt_cong()
255 task->tk_status = -EAGAIN; in xprt_reserve_xprt_cong()
262 rpc_sleep_on_priority(&xprt->sending, task, NULL, priority); in xprt_reserve_xprt_cong()
267 static inline int xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_lock_write() argument
272 retval = xprt->ops->reserve_xprt(xprt, task); in xprt_lock_write()
277 static bool __xprt_lock_write_func(struct rpc_task *task, void *data) in __xprt_lock_write_func() argument
282 req = task->tk_rqstp; in __xprt_lock_write_func()
283 xprt->snd_task = task; in __xprt_lock_write_func()
299 static bool __xprt_lock_write_cong_func(struct rpc_task *task, void *data) in __xprt_lock_write_cong_func() argument
304 req = task->tk_rqstp; in __xprt_lock_write_cong_func()
306 xprt->snd_task = task; in __xprt_lock_write_cong_func()
309 if (__xprt_get_cong(xprt, task)) { in __xprt_lock_write_cong_func()
310 xprt->snd_task = task; in __xprt_lock_write_cong_func()
329 static void xprt_task_clear_bytes_sent(struct rpc_task *task) in xprt_task_clear_bytes_sent() argument
331 if (task != NULL) { in xprt_task_clear_bytes_sent()
332 struct rpc_rqst *req = task->tk_rqstp; in xprt_task_clear_bytes_sent()
345 void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_release_xprt() argument
347 if (xprt->snd_task == task) { in xprt_release_xprt()
348 xprt_task_clear_bytes_sent(task); in xprt_release_xprt()
363 void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_release_xprt_cong() argument
365 if (xprt->snd_task == task) { in xprt_release_xprt_cong()
366 xprt_task_clear_bytes_sent(task); in xprt_release_xprt_cong()
373 static inline void xprt_release_write(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_release_write() argument
376 xprt->ops->release_xprt(xprt, task); in xprt_release_write()
385 __xprt_get_cong(struct rpc_xprt *xprt, struct rpc_task *task) in __xprt_get_cong() argument
387 struct rpc_rqst *req = task->tk_rqstp; in __xprt_get_cong()
392 task->tk_pid, xprt->cong, xprt->cwnd); in __xprt_get_cong()
420 void xprt_release_rqst_cong(struct rpc_task *task) in xprt_release_rqst_cong() argument
422 struct rpc_rqst *req = task->tk_rqstp; in xprt_release_rqst_cong()
444 void xprt_adjust_cwnd(struct rpc_xprt *xprt, struct rpc_task *task, int result) in xprt_adjust_cwnd() argument
446 struct rpc_rqst *req = task->tk_rqstp; in xprt_adjust_cwnd()
492 void xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action) in xprt_wait_for_buffer_space() argument
494 struct rpc_rqst *req = task->tk_rqstp; in xprt_wait_for_buffer_space()
497 task->tk_timeout = RPC_IS_SOFT(task) ? req->rq_timeout : 0; in xprt_wait_for_buffer_space()
498 rpc_sleep_on(&xprt->pending, task, action); in xprt_wait_for_buffer_space()
528 void xprt_set_retrans_timeout_def(struct rpc_task *task) in xprt_set_retrans_timeout_def() argument
530 task->tk_timeout = task->tk_rqstp->rq_timeout; in xprt_set_retrans_timeout_def()
540 void xprt_set_retrans_timeout_rtt(struct rpc_task *task) in xprt_set_retrans_timeout_rtt() argument
542 int timer = task->tk_msg.rpc_proc->p_timer; in xprt_set_retrans_timeout_rtt()
543 struct rpc_clnt *clnt = task->tk_client; in xprt_set_retrans_timeout_rtt()
545 struct rpc_rqst *req = task->tk_rqstp; in xprt_set_retrans_timeout_rtt()
548 task->tk_timeout = rpc_calc_rto(rtt, timer); in xprt_set_retrans_timeout_rtt()
549 task->tk_timeout <<= rpc_ntimeo(rtt, timer) + req->rq_retries; in xprt_set_retrans_timeout_rtt()
550 if (task->tk_timeout > max_timeout || task->tk_timeout == 0) in xprt_set_retrans_timeout_rtt()
551 task->tk_timeout = max_timeout; in xprt_set_retrans_timeout_rtt()
695 struct rpc_task *task, in xprt_lock_connect() argument
703 if (xprt->snd_task != task) in xprt_lock_connect()
705 xprt_task_clear_bytes_sent(task); in xprt_lock_connect()
732 void xprt_connect(struct rpc_task *task) in xprt_connect() argument
734 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in xprt_connect()
736 dprintk("RPC: %5u xprt_connect xprt %p %s connected\n", task->tk_pid, in xprt_connect()
740 task->tk_status = -EAGAIN; in xprt_connect()
743 if (!xprt_lock_write(xprt, task)) in xprt_connect()
750 task->tk_rqstp->rq_bytes_sent = 0; in xprt_connect()
751 task->tk_timeout = task->tk_rqstp->rq_timeout; in xprt_connect()
752 rpc_sleep_on(&xprt->pending, task, xprt_connect_status); in xprt_connect()
759 xprt->ops->connect(xprt, task); in xprt_connect()
761 xprt_release_write(xprt, task); in xprt_connect()
764 static void xprt_connect_status(struct rpc_task *task) in xprt_connect_status() argument
766 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in xprt_connect_status()
768 if (task->tk_status == 0) { in xprt_connect_status()
772 task->tk_pid); in xprt_connect_status()
776 switch (task->tk_status) { in xprt_connect_status()
784 dprintk("RPC: %5u xprt_connect_status: retrying\n", task->tk_pid); in xprt_connect_status()
788 "out\n", task->tk_pid); in xprt_connect_status()
792 "server %s\n", task->tk_pid, -task->tk_status, in xprt_connect_status()
794 task->tk_status = -EIO; in xprt_connect_status()
822 static void xprt_update_rtt(struct rpc_task *task) in xprt_update_rtt() argument
824 struct rpc_rqst *req = task->tk_rqstp; in xprt_update_rtt()
825 struct rpc_rtt *rtt = task->tk_client->cl_rtt; in xprt_update_rtt()
826 unsigned int timer = task->tk_msg.rpc_proc->p_timer; in xprt_update_rtt()
843 void xprt_complete_rqst(struct rpc_task *task, int copied) in xprt_complete_rqst() argument
845 struct rpc_rqst *req = task->tk_rqstp; in xprt_complete_rqst()
849 task->tk_pid, ntohl(req->rq_xid), copied); in xprt_complete_rqst()
855 xprt_update_rtt(task); in xprt_complete_rqst()
863 rpc_wake_up_queued_task(&xprt->pending, task); in xprt_complete_rqst()
867 static void xprt_timer(struct rpc_task *task) in xprt_timer() argument
869 struct rpc_rqst *req = task->tk_rqstp; in xprt_timer()
872 if (task->tk_status != -ETIMEDOUT) in xprt_timer()
874 dprintk("RPC: %5u xprt_timer\n", task->tk_pid); in xprt_timer()
879 xprt->ops->timer(xprt, task); in xprt_timer()
881 task->tk_status = 0; in xprt_timer()
895 bool xprt_prepare_transmit(struct rpc_task *task) in xprt_prepare_transmit() argument
897 struct rpc_rqst *req = task->tk_rqstp; in xprt_prepare_transmit()
901 dprintk("RPC: %5u xprt_prepare_transmit\n", task->tk_pid); in xprt_prepare_transmit()
906 task->tk_status = req->rq_reply_bytes_recvd; in xprt_prepare_transmit()
909 if ((task->tk_flags & RPC_TASK_NO_RETRANS_TIMEOUT) in xprt_prepare_transmit()
912 xprt->ops->set_retrans_timeout(task); in xprt_prepare_transmit()
913 rpc_sleep_on(&xprt->pending, task, xprt_timer); in xprt_prepare_transmit()
917 if (!xprt->ops->reserve_xprt(xprt, task)) { in xprt_prepare_transmit()
918 task->tk_status = -EAGAIN; in xprt_prepare_transmit()
927 void xprt_end_transmit(struct rpc_task *task) in xprt_end_transmit() argument
929 xprt_release_write(task->tk_rqstp->rq_xprt, task); in xprt_end_transmit()
938 void xprt_transmit(struct rpc_task *task) in xprt_transmit() argument
940 struct rpc_rqst *req = task->tk_rqstp; in xprt_transmit()
944 dprintk("RPC: %5u xprt_transmit(%u)\n", task->tk_pid, req->rq_slen); in xprt_transmit()
947 if (list_empty(&req->rq_list) && rpc_reply_expected(task)) { in xprt_transmit()
966 status = xprt->ops->send_request(task); in xprt_transmit()
969 task->tk_status = status; in xprt_transmit()
973 dprintk("RPC: %5u xmit complete\n", task->tk_pid); in xprt_transmit()
974 task->tk_flags |= RPC_TASK_SENT; in xprt_transmit()
977 xprt->ops->set_retrans_timeout(task); in xprt_transmit()
990 task->tk_status = -ENOTCONN; in xprt_transmit()
996 if (!req->rq_reply_bytes_recvd && rpc_reply_expected(task)) in xprt_transmit()
997 rpc_sleep_on(&xprt->pending, task, xprt_timer); in xprt_transmit()
1003 static void xprt_add_backlog(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_add_backlog() argument
1006 rpc_sleep_on(&xprt->backlog, task, NULL); in xprt_add_backlog()
1015 static bool xprt_throttle_congested(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_throttle_congested() argument
1023 rpc_sleep_on(&xprt->backlog, task, NULL); in xprt_throttle_congested()
1055 void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_alloc_slot() argument
1072 task->tk_status = -ENOMEM; in xprt_alloc_slot()
1075 xprt_add_backlog(xprt, task); in xprt_alloc_slot()
1078 task->tk_status = -EAGAIN; in xprt_alloc_slot()
1083 task->tk_status = 0; in xprt_alloc_slot()
1084 task->tk_rqstp = req; in xprt_alloc_slot()
1085 xprt_request_init(task, xprt); in xprt_alloc_slot()
1090 void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_lock_and_alloc_slot() argument
1097 if (xprt_lock_write(xprt, task)) { in xprt_lock_and_alloc_slot()
1098 xprt_alloc_slot(xprt, task); in xprt_lock_and_alloc_slot()
1099 xprt_release_write(xprt, task); in xprt_lock_and_alloc_slot()
1177 void xprt_reserve(struct rpc_task *task) in xprt_reserve() argument
1181 task->tk_status = 0; in xprt_reserve()
1182 if (task->tk_rqstp != NULL) in xprt_reserve()
1185 task->tk_timeout = 0; in xprt_reserve()
1186 task->tk_status = -EAGAIN; in xprt_reserve()
1188 xprt = rcu_dereference(task->tk_client->cl_xprt); in xprt_reserve()
1189 if (!xprt_throttle_congested(xprt, task)) in xprt_reserve()
1190 xprt->ops->alloc_slot(xprt, task); in xprt_reserve()
1203 void xprt_retry_reserve(struct rpc_task *task) in xprt_retry_reserve() argument
1207 task->tk_status = 0; in xprt_retry_reserve()
1208 if (task->tk_rqstp != NULL) in xprt_retry_reserve()
1211 task->tk_timeout = 0; in xprt_retry_reserve()
1212 task->tk_status = -EAGAIN; in xprt_retry_reserve()
1214 xprt = rcu_dereference(task->tk_client->cl_xprt); in xprt_retry_reserve()
1215 xprt->ops->alloc_slot(xprt, task); in xprt_retry_reserve()
1229 static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) in xprt_request_init() argument
1231 struct rpc_rqst *req = task->tk_rqstp; in xprt_request_init()
1234 req->rq_timeout = task->tk_client->cl_timeout->to_initval; in xprt_request_init()
1235 req->rq_task = task; in xprt_request_init()
1247 dprintk("RPC: %5u reserved req %p xid %08x\n", task->tk_pid, in xprt_request_init()
1256 void xprt_release(struct rpc_task *task) in xprt_release() argument
1259 struct rpc_rqst *req = task->tk_rqstp; in xprt_release()
1262 if (task->tk_client) { in xprt_release()
1264 xprt = rcu_dereference(task->tk_client->cl_xprt); in xprt_release()
1265 if (xprt->snd_task == task) in xprt_release()
1266 xprt_release_write(xprt, task); in xprt_release()
1273 if (task->tk_ops->rpc_count_stats != NULL) in xprt_release()
1274 task->tk_ops->rpc_count_stats(task, task->tk_calldata); in xprt_release()
1275 else if (task->tk_client) in xprt_release()
1276 rpc_count_iostats(task, task->tk_client->cl_metrics); in xprt_release()
1278 xprt->ops->release_xprt(xprt, task); in xprt_release()
1280 xprt->ops->release_request(task); in xprt_release()
1292 task->tk_rqstp = NULL; in xprt_release()
1296 dprintk("RPC: %5u release request %p\n", task->tk_pid, req); in xprt_release()