Lines Matching refs:xprt
29 static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt);
33 static void svc_delete_xprt(struct svc_xprt *xprt);
144 struct svc_xprt *xprt = in svc_xprt_free() local
146 struct module *owner = xprt->xpt_class->xcl_owner; in svc_xprt_free()
147 if (test_bit(XPT_CACHE_AUTH, &xprt->xpt_flags)) in svc_xprt_free()
148 svcauth_unix_info_release(xprt); in svc_xprt_free()
149 put_cred(xprt->xpt_cred); in svc_xprt_free()
150 put_net(xprt->xpt_net); in svc_xprt_free()
152 if (xprt->xpt_bc_xprt) in svc_xprt_free()
153 xprt_put(xprt->xpt_bc_xprt); in svc_xprt_free()
154 if (xprt->xpt_bc_xps) in svc_xprt_free()
155 xprt_switch_put(xprt->xpt_bc_xps); in svc_xprt_free()
156 trace_svc_xprt_free(xprt); in svc_xprt_free()
157 xprt->xpt_ops->xpo_free(xprt); in svc_xprt_free()
161 void svc_xprt_put(struct svc_xprt *xprt) in svc_xprt_put() argument
163 kref_put(&xprt->xpt_ref, svc_xprt_free); in svc_xprt_put()
172 struct svc_xprt *xprt, struct svc_serv *serv) in svc_xprt_init() argument
174 memset(xprt, 0, sizeof(*xprt)); in svc_xprt_init()
175 xprt->xpt_class = xcl; in svc_xprt_init()
176 xprt->xpt_ops = xcl->xcl_ops; in svc_xprt_init()
177 kref_init(&xprt->xpt_ref); in svc_xprt_init()
178 xprt->xpt_server = serv; in svc_xprt_init()
179 INIT_LIST_HEAD(&xprt->xpt_list); in svc_xprt_init()
180 INIT_LIST_HEAD(&xprt->xpt_ready); in svc_xprt_init()
181 INIT_LIST_HEAD(&xprt->xpt_deferred); in svc_xprt_init()
182 INIT_LIST_HEAD(&xprt->xpt_users); in svc_xprt_init()
183 mutex_init(&xprt->xpt_mutex); in svc_xprt_init()
184 spin_lock_init(&xprt->xpt_lock); in svc_xprt_init()
185 set_bit(XPT_BUSY, &xprt->xpt_flags); in svc_xprt_init()
186 xprt->xpt_net = get_net(net); in svc_xprt_init()
187 strcpy(xprt->xpt_remotebuf, "uninitialized"); in svc_xprt_init()
210 struct svc_xprt *xprt; in __svc_xpo_create() local
229 xprt = xcl->xcl_ops->xpo_create(serv, net, sap, len, flags); in __svc_xpo_create()
230 if (IS_ERR(xprt)) in __svc_xpo_create()
232 xcl->xcl_name, sap, xprt); in __svc_xpo_create()
233 return xprt; in __svc_xpo_create()
244 static void svc_xprt_received(struct svc_xprt *xprt) in svc_xprt_received() argument
246 if (!test_bit(XPT_BUSY, &xprt->xpt_flags)) { in svc_xprt_received()
247 WARN_ONCE(1, "xprt=0x%p already busy!", xprt); in svc_xprt_received()
254 svc_xprt_get(xprt); in svc_xprt_received()
256 clear_bit(XPT_BUSY, &xprt->xpt_flags); in svc_xprt_received()
257 xprt->xpt_server->sv_ops->svo_enqueue_xprt(xprt); in svc_xprt_received()
258 svc_xprt_put(xprt); in svc_xprt_received()
325 void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt) in svc_xprt_copy_addrs() argument
327 memcpy(&rqstp->rq_addr, &xprt->xpt_remote, xprt->xpt_remotelen); in svc_xprt_copy_addrs()
328 rqstp->rq_addrlen = xprt->xpt_remotelen; in svc_xprt_copy_addrs()
334 memcpy(&rqstp->rq_daddr, &xprt->xpt_local, xprt->xpt_locallen); in svc_xprt_copy_addrs()
335 rqstp->rq_daddrlen = xprt->xpt_locallen; in svc_xprt_copy_addrs()
352 static bool svc_xprt_slots_in_range(struct svc_xprt *xprt) in svc_xprt_slots_in_range() argument
355 int nrqsts = atomic_read(&xprt->xpt_nr_rqsts); in svc_xprt_slots_in_range()
360 static bool svc_xprt_reserve_slot(struct svc_rqst *rqstp, struct svc_xprt *xprt) in svc_xprt_reserve_slot() argument
363 if (!svc_xprt_slots_in_range(xprt)) in svc_xprt_reserve_slot()
365 atomic_inc(&xprt->xpt_nr_rqsts); in svc_xprt_reserve_slot()
373 struct svc_xprt *xprt = rqstp->rq_xprt; in svc_xprt_release_slot() local
375 atomic_dec(&xprt->xpt_nr_rqsts); in svc_xprt_release_slot()
377 svc_xprt_enqueue(xprt); in svc_xprt_release_slot()
381 static bool svc_xprt_ready(struct svc_xprt *xprt) in svc_xprt_ready() argument
394 xpt_flags = READ_ONCE(xprt->xpt_flags); in svc_xprt_ready()
399 if (xprt->xpt_ops->xpo_has_wspace(xprt) && in svc_xprt_ready()
400 svc_xprt_slots_in_range(xprt)) in svc_xprt_ready()
402 trace_svc_xprt_no_write_space(xprt); in svc_xprt_ready()
408 void svc_xprt_do_enqueue(struct svc_xprt *xprt) in svc_xprt_do_enqueue() argument
414 if (!svc_xprt_ready(xprt)) in svc_xprt_do_enqueue()
422 if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) in svc_xprt_do_enqueue()
426 pool = svc_pool_for_cpu(xprt->xpt_server, cpu); in svc_xprt_do_enqueue()
431 list_add_tail(&xprt->xpt_ready, &pool->sp_sockets); in svc_xprt_do_enqueue()
450 trace_svc_xprt_do_enqueue(xprt, rqstp); in svc_xprt_do_enqueue()
459 void svc_xprt_enqueue(struct svc_xprt *xprt) in svc_xprt_enqueue() argument
461 if (test_bit(XPT_BUSY, &xprt->xpt_flags)) in svc_xprt_enqueue()
463 xprt->xpt_server->sv_ops->svo_enqueue_xprt(xprt); in svc_xprt_enqueue()
472 struct svc_xprt *xprt = NULL; in svc_xprt_dequeue() local
479 xprt = list_first_entry(&pool->sp_sockets, in svc_xprt_dequeue()
481 list_del_init(&xprt->xpt_ready); in svc_xprt_dequeue()
482 svc_xprt_get(xprt); in svc_xprt_dequeue()
486 return xprt; in svc_xprt_dequeue()
501 struct svc_xprt *xprt = rqstp->rq_xprt; in svc_reserve() local
505 if (xprt && space < rqstp->rq_reserved) { in svc_reserve()
506 atomic_sub((rqstp->rq_reserved - space), &xprt->xpt_reserved); in svc_reserve()
509 svc_xprt_enqueue(xprt); in svc_reserve()
516 struct svc_xprt *xprt = rqstp->rq_xprt; in svc_xprt_release() local
518 xprt->xpt_ops->xpo_release_rqst(rqstp); in svc_xprt_release()
541 svc_xprt_put(xprt); in svc_xprt_release()
615 struct svc_xprt *xprt = NULL; in svc_check_conn_limits() local
627 xprt = list_entry(serv->sv_tempsocks.prev, in svc_check_conn_limits()
630 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_check_conn_limits()
631 svc_xprt_get(xprt); in svc_check_conn_limits()
635 if (xprt) { in svc_check_conn_limits()
636 svc_xprt_enqueue(xprt); in svc_check_conn_limits()
637 svc_xprt_put(xprt); in svc_check_conn_limits()
779 static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt) in svc_handle_xprt() argument
784 if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) { in svc_handle_xprt()
785 if (test_and_clear_bit(XPT_KILL_TEMP, &xprt->xpt_flags)) in svc_handle_xprt()
786 xprt->xpt_ops->xpo_kill_temp_xprt(xprt); in svc_handle_xprt()
787 svc_delete_xprt(xprt); in svc_handle_xprt()
791 if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) { in svc_handle_xprt()
797 __module_get(xprt->xpt_class->xcl_owner); in svc_handle_xprt()
798 svc_check_conn_limits(xprt->xpt_server); in svc_handle_xprt()
799 newxpt = xprt->xpt_ops->xpo_accept(xprt); in svc_handle_xprt()
801 newxpt->xpt_cred = get_cred(xprt->xpt_cred); in svc_handle_xprt()
805 module_put(xprt->xpt_class->xcl_owner); in svc_handle_xprt()
806 } else if (svc_xprt_reserve_slot(rqstp, xprt)) { in svc_handle_xprt()
809 rqstp, rqstp->rq_pool->sp_id, xprt, in svc_handle_xprt()
810 kref_read(&xprt->xpt_ref)); in svc_handle_xprt()
811 rqstp->rq_deferred = svc_deferred_dequeue(xprt); in svc_handle_xprt()
815 len = xprt->xpt_ops->xpo_recvfrom(rqstp); in svc_handle_xprt()
820 atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved); in svc_handle_xprt()
823 svc_xprt_received(xprt); in svc_handle_xprt()
825 trace_svc_handle_xprt(xprt, len); in svc_handle_xprt()
836 struct svc_xprt *xprt = NULL; in svc_recv() local
850 xprt = svc_get_next_xprt(rqstp, timeout); in svc_recv()
851 if (IS_ERR(xprt)) { in svc_recv()
852 err = PTR_ERR(xprt); in svc_recv()
856 len = svc_handle_xprt(rqstp, xprt); in svc_recv()
863 clear_bit(XPT_OLD, &xprt->xpt_flags); in svc_recv()
865 xprt->xpt_ops->xpo_secure_port(rqstp); in svc_recv()
896 struct svc_xprt *xprt; in svc_send() local
900 xprt = rqstp->rq_xprt; in svc_send()
901 if (!xprt) in svc_send()
912 len = xprt->xpt_ops->xpo_sendto(rqstp); in svc_send()
930 struct svc_xprt *xprt; in svc_age_temp_xprts() local
943 xprt = list_entry(le, struct svc_xprt, xpt_list); in svc_age_temp_xprts()
947 if (!test_and_set_bit(XPT_OLD, &xprt->xpt_flags)) in svc_age_temp_xprts()
949 if (kref_read(&xprt->xpt_ref) > 1 || in svc_age_temp_xprts()
950 test_bit(XPT_BUSY, &xprt->xpt_flags)) in svc_age_temp_xprts()
953 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_age_temp_xprts()
954 dprintk("queuing xprt %p for closing\n", xprt); in svc_age_temp_xprts()
957 svc_xprt_enqueue(xprt); in svc_age_temp_xprts()
972 struct svc_xprt *xprt; in svc_age_temp_xprts_now() local
978 xprt = list_entry(le, struct svc_xprt, xpt_list); in svc_age_temp_xprts_now()
980 &xprt->xpt_local)) { in svc_age_temp_xprts_now()
981 dprintk("svc_age_temp_xprts_now: found %p\n", xprt); in svc_age_temp_xprts_now()
990 xprt = list_entry(le, struct svc_xprt, xpt_list); in svc_age_temp_xprts_now()
991 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_age_temp_xprts_now()
992 set_bit(XPT_KILL_TEMP, &xprt->xpt_flags); in svc_age_temp_xprts_now()
994 xprt); in svc_age_temp_xprts_now()
995 svc_xprt_enqueue(xprt); in svc_age_temp_xprts_now()
1000 static void call_xpt_users(struct svc_xprt *xprt) in call_xpt_users() argument
1004 spin_lock(&xprt->xpt_lock); in call_xpt_users()
1005 while (!list_empty(&xprt->xpt_users)) { in call_xpt_users()
1006 u = list_first_entry(&xprt->xpt_users, struct svc_xpt_user, list); in call_xpt_users()
1010 spin_unlock(&xprt->xpt_lock); in call_xpt_users()
1016 static void svc_delete_xprt(struct svc_xprt *xprt) in svc_delete_xprt() argument
1018 struct svc_serv *serv = xprt->xpt_server; in svc_delete_xprt()
1021 if (test_and_set_bit(XPT_DEAD, &xprt->xpt_flags)) in svc_delete_xprt()
1024 trace_svc_xprt_detach(xprt); in svc_delete_xprt()
1025 xprt->xpt_ops->xpo_detach(xprt); in svc_delete_xprt()
1026 if (xprt->xpt_bc_xprt) in svc_delete_xprt()
1027 xprt->xpt_bc_xprt->ops->close(xprt->xpt_bc_xprt); in svc_delete_xprt()
1030 list_del_init(&xprt->xpt_list); in svc_delete_xprt()
1031 WARN_ON_ONCE(!list_empty(&xprt->xpt_ready)); in svc_delete_xprt()
1032 if (test_bit(XPT_TEMP, &xprt->xpt_flags)) in svc_delete_xprt()
1036 while ((dr = svc_deferred_dequeue(xprt)) != NULL) in svc_delete_xprt()
1039 call_xpt_users(xprt); in svc_delete_xprt()
1040 svc_xprt_put(xprt); in svc_delete_xprt()
1043 void svc_close_xprt(struct svc_xprt *xprt) in svc_close_xprt() argument
1045 trace_svc_xprt_close(xprt); in svc_close_xprt()
1046 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_close_xprt()
1047 if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) in svc_close_xprt()
1056 svc_delete_xprt(xprt); in svc_close_xprt()
1062 struct svc_xprt *xprt; in svc_close_list() local
1066 list_for_each_entry(xprt, xprt_list, xpt_list) { in svc_close_list()
1067 if (xprt->xpt_net != net) in svc_close_list()
1070 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_close_list()
1071 svc_xprt_enqueue(xprt); in svc_close_list()
1080 struct svc_xprt *xprt; in svc_dequeue_net() local
1088 list_for_each_entry_safe(xprt, tmp, &pool->sp_sockets, xpt_ready) { in svc_dequeue_net()
1089 if (xprt->xpt_net != net) in svc_dequeue_net()
1091 list_del_init(&xprt->xpt_ready); in svc_dequeue_net()
1093 return xprt; in svc_dequeue_net()
1102 struct svc_xprt *xprt; in svc_clean_up_xprts() local
1104 while ((xprt = svc_dequeue_net(serv, net))) { in svc_clean_up_xprts()
1105 set_bit(XPT_CLOSE, &xprt->xpt_flags); in svc_clean_up_xprts()
1106 svc_delete_xprt(xprt); in svc_clean_up_xprts()
1142 struct svc_xprt *xprt = dr->xprt; in svc_revisit() local
1144 spin_lock(&xprt->xpt_lock); in svc_revisit()
1145 set_bit(XPT_DEFERRED, &xprt->xpt_flags); in svc_revisit()
1146 if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) { in svc_revisit()
1147 spin_unlock(&xprt->xpt_lock); in svc_revisit()
1149 svc_xprt_put(xprt); in svc_revisit()
1153 dr->xprt = NULL; in svc_revisit()
1154 list_add(&dr->handle.recent, &xprt->xpt_deferred); in svc_revisit()
1155 spin_unlock(&xprt->xpt_lock); in svc_revisit()
1157 svc_xprt_enqueue(xprt); in svc_revisit()
1158 svc_xprt_put(xprt); in svc_revisit()
1204 dr->xprt = rqstp->rq_xprt; in svc_defer()
1238 static struct svc_deferred_req *svc_deferred_dequeue(struct svc_xprt *xprt) in svc_deferred_dequeue() argument
1242 if (!test_bit(XPT_DEFERRED, &xprt->xpt_flags)) in svc_deferred_dequeue()
1244 spin_lock(&xprt->xpt_lock); in svc_deferred_dequeue()
1245 if (!list_empty(&xprt->xpt_deferred)) { in svc_deferred_dequeue()
1246 dr = list_entry(xprt->xpt_deferred.next, in svc_deferred_dequeue()
1251 clear_bit(XPT_DEFERRED, &xprt->xpt_flags); in svc_deferred_dequeue()
1252 spin_unlock(&xprt->xpt_lock); in svc_deferred_dequeue()
1276 struct svc_xprt *xprt; in svc_find_xprt() local
1284 list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list) { in svc_find_xprt()
1285 if (xprt->xpt_net != net) in svc_find_xprt()
1287 if (strcmp(xprt->xpt_class->xcl_name, xcl_name)) in svc_find_xprt()
1289 if (af != AF_UNSPEC && af != xprt->xpt_local.ss_family) in svc_find_xprt()
1291 if (port != 0 && port != svc_xprt_local_port(xprt)) in svc_find_xprt()
1293 found = xprt; in svc_find_xprt()
1294 svc_xprt_get(xprt); in svc_find_xprt()
1302 static int svc_one_xprt_name(const struct svc_xprt *xprt, in svc_one_xprt_name() argument
1308 xprt->xpt_class->xcl_name, in svc_one_xprt_name()
1309 svc_xprt_local_port(xprt)); in svc_one_xprt_name()
1329 struct svc_xprt *xprt; in svc_xprt_names() local
1341 list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list) { in svc_xprt_names()
1342 len = svc_one_xprt_name(xprt, pos, buflen - totlen); in svc_xprt_names()