Lines Matching refs:conn
100 static int rxrpc_get_client_connection_id(struct rxrpc_connection *conn, in rxrpc_get_client_connection_id() argument
103 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_get_client_connection_id()
111 id = idr_alloc_cyclic(&rxrpc_client_conn_ids, conn, in rxrpc_get_client_connection_id()
119 conn->proto.epoch = rxnet->epoch; in rxrpc_get_client_connection_id()
120 conn->proto.cid = id << RXRPC_CIDSHIFT; in rxrpc_get_client_connection_id()
121 set_bit(RXRPC_CONN_HAS_IDR, &conn->flags); in rxrpc_get_client_connection_id()
122 _leave(" [CID %x]", conn->proto.cid); in rxrpc_get_client_connection_id()
135 static void rxrpc_put_client_connection_id(struct rxrpc_connection *conn) in rxrpc_put_client_connection_id() argument
137 if (test_bit(RXRPC_CONN_HAS_IDR, &conn->flags)) { in rxrpc_put_client_connection_id()
140 conn->proto.cid >> RXRPC_CIDSHIFT); in rxrpc_put_client_connection_id()
150 struct rxrpc_connection *conn; in rxrpc_destroy_client_conn_ids() local
154 idr_for_each_entry(&rxrpc_client_conn_ids, conn, id) { in rxrpc_destroy_client_conn_ids()
156 conn, atomic_read(&conn->usage)); in rxrpc_destroy_client_conn_ids()
170 struct rxrpc_connection *conn; in rxrpc_alloc_client_connection() local
176 conn = rxrpc_alloc_connection(gfp); in rxrpc_alloc_client_connection()
177 if (!conn) { in rxrpc_alloc_client_connection()
182 atomic_set(&conn->usage, 1); in rxrpc_alloc_client_connection()
184 __set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_alloc_client_connection()
186 __set_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags); in rxrpc_alloc_client_connection()
188 conn->params = *cp; in rxrpc_alloc_client_connection()
189 conn->out_clientflag = RXRPC_CLIENT_INITIATED; in rxrpc_alloc_client_connection()
190 conn->state = RXRPC_CONN_CLIENT; in rxrpc_alloc_client_connection()
191 conn->service_id = cp->service_id; in rxrpc_alloc_client_connection()
193 ret = rxrpc_get_client_connection_id(conn, gfp); in rxrpc_alloc_client_connection()
197 ret = rxrpc_init_client_conn_security(conn); in rxrpc_alloc_client_connection()
201 ret = conn->security->prime_packet_security(conn); in rxrpc_alloc_client_connection()
207 list_add_tail(&conn->proc_link, &rxnet->conn_proc_list); in rxrpc_alloc_client_connection()
212 rxrpc_get_local(conn->params.local); in rxrpc_alloc_client_connection()
213 key_get(conn->params.key); in rxrpc_alloc_client_connection()
215 trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_client, in rxrpc_alloc_client_connection()
216 atomic_read(&conn->usage), in rxrpc_alloc_client_connection()
218 trace_rxrpc_client(conn, -1, rxrpc_client_alloc); in rxrpc_alloc_client_connection()
219 _leave(" = %p", conn); in rxrpc_alloc_client_connection()
220 return conn; in rxrpc_alloc_client_connection()
223 conn->security->clear(conn); in rxrpc_alloc_client_connection()
225 rxrpc_put_client_connection_id(conn); in rxrpc_alloc_client_connection()
227 kfree(conn); in rxrpc_alloc_client_connection()
235 static bool rxrpc_may_reuse_conn(struct rxrpc_connection *conn) in rxrpc_may_reuse_conn() argument
237 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_may_reuse_conn()
240 if (test_bit(RXRPC_CONN_DONT_REUSE, &conn->flags)) in rxrpc_may_reuse_conn()
243 if (conn->proto.epoch != rxnet->epoch) in rxrpc_may_reuse_conn()
253 id = conn->proto.cid >> RXRPC_CIDSHIFT; in rxrpc_may_reuse_conn()
264 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_may_reuse_conn()
281 struct rxrpc_connection *conn, *candidate = NULL; in rxrpc_get_client_conn() local
307 conn = rb_entry(p, struct rxrpc_connection, client_node); in rxrpc_get_client_conn()
309 #define cmp(X) ((long)conn->params.X - (long)cp->X) in rxrpc_get_client_conn()
320 if (rxrpc_may_reuse_conn(conn) && in rxrpc_get_client_conn()
321 rxrpc_get_connection_maybe(conn)) in rxrpc_get_client_conn()
355 call->conn = candidate; in rxrpc_get_client_conn()
374 conn = rb_entry(parent, struct rxrpc_connection, client_node); in rxrpc_get_client_conn()
376 #define cmp(X) ((long)conn->params.X - (long)candidate->params.X) in rxrpc_get_client_conn()
387 if (rxrpc_may_reuse_conn(conn) && in rxrpc_get_client_conn()
388 rxrpc_get_connection_maybe(conn)) in rxrpc_get_client_conn()
392 clear_bit(RXRPC_CONN_IN_CLIENT_CONNS, &conn->flags); in rxrpc_get_client_conn()
393 rb_replace_node(&conn->client_node, in rxrpc_get_client_conn()
396 trace_rxrpc_client(conn, -1, rxrpc_client_replace); in rxrpc_get_client_conn()
407 call->conn = candidate; in rxrpc_get_client_conn()
429 spin_lock(&conn->channel_lock); in rxrpc_get_client_conn()
430 call->conn = conn; in rxrpc_get_client_conn()
431 call->security = conn->security; in rxrpc_get_client_conn()
432 call->security_ix = conn->security_ix; in rxrpc_get_client_conn()
433 call->service_id = conn->service_id; in rxrpc_get_client_conn()
434 list_add_tail(&call->chan_wait_link, &conn->waiting_calls); in rxrpc_get_client_conn()
435 spin_unlock(&conn->channel_lock); in rxrpc_get_client_conn()
436 _leave(" = 0 [extant %d]", conn->debug_id); in rxrpc_get_client_conn()
451 struct rxrpc_connection *conn) in rxrpc_activate_conn() argument
453 if (test_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags)) { in rxrpc_activate_conn()
454 trace_rxrpc_client(conn, -1, rxrpc_client_to_upgrade); in rxrpc_activate_conn()
455 conn->cache_state = RXRPC_CONN_CLIENT_UPGRADE; in rxrpc_activate_conn()
457 trace_rxrpc_client(conn, -1, rxrpc_client_to_active); in rxrpc_activate_conn()
458 conn->cache_state = RXRPC_CONN_CLIENT_ACTIVE; in rxrpc_activate_conn()
461 list_move_tail(&conn->cache_link, &rxnet->active_client_conns); in rxrpc_activate_conn()
477 struct rxrpc_connection *conn) in rxrpc_animate_client_conn() argument
481 _enter("%d,%d", conn->debug_id, conn->cache_state); in rxrpc_animate_client_conn()
483 if (conn->cache_state == RXRPC_CONN_CLIENT_ACTIVE || in rxrpc_animate_client_conn()
484 conn->cache_state == RXRPC_CONN_CLIENT_UPGRADE) in rxrpc_animate_client_conn()
490 if (!test_and_set_bit(RXRPC_CONN_COUNTED, &conn->flags)) { in rxrpc_animate_client_conn()
491 trace_rxrpc_client(conn, -1, rxrpc_client_count); in rxrpc_animate_client_conn()
495 switch (conn->cache_state) { in rxrpc_animate_client_conn()
515 _leave(" [%d]", conn->cache_state); in rxrpc_animate_client_conn()
520 rxrpc_activate_conn(rxnet, conn); in rxrpc_animate_client_conn()
525 trace_rxrpc_client(conn, -1, rxrpc_client_to_waiting); in rxrpc_animate_client_conn()
526 conn->cache_state = RXRPC_CONN_CLIENT_WAITING; in rxrpc_animate_client_conn()
527 list_move_tail(&conn->cache_link, &rxnet->waiting_client_conns); in rxrpc_animate_client_conn()
534 static void rxrpc_deactivate_one_channel(struct rxrpc_connection *conn, in rxrpc_deactivate_one_channel() argument
537 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_deactivate_one_channel()
540 conn->active_chans &= ~(1 << channel); in rxrpc_deactivate_one_channel()
548 static void rxrpc_activate_one_channel(struct rxrpc_connection *conn, in rxrpc_activate_one_channel() argument
551 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_activate_one_channel()
552 struct rxrpc_call *call = list_entry(conn->waiting_calls.next, in rxrpc_activate_one_channel()
556 trace_rxrpc_client(conn, channel, rxrpc_client_chan_activate); in rxrpc_activate_one_channel()
561 clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_activate_one_channel()
569 conn->active_chans |= 1 << channel; in rxrpc_activate_one_channel()
570 call->peer = rxrpc_get_peer(conn->params.peer); in rxrpc_activate_one_channel()
571 call->cid = conn->proto.cid | channel; in rxrpc_activate_one_channel()
576 call->cid, call->call_id, call->debug_id, conn->debug_id); in rxrpc_activate_one_channel()
599 static void rxrpc_activate_channels_locked(struct rxrpc_connection *conn) in rxrpc_activate_channels_locked() argument
603 switch (conn->cache_state) { in rxrpc_activate_channels_locked()
614 while (!list_empty(&conn->waiting_calls) && in rxrpc_activate_channels_locked()
615 (avail = ~conn->active_chans, in rxrpc_activate_channels_locked()
618 rxrpc_activate_one_channel(conn, __ffs(avail)); in rxrpc_activate_channels_locked()
624 static void rxrpc_activate_channels(struct rxrpc_connection *conn) in rxrpc_activate_channels() argument
626 _enter("%d", conn->debug_id); in rxrpc_activate_channels()
628 trace_rxrpc_client(conn, -1, rxrpc_client_activate_chans); in rxrpc_activate_channels()
630 if (conn->active_chans == RXRPC_ACTIVE_CHANS_MASK) in rxrpc_activate_channels()
633 spin_lock(&conn->channel_lock); in rxrpc_activate_channels()
634 rxrpc_activate_channels_locked(conn); in rxrpc_activate_channels()
635 spin_unlock(&conn->channel_lock); in rxrpc_activate_channels()
705 rxrpc_animate_client_conn(rxnet, call->conn); in rxrpc_connect_call()
706 rxrpc_activate_channels(call->conn); in rxrpc_connect_call()
710 trace_rxrpc_client(call->conn, ret, rxrpc_client_chan_wait_failed); in rxrpc_connect_call()
715 spin_lock_bh(&call->conn->params.peer->lock); in rxrpc_connect_call()
717 &call->conn->params.peer->error_targets); in rxrpc_connect_call()
718 spin_unlock_bh(&call->conn->params.peer->lock); in rxrpc_connect_call()
732 static void rxrpc_expose_client_conn(struct rxrpc_connection *conn, in rxrpc_expose_client_conn() argument
735 if (!test_and_set_bit(RXRPC_CONN_EXPOSED, &conn->flags)) { in rxrpc_expose_client_conn()
736 trace_rxrpc_client(conn, channel, rxrpc_client_exposed); in rxrpc_expose_client_conn()
737 rxrpc_get_connection(conn); in rxrpc_expose_client_conn()
748 struct rxrpc_connection *conn = call->conn; in rxrpc_expose_client_call() local
749 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_expose_client_call()
759 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_expose_client_call()
760 rxrpc_expose_client_conn(conn, channel); in rxrpc_expose_client_call()
781 struct rxrpc_connection *conn = call->conn; in rxrpc_disconnect_client_call() local
783 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_disconnect_client_call()
787 spin_lock(&conn->channel_lock); in rxrpc_disconnect_client_call()
792 chan = &conn->channels[channel]; in rxrpc_disconnect_client_call()
794 trace_rxrpc_client(conn, channel, rxrpc_client_chan_disconnect); in rxrpc_disconnect_client_call()
795 call->conn = NULL; in rxrpc_disconnect_client_call()
807 trace_rxrpc_client(conn, channel, rxrpc_client_chan_unstarted); in rxrpc_disconnect_client_call()
813 if (conn->cache_state == RXRPC_CONN_CLIENT_WAITING && in rxrpc_disconnect_client_call()
814 list_empty(&conn->waiting_calls) && in rxrpc_disconnect_client_call()
815 !conn->active_chans) in rxrpc_disconnect_client_call()
821 spin_unlock(&conn->channel_lock); in rxrpc_disconnect_client_call()
836 __rxrpc_disconnect_call(conn, call); in rxrpc_disconnect_client_call()
840 if (conn->cache_state == RXRPC_CONN_CLIENT_ACTIVE && in rxrpc_disconnect_client_call()
841 !list_empty(&conn->waiting_calls)) { in rxrpc_disconnect_client_call()
842 trace_rxrpc_client(conn, channel, rxrpc_client_chan_pass); in rxrpc_disconnect_client_call()
843 rxrpc_activate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
857 set_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_disconnect_client_call()
858 rxrpc_reduce_conn_timer(conn, final_ack_at); in rxrpc_disconnect_client_call()
868 switch (conn->cache_state) { in rxrpc_disconnect_client_call()
871 if (test_bit(RXRPC_CONN_EXPOSED, &conn->flags)) { in rxrpc_disconnect_client_call()
872 clear_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags); in rxrpc_disconnect_client_call()
873 trace_rxrpc_client(conn, channel, rxrpc_client_to_active); in rxrpc_disconnect_client_call()
874 conn->cache_state = RXRPC_CONN_CLIENT_ACTIVE; in rxrpc_disconnect_client_call()
875 rxrpc_activate_channels_locked(conn); in rxrpc_disconnect_client_call()
879 if (list_empty(&conn->waiting_calls)) { in rxrpc_disconnect_client_call()
880 rxrpc_deactivate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
881 if (!conn->active_chans) { in rxrpc_disconnect_client_call()
888 trace_rxrpc_client(conn, channel, rxrpc_client_chan_pass); in rxrpc_disconnect_client_call()
889 rxrpc_activate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
893 rxrpc_deactivate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
894 ASSERT(list_empty(&conn->waiting_calls)); in rxrpc_disconnect_client_call()
895 if (!conn->active_chans) in rxrpc_disconnect_client_call()
900 rxrpc_deactivate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
910 spin_unlock(&conn->channel_lock); in rxrpc_disconnect_client_call()
911 rxrpc_put_connection(conn); in rxrpc_disconnect_client_call()
919 if (test_bit(RXRPC_CONN_EXPOSED, &conn->flags)) { in rxrpc_disconnect_client_call()
920 trace_rxrpc_client(conn, channel, rxrpc_client_to_idle); in rxrpc_disconnect_client_call()
921 conn->idle_timestamp = jiffies; in rxrpc_disconnect_client_call()
922 conn->cache_state = RXRPC_CONN_CLIENT_IDLE; in rxrpc_disconnect_client_call()
923 list_move_tail(&conn->cache_link, &rxnet->idle_client_conns); in rxrpc_disconnect_client_call()
924 if (rxnet->idle_client_conns.next == &conn->cache_link && in rxrpc_disconnect_client_call()
928 trace_rxrpc_client(conn, channel, rxrpc_client_to_inactive); in rxrpc_disconnect_client_call()
929 conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE; in rxrpc_disconnect_client_call()
930 list_del_init(&conn->cache_link); in rxrpc_disconnect_client_call()
939 rxrpc_put_one_client_conn(struct rxrpc_connection *conn) in rxrpc_put_one_client_conn() argument
942 struct rxrpc_local *local = conn->params.local; in rxrpc_put_one_client_conn()
946 trace_rxrpc_client(conn, -1, rxrpc_client_cleanup); in rxrpc_put_one_client_conn()
948 if (test_bit(RXRPC_CONN_IN_CLIENT_CONNS, &conn->flags)) { in rxrpc_put_one_client_conn()
951 &conn->flags)) in rxrpc_put_one_client_conn()
952 rb_erase(&conn->client_node, &local->client_conns); in rxrpc_put_one_client_conn()
956 rxrpc_put_client_connection_id(conn); in rxrpc_put_one_client_conn()
958 ASSERTCMP(conn->cache_state, ==, RXRPC_CONN_CLIENT_INACTIVE); in rxrpc_put_one_client_conn()
960 if (test_bit(RXRPC_CONN_COUNTED, &conn->flags)) { in rxrpc_put_one_client_conn()
961 trace_rxrpc_client(conn, -1, rxrpc_client_uncount); in rxrpc_put_one_client_conn()
976 rxrpc_kill_connection(conn); in rxrpc_put_one_client_conn()
989 void rxrpc_put_client_conn(struct rxrpc_connection *conn) in rxrpc_put_client_conn() argument
992 unsigned int debug_id = conn->debug_id; in rxrpc_put_client_conn()
996 n = atomic_dec_return(&conn->usage); in rxrpc_put_client_conn()
1002 conn = rxrpc_put_one_client_conn(conn); in rxrpc_put_client_conn()
1003 } while (conn); in rxrpc_put_client_conn()
1011 struct rxrpc_connection *conn; in rxrpc_cull_active_client_conns() local
1029 conn = list_entry(rxnet->active_client_conns.next, in rxrpc_cull_active_client_conns()
1031 ASSERTIFCMP(conn->cache_state != RXRPC_CONN_CLIENT_ACTIVE, in rxrpc_cull_active_client_conns()
1032 conn->cache_state, ==, RXRPC_CONN_CLIENT_UPGRADE); in rxrpc_cull_active_client_conns()
1034 if (list_empty(&conn->waiting_calls)) { in rxrpc_cull_active_client_conns()
1035 trace_rxrpc_client(conn, -1, rxrpc_client_to_culled); in rxrpc_cull_active_client_conns()
1036 conn->cache_state = RXRPC_CONN_CLIENT_CULLED; in rxrpc_cull_active_client_conns()
1037 list_del_init(&conn->cache_link); in rxrpc_cull_active_client_conns()
1039 trace_rxrpc_client(conn, -1, rxrpc_client_to_waiting); in rxrpc_cull_active_client_conns()
1040 conn->cache_state = RXRPC_CONN_CLIENT_WAITING; in rxrpc_cull_active_client_conns()
1041 list_move_tail(&conn->cache_link, in rxrpc_cull_active_client_conns()
1063 struct rxrpc_connection *conn; in rxrpc_discard_expired_client_conns() local
1093 conn = list_entry(rxnet->idle_client_conns.next, in rxrpc_discard_expired_client_conns()
1095 ASSERT(test_bit(RXRPC_CONN_EXPOSED, &conn->flags)); in rxrpc_discard_expired_client_conns()
1106 if (conn->params.local->service_closed) in rxrpc_discard_expired_client_conns()
1109 conn_expires_at = conn->idle_timestamp + expiry; in rxrpc_discard_expired_client_conns()
1116 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_discard_expired_client_conns()
1117 if (!test_and_clear_bit(RXRPC_CONN_EXPOSED, &conn->flags)) in rxrpc_discard_expired_client_conns()
1119 conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE; in rxrpc_discard_expired_client_conns()
1120 list_del_init(&conn->cache_link); in rxrpc_discard_expired_client_conns()
1128 rxrpc_put_connection(conn); in rxrpc_discard_expired_client_conns()
1176 struct rxrpc_connection *conn, *tmp; in rxrpc_clean_up_local_conns() local
1186 list_for_each_entry_safe(conn, tmp, &rxnet->idle_client_conns, in rxrpc_clean_up_local_conns()
1188 if (conn->params.local == local) { in rxrpc_clean_up_local_conns()
1189 ASSERTCMP(conn->cache_state, ==, RXRPC_CONN_CLIENT_IDLE); in rxrpc_clean_up_local_conns()
1191 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_clean_up_local_conns()
1192 if (!test_and_clear_bit(RXRPC_CONN_EXPOSED, &conn->flags)) in rxrpc_clean_up_local_conns()
1194 conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE; in rxrpc_clean_up_local_conns()
1195 list_move(&conn->cache_link, &graveyard); in rxrpc_clean_up_local_conns()
1205 conn = list_entry(graveyard.next, in rxrpc_clean_up_local_conns()
1207 list_del_init(&conn->cache_link); in rxrpc_clean_up_local_conns()
1209 rxrpc_put_connection(conn); in rxrpc_clean_up_local_conns()