Lines Matching refs:conn

49 static int rxrpc_get_client_connection_id(struct rxrpc_connection *conn,  in rxrpc_get_client_connection_id()  argument
52 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_get_client_connection_id()
60 id = idr_alloc_cyclic(&rxrpc_client_conn_ids, conn, in rxrpc_get_client_connection_id()
68 conn->proto.epoch = rxnet->epoch; in rxrpc_get_client_connection_id()
69 conn->proto.cid = id << RXRPC_CIDSHIFT; in rxrpc_get_client_connection_id()
70 set_bit(RXRPC_CONN_HAS_IDR, &conn->flags); in rxrpc_get_client_connection_id()
71 _leave(" [CID %x]", conn->proto.cid); in rxrpc_get_client_connection_id()
84 static void rxrpc_put_client_connection_id(struct rxrpc_connection *conn) in rxrpc_put_client_connection_id() argument
86 if (test_bit(RXRPC_CONN_HAS_IDR, &conn->flags)) { in rxrpc_put_client_connection_id()
89 conn->proto.cid >> RXRPC_CIDSHIFT); in rxrpc_put_client_connection_id()
99 struct rxrpc_connection *conn; in rxrpc_destroy_client_conn_ids() local
103 idr_for_each_entry(&rxrpc_client_conn_ids, conn, id) { in rxrpc_destroy_client_conn_ids()
105 conn, atomic_read(&conn->usage)); in rxrpc_destroy_client_conn_ids()
160 struct rxrpc_connection *conn; in rxrpc_alloc_client_connection() local
166 conn = rxrpc_alloc_connection(gfp); in rxrpc_alloc_client_connection()
167 if (!conn) { in rxrpc_alloc_client_connection()
172 atomic_set(&conn->usage, 1); in rxrpc_alloc_client_connection()
173 conn->bundle = bundle; in rxrpc_alloc_client_connection()
174 conn->params = bundle->params; in rxrpc_alloc_client_connection()
175 conn->out_clientflag = RXRPC_CLIENT_INITIATED; in rxrpc_alloc_client_connection()
176 conn->state = RXRPC_CONN_CLIENT; in rxrpc_alloc_client_connection()
177 conn->service_id = conn->params.service_id; in rxrpc_alloc_client_connection()
179 ret = rxrpc_get_client_connection_id(conn, gfp); in rxrpc_alloc_client_connection()
183 ret = rxrpc_init_client_conn_security(conn); in rxrpc_alloc_client_connection()
189 list_add_tail(&conn->proc_link, &rxnet->conn_proc_list); in rxrpc_alloc_client_connection()
193 rxrpc_get_peer(conn->params.peer); in rxrpc_alloc_client_connection()
194 rxrpc_get_local(conn->params.local); in rxrpc_alloc_client_connection()
195 key_get(conn->params.key); in rxrpc_alloc_client_connection()
197 trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_client, in rxrpc_alloc_client_connection()
198 atomic_read(&conn->usage), in rxrpc_alloc_client_connection()
202 trace_rxrpc_client(conn, -1, rxrpc_client_alloc); in rxrpc_alloc_client_connection()
203 _leave(" = %p", conn); in rxrpc_alloc_client_connection()
204 return conn; in rxrpc_alloc_client_connection()
207 rxrpc_put_client_connection_id(conn); in rxrpc_alloc_client_connection()
209 kfree(conn); in rxrpc_alloc_client_connection()
217 static bool rxrpc_may_reuse_conn(struct rxrpc_connection *conn) in rxrpc_may_reuse_conn() argument
222 if (!conn) in rxrpc_may_reuse_conn()
225 rxnet = conn->params.local->rxnet; in rxrpc_may_reuse_conn()
226 if (test_bit(RXRPC_CONN_DONT_REUSE, &conn->flags)) in rxrpc_may_reuse_conn()
229 if (conn->state != RXRPC_CONN_CLIENT || in rxrpc_may_reuse_conn()
230 conn->proto.epoch != rxnet->epoch) in rxrpc_may_reuse_conn()
240 id = conn->proto.cid >> RXRPC_CIDSHIFT; in rxrpc_may_reuse_conn()
251 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_may_reuse_conn()
505 static void rxrpc_activate_one_channel(struct rxrpc_connection *conn, in rxrpc_activate_one_channel() argument
508 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_activate_one_channel()
509 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_activate_one_channel()
514 _enter("C=%x,%u", conn->debug_id, channel); in rxrpc_activate_one_channel()
516 trace_rxrpc_client(conn, channel, rxrpc_client_chan_activate); in rxrpc_activate_one_channel()
521 clear_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_activate_one_channel()
522 clear_bit(conn->bundle_shift + channel, &bundle->avail_chans); in rxrpc_activate_one_channel()
526 call->peer = rxrpc_get_peer(conn->params.peer); in rxrpc_activate_one_channel()
527 call->conn = rxrpc_get_connection(conn); in rxrpc_activate_one_channel()
528 call->cid = conn->proto.cid | channel; in rxrpc_activate_one_channel()
530 call->security = conn->security; in rxrpc_activate_one_channel()
531 call->security_ix = conn->security_ix; in rxrpc_activate_one_channel()
532 call->service_id = conn->service_id; in rxrpc_activate_one_channel()
536 call->cid, call->call_id, call->debug_id, conn->debug_id); in rxrpc_activate_one_channel()
563 static void rxrpc_unidle_conn(struct rxrpc_bundle *bundle, struct rxrpc_connection *conn) in rxrpc_unidle_conn() argument
568 if (!list_empty(&conn->cache_link)) { in rxrpc_unidle_conn()
571 if (!list_empty(&conn->cache_link)) { in rxrpc_unidle_conn()
572 list_del_init(&conn->cache_link); in rxrpc_unidle_conn()
577 rxrpc_put_connection(conn); in rxrpc_unidle_conn()
587 struct rxrpc_connection *conn; in rxrpc_activate_channels_locked() local
604 conn = bundle->conns[slot]; in rxrpc_activate_channels_locked()
605 if (!conn) in rxrpc_activate_channels_locked()
609 set_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags); in rxrpc_activate_channels_locked()
610 rxrpc_unidle_conn(bundle, conn); in rxrpc_activate_channels_locked()
613 conn->act_chans |= 1 << channel; in rxrpc_activate_channels_locked()
614 rxrpc_activate_one_channel(conn, channel); in rxrpc_activate_channels_locked()
740 trace_rxrpc_client(call->conn, ret, rxrpc_client_chan_wait_failed); in rxrpc_connect_call()
753 struct rxrpc_connection *conn = call->conn; in rxrpc_expose_client_call() local
754 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_expose_client_call()
764 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_expose_client_call()
765 trace_rxrpc_client(conn, channel, rxrpc_client_exposed); in rxrpc_expose_client_call()
788 struct rxrpc_connection *conn; in rxrpc_disconnect_client_call() local
803 conn = call->conn; in rxrpc_disconnect_client_call()
804 if (!conn) { in rxrpc_disconnect_client_call()
814 chan = &conn->channels[channel]; in rxrpc_disconnect_client_call()
815 trace_rxrpc_client(conn, channel, rxrpc_client_chan_disconnect); in rxrpc_disconnect_client_call()
822 may_reuse = rxrpc_may_reuse_conn(conn); in rxrpc_disconnect_client_call()
835 __rxrpc_disconnect_call(conn, call); in rxrpc_disconnect_client_call()
837 if (test_and_clear_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags)) { in rxrpc_disconnect_client_call()
838 trace_rxrpc_client(conn, channel, rxrpc_client_to_active); in rxrpc_disconnect_client_call()
848 trace_rxrpc_client(conn, channel, rxrpc_client_chan_pass); in rxrpc_disconnect_client_call()
849 rxrpc_activate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
863 set_bit(RXRPC_CONN_FINAL_ACK_0 + channel, &conn->flags); in rxrpc_disconnect_client_call()
864 rxrpc_reduce_conn_timer(conn, final_ack_at); in rxrpc_disconnect_client_call()
869 set_bit(conn->bundle_shift + channel, &conn->bundle->avail_chans); in rxrpc_disconnect_client_call()
870 conn->act_chans &= ~(1 << channel); in rxrpc_disconnect_client_call()
876 if (!conn->act_chans) { in rxrpc_disconnect_client_call()
877 trace_rxrpc_client(conn, channel, rxrpc_client_to_idle); in rxrpc_disconnect_client_call()
878 conn->idle_timestamp = jiffies; in rxrpc_disconnect_client_call()
880 rxrpc_get_connection(conn); in rxrpc_disconnect_client_call()
882 list_move_tail(&conn->cache_link, &rxnet->idle_client_conns); in rxrpc_disconnect_client_call()
897 static void rxrpc_unbundle_conn(struct rxrpc_connection *conn) in rxrpc_unbundle_conn() argument
899 struct rxrpc_bundle *bundle = conn->bundle; in rxrpc_unbundle_conn()
905 _enter("C=%x", conn->debug_id); in rxrpc_unbundle_conn()
907 if (conn->flags & RXRPC_CONN_FINAL_ACK_MASK) in rxrpc_unbundle_conn()
908 rxrpc_process_delayed_final_acks(conn, true); in rxrpc_unbundle_conn()
911 bindex = conn->bundle_shift / RXRPC_MAXCALLS; in rxrpc_unbundle_conn()
912 if (bundle->conns[bindex] == conn) { in rxrpc_unbundle_conn()
916 clear_bit(conn->bundle_shift + i, &bundle->avail_chans); in rxrpc_unbundle_conn()
941 rxrpc_put_connection(conn); in rxrpc_unbundle_conn()
948 static void rxrpc_kill_client_conn(struct rxrpc_connection *conn) in rxrpc_kill_client_conn() argument
950 struct rxrpc_local *local = conn->params.local; in rxrpc_kill_client_conn()
953 _enter("C=%x", conn->debug_id); in rxrpc_kill_client_conn()
955 trace_rxrpc_client(conn, -1, rxrpc_client_cleanup); in rxrpc_kill_client_conn()
958 rxrpc_put_client_connection_id(conn); in rxrpc_kill_client_conn()
959 rxrpc_kill_connection(conn); in rxrpc_kill_client_conn()
965 void rxrpc_put_client_conn(struct rxrpc_connection *conn) in rxrpc_put_client_conn() argument
968 unsigned int debug_id = conn->debug_id; in rxrpc_put_client_conn()
971 n = atomic_dec_return(&conn->usage); in rxrpc_put_client_conn()
975 rxrpc_kill_client_conn(conn); in rxrpc_put_client_conn()
988 struct rxrpc_connection *conn; in rxrpc_discard_expired_client_conns() local
1018 conn = list_entry(rxnet->idle_client_conns.next, in rxrpc_discard_expired_client_conns()
1030 if (conn->params.local->service_closed) in rxrpc_discard_expired_client_conns()
1033 conn_expires_at = conn->idle_timestamp + expiry; in rxrpc_discard_expired_client_conns()
1040 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_discard_expired_client_conns()
1041 list_del_init(&conn->cache_link); in rxrpc_discard_expired_client_conns()
1045 rxrpc_unbundle_conn(conn); in rxrpc_discard_expired_client_conns()
1046 rxrpc_put_connection(conn); /* Drop the ->cache_link ref */ in rxrpc_discard_expired_client_conns()
1094 struct rxrpc_connection *conn, *tmp; in rxrpc_clean_up_local_conns() local
1102 list_for_each_entry_safe(conn, tmp, &rxnet->idle_client_conns, in rxrpc_clean_up_local_conns()
1104 if (conn->params.local == local) { in rxrpc_clean_up_local_conns()
1105 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_clean_up_local_conns()
1106 list_move(&conn->cache_link, &graveyard); in rxrpc_clean_up_local_conns()
1113 conn = list_entry(graveyard.next, in rxrpc_clean_up_local_conns()
1115 list_del_init(&conn->cache_link); in rxrpc_clean_up_local_conns()
1116 rxrpc_unbundle_conn(conn); in rxrpc_clean_up_local_conns()
1117 rxrpc_put_connection(conn); in rxrpc_clean_up_local_conns()