Lines Matching refs:xprt

30 static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt);
34 static void svc_delete_xprt(struct svc_xprt *xprt);
150 void svc_xprt_deferred_close(struct svc_xprt *xprt) in svc_xprt_deferred_close() argument
152 if (!test_and_set_bit(XPT_CLOSE, &xprt->xpt_flags)) in svc_xprt_deferred_close()
153 svc_xprt_enqueue(xprt); in svc_xprt_deferred_close()
159 struct svc_xprt *xprt = in svc_xprt_free() local
161 struct module *owner = xprt->xpt_class->xcl_owner; in svc_xprt_free()
162 if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags)) in svc_xprt_free()
163 svcauth_unix_info_release(xprt); in svc_xprt_free()
164 put_cred(xprt->xpt_cred); in svc_xprt_free()
165 put_net_track(xprt->xpt_net, &xprt->ns_tracker); in svc_xprt_free()
167 if (xprt->xpt_bc_xprt) in svc_xprt_free()
168 xprt_put(xprt->xpt_bc_xprt); in svc_xprt_free()
169 if (xprt->xpt_bc_xps) in svc_xprt_free()
170 xprt_switch_put(xprt->xpt_bc_xps); in svc_xprt_free()
171 trace_svc_xprt_free(xprt); in svc_xprt_free()
172 xprt->xpt_ops->xpo_free(xprt); in svc_xprt_free()
176 void svc_xprt_put(struct svc_xprt *xprt) in svc_xprt_put() argument
178 kref_put(&xprt->xpt_ref, svc_xprt_free); in svc_xprt_put()
187 struct svc_xprt *xprt, struct svc_serv *serv) in svc_xprt_init() argument
189 memset(xprt, 0, sizeof(*xprt)); in svc_xprt_init()
190 xprt->xpt_class = xcl; in svc_xprt_init()
191 xprt->xpt_ops = xcl->xcl_ops; in svc_xprt_init()
192 kref_init(&xprt->xpt_ref); in svc_xprt_init()
193 xprt->xpt_server = serv; in svc_xprt_init()
194 INIT_LIST_HEAD(&xprt->xpt_list); in svc_xprt_init()
195 INIT_LIST_HEAD(&xprt->xpt_ready); in svc_xprt_init()
196 INIT_LIST_HEAD(&xprt->xpt_deferred); in svc_xprt_init()
197 INIT_LIST_HEAD(&xprt->xpt_users); in svc_xprt_init()
198 mutex_init(&xprt->xpt_mutex); in svc_xprt_init()
199 spin_lock_init(&xprt->xpt_lock); in svc_xprt_init()
200 set_bit(XPT_BUSY, &xprt->xpt_flags); in svc_xprt_init()
201 xprt->xpt_net = get_net_track(net, &xprt->ns_tracker, GFP_ATOMIC); in svc_xprt_init()
202 strcpy(xprt->xpt_remotebuf, "uninitialized"); in svc_xprt_init()
225 struct svc_xprt *xprt; in __svc_xpo_create() local
244 xprt = xcl->xcl_ops->xpo_create(serv, net, sap, len, flags); in __svc_xpo_create()
245 if (IS_ERR(xprt)) in __svc_xpo_create()
247 xcl->xcl_name, sap, len, xprt); in __svc_xpo_create()
248 return xprt; in __svc_xpo_create()
261 void svc_xprt_received(struct svc_xprt *xprt) in svc_xprt_received() argument
263 if (!test_bit(XPT_BUSY, &xprt->xpt_flags)) { in svc_xprt_received()
264 WARN_ONCE(1, "xprt=0x%p already busy!", xprt); in svc_xprt_received()
271 svc_xprt_get(xprt); in svc_xprt_received()
273 clear_bit(XPT_BUSY, &xprt->xpt_flags); in svc_xprt_received()
274 svc_xprt_enqueue(xprt); in svc_xprt_received()
275 svc_xprt_put(xprt); in svc_xprt_received()
357 void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt) in svc_xprt_copy_addrs() argument
359 memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen); in svc_xprt_copy_addrs()
360 rqstp->rq_addrlen = xprt->xpt_remotelen; in svc_xprt_copy_addrs()
366 memcpy(&rqstp->rq_daddr, &xprt->xpt_local, xprt->xpt_locallen); in svc_xprt_copy_addrs()
367 rqstp->rq_daddrlen = xprt->xpt_locallen; in svc_xprt_copy_addrs()
384 static bool svc_xprt_slots_in_range(struct svc_xprt *xprt) in svc_xprt_slots_in_range() argument
387 int nrqsts = atomic_read(&xprt->xpt_nr_rqsts); in svc_xprt_slots_in_range()
392 static bool svc_xprt_reserve_slot(struct svc_rqst *rqstp, struct svc_xprt *xprt) in svc_xprt_reserve_slot() argument
395 if (!svc_xprt_slots_in_range(xprt)) in svc_xprt_reserve_slot()
397 atomic_inc(&xprt->xpt_nr_rqsts); in svc_xprt_reserve_slot()
405 struct svc_xprt *xprt = rqstp->rq_xprt; in svc_xprt_release_slot() local
407 atomic_dec(&xprt->xpt_nr_rqsts); in svc_xprt_release_slot()
409 svc_xprt_enqueue(xprt); in svc_xprt_release_slot()
413 static bool svc_xprt_ready(struct svc_xprt *xprt) in svc_xprt_ready() argument
426 xpt_flags = READ_ONCE(xprt->xpt_flags); in svc_xprt_ready()
433 if (xprt->xpt_ops->xpo_has_wspace(xprt) && in svc_xprt_ready()
434 svc_xprt_slots_in_range(xprt)) in svc_xprt_ready()
436 trace_svc_xprt_no_write_space(xprt); in svc_xprt_ready()
447 void svc_xprt_enqueue(struct svc_xprt *xprt) in svc_xprt_enqueue() argument
452 if (!svc_xprt_ready(xprt)) in svc_xprt_enqueue()
460 if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) in svc_xprt_enqueue()
463 pool = svc_pool_for_cpu(xprt->xpt_server); in svc_xprt_enqueue()
467 list_add_tail(&xprt->xpt_ready, &pool->sp_sockets); in svc_xprt_enqueue()
484 trace_svc_xprt_enqueue(xprt, rqstp); in svc_xprt_enqueue()
493 struct svc_xprt *xprt = NULL; in svc_xprt_dequeue() local
500 xprt = list_first_entry(&pool->sp_sockets, in svc_xprt_dequeue()
502 list_del_init(&xprt->xpt_ready); in svc_xprt_dequeue()
503 svc_xprt_get(xprt); in svc_xprt_dequeue()
507 return xprt; in svc_xprt_dequeue()
522 struct svc_xprt *xprt = rqstp->rq_xprt; in svc_reserve() local
526 if (xprt && space < rqstp->rq_reserved) { in svc_reserve()
527 atomic_sub((rqstp->rq_reserved - space), &xprt->xpt_reserved); in svc_reserve()
530 svc_xprt_enqueue(xprt); in svc_reserve()
537 struct svc_xprt *xprt = rqstp->rq_xprt; in svc_xprt_release() local
539 xprt->xpt_ops->xpo_release_rqst(rqstp); in svc_xprt_release()
563 svc_xprt_put(xprt); in svc_xprt_release()
637 struct svc_xprt *xprt = NULL; in svc_check_conn_limits() local
649 xprt = list_entry(serv->sv_tempsocks.prev, in svc_check_conn_limits()
652 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_check_conn_limits()
653 svc_xprt_get(xprt); in svc_check_conn_limits()
657 if (xprt) { in svc_check_conn_limits()
658 svc_xprt_enqueue(xprt); in svc_check_conn_limits()
659 svc_xprt_put(xprt); in svc_check_conn_limits()
803 static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt) in svc_handle_xprt() argument
808 if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { in svc_handle_xprt()
809 if (test_and_clear_bit(XPT_KILL_TEMP, &xprt->xpt_flags)) in svc_handle_xprt()
810 xprt->xpt_ops->xpo_kill_temp_xprt(xprt); in svc_handle_xprt()
811 svc_delete_xprt(xprt); in svc_handle_xprt()
815 if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) { in svc_handle_xprt()
821 __module_get(xprt->xpt_class->xcl_owner); in svc_handle_xprt()
822 svc_check_conn_limits(xprt->xpt_server); in svc_handle_xprt()
823 newxpt = xprt->xpt_ops->xpo_accept(xprt); in svc_handle_xprt()
825 newxpt->xpt_cred = get_cred(xprt->xpt_cred); in svc_handle_xprt()
829 module_put(xprt->xpt_class->xcl_owner); in svc_handle_xprt()
831 svc_xprt_received(xprt); in svc_handle_xprt()
832 } else if (svc_xprt_reserve_slot(rqstp, xprt)) { in svc_handle_xprt()
835 rqstp, rqstp->rq_pool->sp_id, xprt, in svc_handle_xprt()
836 kref_read(&xprt->xpt_ref)); in svc_handle_xprt()
837 rqstp->rq_deferred = svc_deferred_dequeue(xprt); in svc_handle_xprt()
841 len = xprt->xpt_ops->xpo_recvfrom(rqstp); in svc_handle_xprt()
844 atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved); in svc_handle_xprt()
846 svc_xprt_received(xprt); in svc_handle_xprt()
859 struct svc_xprt *xprt = NULL; in svc_recv() local
873 xprt = svc_get_next_xprt(rqstp, timeout); in svc_recv()
874 if (IS_ERR(xprt)) { in svc_recv()
875 err = PTR_ERR(xprt); in svc_recv()
879 len = svc_handle_xprt(rqstp, xprt); in svc_recv()
887 clear_bit(XPT_OLD, &xprt->xpt_flags); in svc_recv()
917 struct svc_xprt *xprt; in svc_send() local
921 xprt = rqstp->rq_xprt; in svc_send()
922 if (!xprt) in svc_send()
933 len = xprt->xpt_ops->xpo_sendto(rqstp); in svc_send()
951 struct svc_xprt *xprt; in svc_age_temp_xprts() local
964 xprt = list_entry(le, struct svc_xprt, xpt_list); in svc_age_temp_xprts()
968 if (!test_and_set_bit(XPT_OLD, &xprt->xpt_flags)) in svc_age_temp_xprts()
970 if (kref_read(&xprt->xpt_ref) > 1 || in svc_age_temp_xprts()
971 test_bit(XPT_BUSY, &xprt->xpt_flags)) in svc_age_temp_xprts()
974 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_age_temp_xprts()
975 dprintk("queuing xprt %p for closing\n", xprt); in svc_age_temp_xprts()
978 svc_xprt_enqueue(xprt); in svc_age_temp_xprts()
993 struct svc_xprt *xprt; in svc_age_temp_xprts_now() local
999 xprt = list_entry(le, struct svc_xprt, xpt_list); in svc_age_temp_xprts_now()
1001 &xprt->xpt_local)) { in svc_age_temp_xprts_now()
1002 dprintk("svc_age_temp_xprts_now: found %p\n", xprt); in svc_age_temp_xprts_now()
1011 xprt = list_entry(le, struct svc_xprt, xpt_list); in svc_age_temp_xprts_now()
1012 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_age_temp_xprts_now()
1013 set_bit(XPT_KILL_TEMP, &xprt->xpt_flags); in svc_age_temp_xprts_now()
1015 xprt); in svc_age_temp_xprts_now()
1016 svc_xprt_enqueue(xprt); in svc_age_temp_xprts_now()
1021 static void call_xpt_users(struct svc_xprt *xprt) in call_xpt_users() argument
1025 spin_lock(&xprt->xpt_lock); in call_xpt_users()
1026 while (!list_empty(&xprt->xpt_users)) { in call_xpt_users()
1027 u = list_first_entry(&xprt->xpt_users, struct svc_xpt_user, list); in call_xpt_users()
1031 spin_unlock(&xprt->xpt_lock); in call_xpt_users()
1037 static void svc_delete_xprt(struct svc_xprt *xprt) in svc_delete_xprt() argument
1039 struct svc_serv *serv = xprt->xpt_server; in svc_delete_xprt()
1042 if (test_and_set_bit(XPT_DEAD, &xprt->xpt_flags)) in svc_delete_xprt()
1045 trace_svc_xprt_detach(xprt); in svc_delete_xprt()
1046 xprt->xpt_ops->xpo_detach(xprt); in svc_delete_xprt()
1047 if (xprt->xpt_bc_xprt) in svc_delete_xprt()
1048 xprt->xpt_bc_xprt->ops->close(xprt->xpt_bc_xprt); in svc_delete_xprt()
1051 list_del_init(&xprt->xpt_list); in svc_delete_xprt()
1052 WARN_ON_ONCE(!list_empty(&xprt->xpt_ready)); in svc_delete_xprt()
1053 if (test_bit(XPT_TEMP, &xprt->xpt_flags)) in svc_delete_xprt()
1057 while ((dr = svc_deferred_dequeue(xprt)) != NULL) in svc_delete_xprt()
1060 call_xpt_users(xprt); in svc_delete_xprt()
1061 svc_xprt_put(xprt); in svc_delete_xprt()
1069 void svc_xprt_close(struct svc_xprt *xprt) in svc_xprt_close() argument
1071 trace_svc_xprt_close(xprt); in svc_xprt_close()
1072 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_xprt_close()
1073 if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) in svc_xprt_close()
1082 svc_delete_xprt(xprt); in svc_xprt_close()
1088 struct svc_xprt *xprt; in svc_close_list() local
1092 list_for_each_entry(xprt, xprt_list, xpt_list) { in svc_close_list()
1093 if (xprt->xpt_net != net) in svc_close_list()
1096 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_close_list()
1097 svc_xprt_enqueue(xprt); in svc_close_list()
1106 struct svc_xprt *xprt; in svc_dequeue_net() local
1114 list_for_each_entry_safe(xprt, tmp, &pool->sp_sockets, xpt_ready) { in svc_dequeue_net()
1115 if (xprt->xpt_net != net) in svc_dequeue_net()
1117 list_del_init(&xprt->xpt_ready); in svc_dequeue_net()
1119 return xprt; in svc_dequeue_net()
1128 struct svc_xprt *xprt; in svc_clean_up_xprts() local
1130 while ((xprt = svc_dequeue_net(serv, net))) { in svc_clean_up_xprts()
1131 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_clean_up_xprts()
1132 svc_delete_xprt(xprt); in svc_clean_up_xprts()
1173 struct svc_xprt *xprt = dr->xprt; in svc_revisit() local
1175 spin_lock(&xprt->xpt_lock); in svc_revisit()
1176 set_bit(XPT_DEFERRED, &xprt->xpt_flags); in svc_revisit()
1177 if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) { in svc_revisit()
1178 spin_unlock(&xprt->xpt_lock); in svc_revisit()
1180 svc_xprt_put(xprt); in svc_revisit()
1184 dr->xprt = NULL; in svc_revisit()
1185 list_add(&dr->handle.recent, &xprt->xpt_deferred); in svc_revisit()
1186 spin_unlock(&xprt->xpt_lock); in svc_revisit()
1188 svc_xprt_enqueue(xprt); in svc_revisit()
1189 svc_xprt_put(xprt); in svc_revisit()
1236 dr->xprt = rqstp->rq_xprt; in svc_defer()
1271 static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt) in svc_deferred_dequeue() argument
1275 if (!test_bit(XPT_DEFERRED, &xprt->xpt_flags)) in svc_deferred_dequeue()
1277 spin_lock(&xprt->xpt_lock); in svc_deferred_dequeue()
1278 if (!list_empty(&xprt->xpt_deferred)) { in svc_deferred_dequeue()
1279 dr = list_entry(xprt->xpt_deferred.next, in svc_deferred_dequeue()
1284 clear_bit(XPT_DEFERRED, &xprt->xpt_flags); in svc_deferred_dequeue()
1285 spin_unlock(&xprt->xpt_lock); in svc_deferred_dequeue()
1309 struct svc_xprt *xprt; in svc_find_xprt() local
1317 list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list) { in svc_find_xprt()
1318 if (xprt->xpt_net != net) in svc_find_xprt()
1320 if (strcmp(xprt->xpt_class->xcl_name, xcl_name)) in svc_find_xprt()
1322 if (af != AF_UNSPEC && af != xprt->xpt_local.ss_family) in svc_find_xprt()
1324 if (port != 0 && port != svc_xprt_local_port(xprt)) in svc_find_xprt()
1326 found = xprt; in svc_find_xprt()
1327 svc_xprt_get(xprt); in svc_find_xprt()
1335 static int svc_one_xprt_name(const struct svc_xprt *xprt, in svc_one_xprt_name() argument
1341 xprt->xpt_class->xcl_name, in svc_one_xprt_name()
1342 svc_xprt_local_port(xprt)); in svc_one_xprt_name()
1362 struct svc_xprt *xprt; in svc_xprt_names() local
1374 list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list) { in svc_xprt_names()
1375 len = svc_one_xprt_name(xprt, pos, buflen - totlen); in svc_xprt_names()