Lines Matching refs:xprt

67 static void	 xprt_init(struct rpc_xprt *xprt, struct net *net);
72 static void xprt_destroy(struct rpc_xprt *xprt);
182 int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_reserve_xprt() argument
187 if (test_and_set_bit(XPRT_LOCKED, &xprt->state)) { in xprt_reserve_xprt()
188 if (task == xprt->snd_task) in xprt_reserve_xprt()
192 xprt->snd_task = task; in xprt_reserve_xprt()
200 task->tk_pid, xprt); in xprt_reserve_xprt()
209 rpc_sleep_on_priority(&xprt->sending, task, NULL, priority); in xprt_reserve_xprt()
214 static void xprt_clear_locked(struct rpc_xprt *xprt) in xprt_clear_locked() argument
216 xprt->snd_task = NULL; in xprt_clear_locked()
217 if (!test_bit(XPRT_CLOSE_WAIT, &xprt->state)) { in xprt_clear_locked()
219 clear_bit(XPRT_LOCKED, &xprt->state); in xprt_clear_locked()
222 queue_work(rpciod_workqueue, &xprt->task_cleanup); in xprt_clear_locked()
233 int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_reserve_xprt_cong() argument
238 if (test_and_set_bit(XPRT_LOCKED, &xprt->state)) { in xprt_reserve_xprt_cong()
239 if (task == xprt->snd_task) in xprt_reserve_xprt_cong()
244 xprt->snd_task = task; in xprt_reserve_xprt_cong()
247 if (__xprt_get_cong(xprt, task)) { in xprt_reserve_xprt_cong()
248 xprt->snd_task = task; in xprt_reserve_xprt_cong()
252 xprt_clear_locked(xprt); in xprt_reserve_xprt_cong()
255 __xprt_put_cong(xprt, req); in xprt_reserve_xprt_cong()
256 dprintk("RPC: %5u failed to lock transport %p\n", task->tk_pid, xprt); in xprt_reserve_xprt_cong()
265 rpc_sleep_on_priority(&xprt->sending, task, NULL, priority); in xprt_reserve_xprt_cong()
270 static inline int xprt_lock_write(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_lock_write() argument
274 spin_lock_bh(&xprt->transport_lock); in xprt_lock_write()
275 retval = xprt->ops->reserve_xprt(xprt, task); in xprt_lock_write()
276 spin_unlock_bh(&xprt->transport_lock); in xprt_lock_write()
282 struct rpc_xprt *xprt = data; in __xprt_lock_write_func() local
286 xprt->snd_task = task; in __xprt_lock_write_func()
292 static void __xprt_lock_write_next(struct rpc_xprt *xprt) in __xprt_lock_write_next() argument
294 if (test_and_set_bit(XPRT_LOCKED, &xprt->state)) in __xprt_lock_write_next()
297 if (rpc_wake_up_first(&xprt->sending, __xprt_lock_write_func, xprt)) in __xprt_lock_write_next()
299 xprt_clear_locked(xprt); in __xprt_lock_write_next()
304 struct rpc_xprt *xprt = data; in __xprt_lock_write_cong_func() local
309 xprt->snd_task = task; in __xprt_lock_write_cong_func()
312 if (__xprt_get_cong(xprt, task)) { in __xprt_lock_write_cong_func()
313 xprt->snd_task = task; in __xprt_lock_write_cong_func()
320 static void __xprt_lock_write_next_cong(struct rpc_xprt *xprt) in __xprt_lock_write_next_cong() argument
322 if (test_and_set_bit(XPRT_LOCKED, &xprt->state)) in __xprt_lock_write_next_cong()
324 if (RPCXPRT_CONGESTED(xprt)) in __xprt_lock_write_next_cong()
326 if (rpc_wake_up_first(&xprt->sending, __xprt_lock_write_cong_func, xprt)) in __xprt_lock_write_next_cong()
329 xprt_clear_locked(xprt); in __xprt_lock_write_next_cong()
348 void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_release_xprt() argument
350 if (xprt->snd_task == task) { in xprt_release_xprt()
352 xprt_clear_locked(xprt); in xprt_release_xprt()
353 __xprt_lock_write_next(xprt); in xprt_release_xprt()
366 void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_release_xprt_cong() argument
368 if (xprt->snd_task == task) { in xprt_release_xprt_cong()
370 xprt_clear_locked(xprt); in xprt_release_xprt_cong()
371 __xprt_lock_write_next_cong(xprt); in xprt_release_xprt_cong()
376 static inline void xprt_release_write(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_release_write() argument
378 spin_lock_bh(&xprt->transport_lock); in xprt_release_write()
379 xprt->ops->release_xprt(xprt, task); in xprt_release_write()
380 spin_unlock_bh(&xprt->transport_lock); in xprt_release_write()
388 __xprt_get_cong(struct rpc_xprt *xprt, struct rpc_task *task) in __xprt_get_cong() argument
395 task->tk_pid, xprt->cong, xprt->cwnd); in __xprt_get_cong()
396 if (RPCXPRT_CONGESTED(xprt)) in __xprt_get_cong()
399 xprt->cong += RPC_CWNDSCALE; in __xprt_get_cong()
408 __xprt_put_cong(struct rpc_xprt *xprt, struct rpc_rqst *req) in __xprt_put_cong() argument
413 xprt->cong -= RPC_CWNDSCALE; in __xprt_put_cong()
414 __xprt_lock_write_next_cong(xprt); in __xprt_put_cong()
447 void xprt_adjust_cwnd(struct rpc_xprt *xprt, struct rpc_task *task, int result) in xprt_adjust_cwnd() argument
450 unsigned long cwnd = xprt->cwnd; in xprt_adjust_cwnd()
452 if (result >= 0 && cwnd <= xprt->cong) { in xprt_adjust_cwnd()
456 if (cwnd > RPC_MAXCWND(xprt)) in xprt_adjust_cwnd()
457 cwnd = RPC_MAXCWND(xprt); in xprt_adjust_cwnd()
458 __xprt_lock_write_next_cong(xprt); in xprt_adjust_cwnd()
465 xprt->cong, xprt->cwnd, cwnd); in xprt_adjust_cwnd()
466 xprt->cwnd = cwnd; in xprt_adjust_cwnd()
467 __xprt_put_cong(xprt, req); in xprt_adjust_cwnd()
477 void xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status) in xprt_wake_pending_tasks() argument
480 rpc_wake_up_status(&xprt->pending, status); in xprt_wake_pending_tasks()
482 rpc_wake_up(&xprt->pending); in xprt_wake_pending_tasks()
498 struct rpc_xprt *xprt = req->rq_xprt; in xprt_wait_for_buffer_space() local
501 rpc_sleep_on(&xprt->pending, task, action); in xprt_wait_for_buffer_space()
511 void xprt_write_space(struct rpc_xprt *xprt) in xprt_write_space() argument
513 spin_lock_bh(&xprt->transport_lock); in xprt_write_space()
514 if (xprt->snd_task) { in xprt_write_space()
516 "xprt %p\n", xprt); in xprt_write_space()
517 rpc_wake_up_queued_task(&xprt->pending, xprt->snd_task); in xprt_write_space()
519 spin_unlock_bh(&xprt->transport_lock); in xprt_write_space()
579 struct rpc_xprt *xprt = req->rq_xprt; in xprt_adjust_timeout() local
596 spin_lock_bh(&xprt->transport_lock); in xprt_adjust_timeout()
598 spin_unlock_bh(&xprt->transport_lock); in xprt_adjust_timeout()
611 struct rpc_xprt *xprt = in xprt_autoclose() local
614 clear_bit(XPRT_CLOSE_WAIT, &xprt->state); in xprt_autoclose()
615 xprt->ops->close(xprt); in xprt_autoclose()
616 xprt_release_write(xprt, NULL); in xprt_autoclose()
617 wake_up_bit(&xprt->state, XPRT_LOCKED); in xprt_autoclose()
625 void xprt_disconnect_done(struct rpc_xprt *xprt) in xprt_disconnect_done() argument
627 dprintk("RPC: disconnected transport %p\n", xprt); in xprt_disconnect_done()
628 spin_lock_bh(&xprt->transport_lock); in xprt_disconnect_done()
629 xprt_clear_connected(xprt); in xprt_disconnect_done()
630 xprt_wake_pending_tasks(xprt, -EAGAIN); in xprt_disconnect_done()
631 spin_unlock_bh(&xprt->transport_lock); in xprt_disconnect_done()
640 void xprt_force_disconnect(struct rpc_xprt *xprt) in xprt_force_disconnect() argument
643 spin_lock_bh(&xprt->transport_lock); in xprt_force_disconnect()
644 set_bit(XPRT_CLOSE_WAIT, &xprt->state); in xprt_force_disconnect()
646 if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0) in xprt_force_disconnect()
647 queue_work(rpciod_workqueue, &xprt->task_cleanup); in xprt_force_disconnect()
648 xprt_wake_pending_tasks(xprt, -EAGAIN); in xprt_force_disconnect()
649 spin_unlock_bh(&xprt->transport_lock); in xprt_force_disconnect()
663 void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie) in xprt_conditional_disconnect() argument
666 spin_lock_bh(&xprt->transport_lock); in xprt_conditional_disconnect()
667 if (cookie != xprt->connect_cookie) in xprt_conditional_disconnect()
669 if (test_bit(XPRT_CLOSING, &xprt->state) || !xprt_connected(xprt)) in xprt_conditional_disconnect()
671 set_bit(XPRT_CLOSE_WAIT, &xprt->state); in xprt_conditional_disconnect()
673 if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0) in xprt_conditional_disconnect()
674 queue_work(rpciod_workqueue, &xprt->task_cleanup); in xprt_conditional_disconnect()
675 xprt_wake_pending_tasks(xprt, -EAGAIN); in xprt_conditional_disconnect()
677 spin_unlock_bh(&xprt->transport_lock); in xprt_conditional_disconnect()
683 struct rpc_xprt *xprt = (struct rpc_xprt *)data; in xprt_init_autodisconnect() local
685 spin_lock(&xprt->transport_lock); in xprt_init_autodisconnect()
686 if (!list_empty(&xprt->recv)) in xprt_init_autodisconnect()
688 if (test_and_set_bit(XPRT_LOCKED, &xprt->state)) in xprt_init_autodisconnect()
690 spin_unlock(&xprt->transport_lock); in xprt_init_autodisconnect()
691 queue_work(rpciod_workqueue, &xprt->task_cleanup); in xprt_init_autodisconnect()
694 spin_unlock(&xprt->transport_lock); in xprt_init_autodisconnect()
697 bool xprt_lock_connect(struct rpc_xprt *xprt, in xprt_lock_connect() argument
703 spin_lock_bh(&xprt->transport_lock); in xprt_lock_connect()
704 if (!test_bit(XPRT_LOCKED, &xprt->state)) in xprt_lock_connect()
706 if (xprt->snd_task != task) in xprt_lock_connect()
709 xprt->snd_task = cookie; in xprt_lock_connect()
712 spin_unlock_bh(&xprt->transport_lock); in xprt_lock_connect()
716 void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie) in xprt_unlock_connect() argument
718 spin_lock_bh(&xprt->transport_lock); in xprt_unlock_connect()
719 if (xprt->snd_task != cookie) in xprt_unlock_connect()
721 if (!test_bit(XPRT_LOCKED, &xprt->state)) in xprt_unlock_connect()
723 xprt->snd_task =NULL; in xprt_unlock_connect()
724 xprt->ops->release_xprt(xprt, NULL); in xprt_unlock_connect()
726 spin_unlock_bh(&xprt->transport_lock); in xprt_unlock_connect()
727 wake_up_bit(&xprt->state, XPRT_LOCKED); in xprt_unlock_connect()
737 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in xprt_connect() local
740 xprt, (xprt_connected(xprt) ? "is" : "is not")); in xprt_connect()
742 if (!xprt_bound(xprt)) { in xprt_connect()
746 if (!xprt_lock_write(xprt, task)) in xprt_connect()
749 if (test_and_clear_bit(XPRT_CLOSE_WAIT, &xprt->state)) in xprt_connect()
750 xprt->ops->close(xprt); in xprt_connect()
752 if (!xprt_connected(xprt)) { in xprt_connect()
755 rpc_sleep_on(&xprt->pending, task, xprt_connect_status); in xprt_connect()
757 if (test_bit(XPRT_CLOSING, &xprt->state)) in xprt_connect()
759 if (xprt_test_and_set_connecting(xprt)) in xprt_connect()
761 xprt->stat.connect_start = jiffies; in xprt_connect()
762 xprt->ops->connect(xprt, task); in xprt_connect()
764 xprt_release_write(xprt, task); in xprt_connect()
769 struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; in xprt_connect_status() local
772 xprt->stat.connect_count++; in xprt_connect_status()
773 xprt->stat.connect_time += (long)jiffies - xprt->stat.connect_start; in xprt_connect_status()
796 xprt->servername); in xprt_connect_status()
807 struct rpc_rqst *xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid) in xprt_lookup_rqst() argument
811 list_for_each_entry(entry, &xprt->recv, rq_list) in xprt_lookup_rqst()
813 trace_xprt_lookup_rqst(xprt, xid, 0); in xprt_lookup_rqst()
819 trace_xprt_lookup_rqst(xprt, xid, -ENOENT); in xprt_lookup_rqst()
820 xprt->stat.bad_xids++; in xprt_lookup_rqst()
849 struct rpc_xprt *xprt = req->rq_xprt; in xprt_complete_rqst() local
853 trace_xprt_complete_rqst(xprt, req->rq_xid, copied); in xprt_complete_rqst()
855 xprt->stat.recvs++; in xprt_complete_rqst()
857 if (xprt->ops->timer != NULL) in xprt_complete_rqst()
866 rpc_wake_up_queued_task(&xprt->pending, task); in xprt_complete_rqst()
873 struct rpc_xprt *xprt = req->rq_xprt; in xprt_timer() local
879 spin_lock_bh(&xprt->transport_lock); in xprt_timer()
881 if (xprt->ops->timer) in xprt_timer()
882 xprt->ops->timer(xprt, task); in xprt_timer()
885 spin_unlock_bh(&xprt->transport_lock); in xprt_timer()
888 static inline int xprt_has_timer(struct rpc_xprt *xprt) in xprt_has_timer() argument
890 return xprt->idle_timeout != 0; in xprt_has_timer()
901 struct rpc_xprt *xprt = req->rq_xprt; in xprt_prepare_transmit() local
906 spin_lock_bh(&xprt->transport_lock); in xprt_prepare_transmit()
913 && xprt_connected(xprt) in xprt_prepare_transmit()
914 && req->rq_connect_cookie == xprt->connect_cookie) { in xprt_prepare_transmit()
915 xprt->ops->set_retrans_timeout(task); in xprt_prepare_transmit()
916 rpc_sleep_on(&xprt->pending, task, xprt_timer); in xprt_prepare_transmit()
920 if (!xprt->ops->reserve_xprt(xprt, task)) { in xprt_prepare_transmit()
926 spin_unlock_bh(&xprt->transport_lock); in xprt_prepare_transmit()
944 struct rpc_xprt *xprt = req->rq_xprt; in xprt_transmit() local
954 spin_lock_bh(&xprt->transport_lock); in xprt_transmit()
959 list_add_tail(&req->rq_list, &xprt->recv); in xprt_transmit()
960 spin_unlock_bh(&xprt->transport_lock); in xprt_transmit()
963 del_singleshot_timer_sync(&xprt->timer); in xprt_transmit()
969 status = xprt->ops->send_request(task); in xprt_transmit()
970 trace_xprt_transmit(xprt, req->rq_xid, status); in xprt_transmit()
975 xprt_inject_disconnect(xprt); in xprt_transmit()
979 spin_lock_bh(&xprt->transport_lock); in xprt_transmit()
981 xprt->ops->set_retrans_timeout(task); in xprt_transmit()
983 numreqs = atomic_read(&xprt->num_reqs); in xprt_transmit()
984 if (numreqs > xprt->stat.max_slots) in xprt_transmit()
985 xprt->stat.max_slots = numreqs; in xprt_transmit()
986 xprt->stat.sends++; in xprt_transmit()
987 xprt->stat.req_u += xprt->stat.sends - xprt->stat.recvs; in xprt_transmit()
988 xprt->stat.bklog_u += xprt->backlog.qlen; in xprt_transmit()
989 xprt->stat.sending_u += xprt->sending.qlen; in xprt_transmit()
990 xprt->stat.pending_u += xprt->pending.qlen; in xprt_transmit()
993 if (!xprt_connected(xprt)) in xprt_transmit()
1001 rpc_sleep_on(&xprt->pending, task, xprt_timer); in xprt_transmit()
1002 req->rq_connect_cookie = xprt->connect_cookie; in xprt_transmit()
1004 spin_unlock_bh(&xprt->transport_lock); in xprt_transmit()
1007 static void xprt_add_backlog(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_add_backlog() argument
1009 set_bit(XPRT_CONGESTED, &xprt->state); in xprt_add_backlog()
1010 rpc_sleep_on(&xprt->backlog, task, NULL); in xprt_add_backlog()
1013 static void xprt_wake_up_backlog(struct rpc_xprt *xprt) in xprt_wake_up_backlog() argument
1015 if (rpc_wake_up_next(&xprt->backlog) == NULL) in xprt_wake_up_backlog()
1016 clear_bit(XPRT_CONGESTED, &xprt->state); in xprt_wake_up_backlog()
1019 static bool xprt_throttle_congested(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_throttle_congested() argument
1023 if (!test_bit(XPRT_CONGESTED, &xprt->state)) in xprt_throttle_congested()
1025 spin_lock(&xprt->reserve_lock); in xprt_throttle_congested()
1026 if (test_bit(XPRT_CONGESTED, &xprt->state)) { in xprt_throttle_congested()
1027 rpc_sleep_on(&xprt->backlog, task, NULL); in xprt_throttle_congested()
1030 spin_unlock(&xprt->reserve_lock); in xprt_throttle_congested()
1035 static struct rpc_rqst *xprt_dynamic_alloc_slot(struct rpc_xprt *xprt, gfp_t gfp_flags) in xprt_dynamic_alloc_slot() argument
1039 if (!atomic_add_unless(&xprt->num_reqs, 1, xprt->max_reqs)) in xprt_dynamic_alloc_slot()
1044 atomic_dec(&xprt->num_reqs); in xprt_dynamic_alloc_slot()
1050 static bool xprt_dynamic_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) in xprt_dynamic_free_slot() argument
1052 if (atomic_add_unless(&xprt->num_reqs, -1, xprt->min_reqs)) { in xprt_dynamic_free_slot()
1059 void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_alloc_slot() argument
1063 spin_lock(&xprt->reserve_lock); in xprt_alloc_slot()
1064 if (!list_empty(&xprt->free)) { in xprt_alloc_slot()
1065 req = list_entry(xprt->free.next, struct rpc_rqst, rq_list); in xprt_alloc_slot()
1069 req = xprt_dynamic_alloc_slot(xprt, GFP_NOWAIT|__GFP_NOWARN); in xprt_alloc_slot()
1079 xprt_add_backlog(xprt, task); in xprt_alloc_slot()
1084 spin_unlock(&xprt->reserve_lock); in xprt_alloc_slot()
1089 xprt_request_init(task, xprt); in xprt_alloc_slot()
1090 spin_unlock(&xprt->reserve_lock); in xprt_alloc_slot()
1094 void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) in xprt_lock_and_alloc_slot() argument
1101 if (xprt_lock_write(xprt, task)) { in xprt_lock_and_alloc_slot()
1102 xprt_alloc_slot(xprt, task); in xprt_lock_and_alloc_slot()
1103 xprt_release_write(xprt, task); in xprt_lock_and_alloc_slot()
1108 static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) in xprt_free_slot() argument
1110 spin_lock(&xprt->reserve_lock); in xprt_free_slot()
1111 if (!xprt_dynamic_free_slot(xprt, req)) { in xprt_free_slot()
1113 list_add(&req->rq_list, &xprt->free); in xprt_free_slot()
1115 xprt_wake_up_backlog(xprt); in xprt_free_slot()
1116 spin_unlock(&xprt->reserve_lock); in xprt_free_slot()
1119 static void xprt_free_all_slots(struct rpc_xprt *xprt) in xprt_free_all_slots() argument
1122 while (!list_empty(&xprt->free)) { in xprt_free_all_slots()
1123 req = list_first_entry(&xprt->free, struct rpc_rqst, rq_list); in xprt_free_all_slots()
1133 struct rpc_xprt *xprt; in xprt_alloc() local
1137 xprt = kzalloc(size, GFP_KERNEL); in xprt_alloc()
1138 if (xprt == NULL) in xprt_alloc()
1141 xprt_init(xprt, net); in xprt_alloc()
1147 list_add(&req->rq_list, &xprt->free); in xprt_alloc()
1150 xprt->max_reqs = max_alloc; in xprt_alloc()
1152 xprt->max_reqs = num_prealloc; in xprt_alloc()
1153 xprt->min_reqs = num_prealloc; in xprt_alloc()
1154 atomic_set(&xprt->num_reqs, num_prealloc); in xprt_alloc()
1156 return xprt; in xprt_alloc()
1159 xprt_free(xprt); in xprt_alloc()
1165 void xprt_free(struct rpc_xprt *xprt) in xprt_free() argument
1167 put_net(xprt->xprt_net); in xprt_free()
1168 xprt_free_all_slots(xprt); in xprt_free()
1169 kfree(xprt); in xprt_free()
1183 struct rpc_xprt *xprt; in xprt_reserve() local
1192 xprt = rcu_dereference(task->tk_client->cl_xprt); in xprt_reserve()
1193 if (!xprt_throttle_congested(xprt, task)) in xprt_reserve()
1194 xprt->ops->alloc_slot(xprt, task); in xprt_reserve()
1209 struct rpc_xprt *xprt; in xprt_retry_reserve() local
1218 xprt = rcu_dereference(task->tk_client->cl_xprt); in xprt_retry_reserve()
1219 xprt->ops->alloc_slot(xprt, task); in xprt_retry_reserve()
1223 static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt) in xprt_alloc_xid() argument
1225 return (__force __be32)xprt->xid++; in xprt_alloc_xid()
1228 static inline void xprt_init_xid(struct rpc_xprt *xprt) in xprt_init_xid() argument
1230 xprt->xid = prandom_u32(); in xprt_init_xid()
1233 static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) in xprt_request_init() argument
1240 req->rq_xprt = xprt; in xprt_request_init()
1242 req->rq_xid = xprt_alloc_xid(xprt); in xprt_request_init()
1243 req->rq_connect_cookie = xprt->connect_cookie - 1; in xprt_request_init()
1262 struct rpc_xprt *xprt; in xprt_release() local
1268 xprt = rcu_dereference(task->tk_client->cl_xprt); in xprt_release()
1269 if (xprt->snd_task == task) in xprt_release()
1270 xprt_release_write(xprt, task); in xprt_release()
1276 xprt = req->rq_xprt; in xprt_release()
1281 spin_lock_bh(&xprt->transport_lock); in xprt_release()
1282 xprt->ops->release_xprt(xprt, task); in xprt_release()
1283 if (xprt->ops->release_request) in xprt_release()
1284 xprt->ops->release_request(task); in xprt_release()
1287 xprt->last_used = jiffies; in xprt_release()
1288 if (list_empty(&xprt->recv) && xprt_has_timer(xprt)) in xprt_release()
1289 mod_timer(&xprt->timer, in xprt_release()
1290 xprt->last_used + xprt->idle_timeout); in xprt_release()
1291 spin_unlock_bh(&xprt->transport_lock); in xprt_release()
1293 xprt->ops->buf_free(req->rq_buffer); in xprt_release()
1294 xprt_inject_disconnect(xprt); in xprt_release()
1303 xprt_free_slot(xprt, req); in xprt_release()
1308 static void xprt_init(struct rpc_xprt *xprt, struct net *net) in xprt_init() argument
1310 atomic_set(&xprt->count, 1); in xprt_init()
1312 spin_lock_init(&xprt->transport_lock); in xprt_init()
1313 spin_lock_init(&xprt->reserve_lock); in xprt_init()
1315 INIT_LIST_HEAD(&xprt->free); in xprt_init()
1316 INIT_LIST_HEAD(&xprt->recv); in xprt_init()
1318 spin_lock_init(&xprt->bc_pa_lock); in xprt_init()
1319 INIT_LIST_HEAD(&xprt->bc_pa_list); in xprt_init()
1322 xprt->last_used = jiffies; in xprt_init()
1323 xprt->cwnd = RPC_INITCWND; in xprt_init()
1324 xprt->bind_index = 0; in xprt_init()
1326 rpc_init_wait_queue(&xprt->binding, "xprt_binding"); in xprt_init()
1327 rpc_init_wait_queue(&xprt->pending, "xprt_pending"); in xprt_init()
1328 rpc_init_priority_wait_queue(&xprt->sending, "xprt_sending"); in xprt_init()
1329 rpc_init_priority_wait_queue(&xprt->backlog, "xprt_backlog"); in xprt_init()
1331 xprt_init_xid(xprt); in xprt_init()
1333 xprt->xprt_net = get_net(net); in xprt_init()
1343 struct rpc_xprt *xprt; in xprt_create_transport() local
1358 xprt = t->setup(args); in xprt_create_transport()
1359 if (IS_ERR(xprt)) { in xprt_create_transport()
1361 -PTR_ERR(xprt)); in xprt_create_transport()
1365 xprt->idle_timeout = 0; in xprt_create_transport()
1366 INIT_WORK(&xprt->task_cleanup, xprt_autoclose); in xprt_create_transport()
1367 if (xprt_has_timer(xprt)) in xprt_create_transport()
1368 setup_timer(&xprt->timer, xprt_init_autodisconnect, in xprt_create_transport()
1369 (unsigned long)xprt); in xprt_create_transport()
1371 init_timer(&xprt->timer); in xprt_create_transport()
1374 xprt_destroy(xprt); in xprt_create_transport()
1377 xprt->servername = kstrdup(args->servername, GFP_KERNEL); in xprt_create_transport()
1378 if (xprt->servername == NULL) { in xprt_create_transport()
1379 xprt_destroy(xprt); in xprt_create_transport()
1383 rpc_xprt_debugfs_register(xprt); in xprt_create_transport()
1385 dprintk("RPC: created transport %p with %u slots\n", xprt, in xprt_create_transport()
1386 xprt->max_reqs); in xprt_create_transport()
1388 return xprt; in xprt_create_transport()
1396 static void xprt_destroy(struct rpc_xprt *xprt) in xprt_destroy() argument
1398 dprintk("RPC: destroying transport %p\n", xprt); in xprt_destroy()
1401 wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_UNINTERRUPTIBLE); in xprt_destroy()
1403 del_timer_sync(&xprt->timer); in xprt_destroy()
1405 rpc_xprt_debugfs_unregister(xprt); in xprt_destroy()
1406 rpc_destroy_wait_queue(&xprt->binding); in xprt_destroy()
1407 rpc_destroy_wait_queue(&xprt->pending); in xprt_destroy()
1408 rpc_destroy_wait_queue(&xprt->sending); in xprt_destroy()
1409 rpc_destroy_wait_queue(&xprt->backlog); in xprt_destroy()
1410 cancel_work_sync(&xprt->task_cleanup); in xprt_destroy()
1411 kfree(xprt->servername); in xprt_destroy()
1415 xprt->ops->destroy(xprt); in xprt_destroy()
1423 void xprt_put(struct rpc_xprt *xprt) in xprt_put() argument
1425 if (atomic_dec_and_test(&xprt->count)) in xprt_put()
1426 xprt_destroy(xprt); in xprt_put()