• Home
  • Raw
  • Download

Lines Matching refs:conn

105 static int rxrpc_get_client_connection_id(struct rxrpc_connection *conn,  in rxrpc_get_client_connection_id()  argument
108 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_get_client_connection_id()
116 id = idr_alloc_cyclic(&rxrpc_client_conn_ids, conn, in rxrpc_get_client_connection_id()
124 conn->proto.epoch = rxnet->epoch; in rxrpc_get_client_connection_id()
125 conn->proto.cid = id << RXRPC_CIDSHIFT; in rxrpc_get_client_connection_id()
126 set_bit(RXRPC_CONN_HAS_IDR, &conn->flags); in rxrpc_get_client_connection_id()
127 _leave(" [CID %x]", conn->proto.cid); in rxrpc_get_client_connection_id()
140 static void rxrpc_put_client_connection_id(struct rxrpc_connection *conn) in rxrpc_put_client_connection_id() argument
142 if (test_bit(RXRPC_CONN_HAS_IDR, &conn->flags)) { in rxrpc_put_client_connection_id()
145 conn->proto.cid >> RXRPC_CIDSHIFT); in rxrpc_put_client_connection_id()
155 struct rxrpc_connection *conn; in rxrpc_destroy_client_conn_ids() local
159 idr_for_each_entry(&rxrpc_client_conn_ids, conn, id) { in rxrpc_destroy_client_conn_ids()
161 conn, atomic_read(&conn->usage)); in rxrpc_destroy_client_conn_ids()
175 struct rxrpc_connection *conn; in rxrpc_alloc_client_connection() local
181 conn = rxrpc_alloc_connection(gfp); in rxrpc_alloc_client_connection()
182 if (!conn) { in rxrpc_alloc_client_connection()
187 atomic_set(&conn->usage, 1); in rxrpc_alloc_client_connection()
189 __set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_alloc_client_connection()
191 __set_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags); in rxrpc_alloc_client_connection()
193 conn->params = *cp; in rxrpc_alloc_client_connection()
194 conn->out_clientflag = RXRPC_CLIENT_INITIATED; in rxrpc_alloc_client_connection()
195 conn->state = RXRPC_CONN_CLIENT; in rxrpc_alloc_client_connection()
196 conn->service_id = cp->service_id; in rxrpc_alloc_client_connection()
198 ret = rxrpc_get_client_connection_id(conn, gfp); in rxrpc_alloc_client_connection()
202 ret = rxrpc_init_client_conn_security(conn); in rxrpc_alloc_client_connection()
206 ret = conn->security->prime_packet_security(conn); in rxrpc_alloc_client_connection()
211 list_add_tail(&conn->proc_link, &rxnet->conn_proc_list); in rxrpc_alloc_client_connection()
216 rxrpc_get_local(conn->params.local); in rxrpc_alloc_client_connection()
217 key_get(conn->params.key); in rxrpc_alloc_client_connection()
219 trace_rxrpc_conn(conn, rxrpc_conn_new_client, atomic_read(&conn->usage), in rxrpc_alloc_client_connection()
221 trace_rxrpc_client(conn, -1, rxrpc_client_alloc); in rxrpc_alloc_client_connection()
222 _leave(" = %p", conn); in rxrpc_alloc_client_connection()
223 return conn; in rxrpc_alloc_client_connection()
226 conn->security->clear(conn); in rxrpc_alloc_client_connection()
228 rxrpc_put_client_connection_id(conn); in rxrpc_alloc_client_connection()
230 kfree(conn); in rxrpc_alloc_client_connection()
238 static bool rxrpc_may_reuse_conn(struct rxrpc_connection *conn) in rxrpc_may_reuse_conn() argument
240 struct rxrpc_net *rxnet = conn->params.local->rxnet; in rxrpc_may_reuse_conn()
243 if (test_bit(RXRPC_CONN_DONT_REUSE, &conn->flags)) in rxrpc_may_reuse_conn()
246 if (conn->proto.epoch != rxnet->epoch) in rxrpc_may_reuse_conn()
256 id = conn->proto.cid >> RXRPC_CIDSHIFT; in rxrpc_may_reuse_conn()
267 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_may_reuse_conn()
283 struct rxrpc_connection *conn, *candidate = NULL; in rxrpc_get_client_conn() local
309 conn = rb_entry(p, struct rxrpc_connection, client_node); in rxrpc_get_client_conn()
311 #define cmp(X) ((long)conn->params.X - (long)cp->X) in rxrpc_get_client_conn()
322 if (rxrpc_may_reuse_conn(conn) && in rxrpc_get_client_conn()
323 rxrpc_get_connection_maybe(conn)) in rxrpc_get_client_conn()
357 call->conn = candidate; in rxrpc_get_client_conn()
375 conn = rb_entry(parent, struct rxrpc_connection, client_node); in rxrpc_get_client_conn()
377 #define cmp(X) ((long)conn->params.X - (long)candidate->params.X) in rxrpc_get_client_conn()
388 if (rxrpc_may_reuse_conn(conn) && in rxrpc_get_client_conn()
389 rxrpc_get_connection_maybe(conn)) in rxrpc_get_client_conn()
393 clear_bit(RXRPC_CONN_IN_CLIENT_CONNS, &conn->flags); in rxrpc_get_client_conn()
394 rb_replace_node(&conn->client_node, in rxrpc_get_client_conn()
397 trace_rxrpc_client(conn, -1, rxrpc_client_replace); in rxrpc_get_client_conn()
408 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_ix = conn->security_ix; in rxrpc_get_client_conn()
432 call->service_id = conn->service_id; in rxrpc_get_client_conn()
433 list_add_tail(&call->chan_wait_link, &conn->waiting_calls); in rxrpc_get_client_conn()
434 spin_unlock(&conn->channel_lock); in rxrpc_get_client_conn()
435 _leave(" = 0 [extant %d]", conn->debug_id); in rxrpc_get_client_conn()
450 struct rxrpc_connection *conn) in rxrpc_activate_conn() argument
452 if (test_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags)) { in rxrpc_activate_conn()
453 trace_rxrpc_client(conn, -1, rxrpc_client_to_upgrade); in rxrpc_activate_conn()
454 conn->cache_state = RXRPC_CONN_CLIENT_UPGRADE; in rxrpc_activate_conn()
456 trace_rxrpc_client(conn, -1, rxrpc_client_to_active); in rxrpc_activate_conn()
457 conn->cache_state = RXRPC_CONN_CLIENT_ACTIVE; in rxrpc_activate_conn()
460 list_move_tail(&conn->cache_link, &rxnet->active_client_conns); in rxrpc_activate_conn()
476 struct rxrpc_connection *conn) in rxrpc_animate_client_conn() argument
480 _enter("%d,%d", conn->debug_id, conn->cache_state); in rxrpc_animate_client_conn()
482 if (conn->cache_state == RXRPC_CONN_CLIENT_ACTIVE || in rxrpc_animate_client_conn()
483 conn->cache_state == RXRPC_CONN_CLIENT_UPGRADE) in rxrpc_animate_client_conn()
489 if (!test_and_set_bit(RXRPC_CONN_COUNTED, &conn->flags)) { in rxrpc_animate_client_conn()
490 trace_rxrpc_client(conn, -1, rxrpc_client_count); in rxrpc_animate_client_conn()
494 switch (conn->cache_state) { in rxrpc_animate_client_conn()
514 _leave(" [%d]", conn->cache_state); in rxrpc_animate_client_conn()
519 rxrpc_activate_conn(rxnet, conn); in rxrpc_animate_client_conn()
524 trace_rxrpc_client(conn, -1, rxrpc_client_to_waiting); in rxrpc_animate_client_conn()
525 conn->cache_state = RXRPC_CONN_CLIENT_WAITING; in rxrpc_animate_client_conn()
526 list_move_tail(&conn->cache_link, &rxnet->waiting_client_conns); in rxrpc_animate_client_conn()
533 static void rxrpc_deactivate_one_channel(struct rxrpc_connection *conn, in rxrpc_deactivate_one_channel() argument
536 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_deactivate_one_channel()
539 conn->active_chans &= ~(1 << channel); in rxrpc_deactivate_one_channel()
547 static void rxrpc_activate_one_channel(struct rxrpc_connection *conn, in rxrpc_activate_one_channel() argument
550 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_activate_one_channel()
551 struct rxrpc_call *call = list_entry(conn->waiting_calls.next, in rxrpc_activate_one_channel()
555 trace_rxrpc_client(conn, channel, rxrpc_client_chan_activate); in rxrpc_activate_one_channel()
566 conn->active_chans |= 1 << channel; in rxrpc_activate_one_channel()
567 call->peer = rxrpc_get_peer(conn->params.peer); in rxrpc_activate_one_channel()
568 call->cid = conn->proto.cid | channel; in rxrpc_activate_one_channel()
573 call->cid, call->call_id, call->debug_id, conn->debug_id); in rxrpc_activate_one_channel()
595 static void rxrpc_activate_channels_locked(struct rxrpc_connection *conn) in rxrpc_activate_channels_locked() argument
599 switch (conn->cache_state) { in rxrpc_activate_channels_locked()
610 while (!list_empty(&conn->waiting_calls) && in rxrpc_activate_channels_locked()
611 (avail = ~conn->active_chans, in rxrpc_activate_channels_locked()
614 rxrpc_activate_one_channel(conn, __ffs(avail)); in rxrpc_activate_channels_locked()
620 static void rxrpc_activate_channels(struct rxrpc_connection *conn) in rxrpc_activate_channels() argument
622 _enter("%d", conn->debug_id); in rxrpc_activate_channels()
624 trace_rxrpc_client(conn, -1, rxrpc_client_activate_chans); in rxrpc_activate_channels()
626 if (conn->active_chans == RXRPC_ACTIVE_CHANS_MASK) in rxrpc_activate_channels()
629 spin_lock(&conn->channel_lock); in rxrpc_activate_channels()
630 rxrpc_activate_channels_locked(conn); in rxrpc_activate_channels()
631 spin_unlock(&conn->channel_lock); in rxrpc_activate_channels()
696 rxrpc_animate_client_conn(rxnet, call->conn); in rxrpc_connect_call()
697 rxrpc_activate_channels(call->conn); in rxrpc_connect_call()
705 spin_lock_bh(&call->conn->params.peer->lock); in rxrpc_connect_call()
707 &call->conn->params.peer->error_targets); in rxrpc_connect_call()
708 spin_unlock_bh(&call->conn->params.peer->lock); in rxrpc_connect_call()
722 static void rxrpc_expose_client_conn(struct rxrpc_connection *conn, in rxrpc_expose_client_conn() argument
725 if (!test_and_set_bit(RXRPC_CONN_EXPOSED, &conn->flags)) { in rxrpc_expose_client_conn()
726 trace_rxrpc_client(conn, channel, rxrpc_client_exposed); in rxrpc_expose_client_conn()
727 rxrpc_get_connection(conn); in rxrpc_expose_client_conn()
738 struct rxrpc_connection *conn = call->conn; in rxrpc_expose_client_call() local
739 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_expose_client_call()
749 set_bit(RXRPC_CONN_DONT_REUSE, &conn->flags); in rxrpc_expose_client_call()
750 rxrpc_expose_client_conn(conn, channel); in rxrpc_expose_client_call()
760 struct rxrpc_connection *conn = call->conn; in rxrpc_disconnect_client_call() local
761 struct rxrpc_channel *chan = &conn->channels[channel]; in rxrpc_disconnect_client_call()
764 trace_rxrpc_client(conn, channel, rxrpc_client_chan_disconnect); in rxrpc_disconnect_client_call()
766 spin_lock(&conn->channel_lock); in rxrpc_disconnect_client_call()
779 trace_rxrpc_client(conn, channel, rxrpc_client_chan_unstarted); in rxrpc_disconnect_client_call()
785 if (conn->cache_state == RXRPC_CONN_CLIENT_WAITING && in rxrpc_disconnect_client_call()
786 list_empty(&conn->waiting_calls) && in rxrpc_disconnect_client_call()
787 !conn->active_chans) in rxrpc_disconnect_client_call()
805 __rxrpc_disconnect_call(conn, call); in rxrpc_disconnect_client_call()
809 if (conn->cache_state == RXRPC_CONN_CLIENT_ACTIVE && in rxrpc_disconnect_client_call()
810 !list_empty(&conn->waiting_calls)) { in rxrpc_disconnect_client_call()
811 trace_rxrpc_client(conn, channel, rxrpc_client_chan_pass); in rxrpc_disconnect_client_call()
812 rxrpc_activate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
823 switch (conn->cache_state) { in rxrpc_disconnect_client_call()
826 if (test_bit(RXRPC_CONN_EXPOSED, &conn->flags)) { in rxrpc_disconnect_client_call()
827 clear_bit(RXRPC_CONN_PROBING_FOR_UPGRADE, &conn->flags); in rxrpc_disconnect_client_call()
828 trace_rxrpc_client(conn, channel, rxrpc_client_to_active); in rxrpc_disconnect_client_call()
829 conn->cache_state = RXRPC_CONN_CLIENT_ACTIVE; in rxrpc_disconnect_client_call()
830 rxrpc_activate_channels_locked(conn); in rxrpc_disconnect_client_call()
834 if (list_empty(&conn->waiting_calls)) { in rxrpc_disconnect_client_call()
835 rxrpc_deactivate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
836 if (!conn->active_chans) { in rxrpc_disconnect_client_call()
843 trace_rxrpc_client(conn, channel, rxrpc_client_chan_pass); in rxrpc_disconnect_client_call()
844 rxrpc_activate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
848 rxrpc_deactivate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
849 ASSERT(list_empty(&conn->waiting_calls)); in rxrpc_disconnect_client_call()
850 if (!conn->active_chans) in rxrpc_disconnect_client_call()
855 rxrpc_deactivate_one_channel(conn, channel); in rxrpc_disconnect_client_call()
865 spin_unlock(&conn->channel_lock); in rxrpc_disconnect_client_call()
873 if (test_bit(RXRPC_CONN_EXPOSED, &conn->flags)) { in rxrpc_disconnect_client_call()
874 trace_rxrpc_client(conn, channel, rxrpc_client_to_idle); in rxrpc_disconnect_client_call()
875 conn->idle_timestamp = jiffies; in rxrpc_disconnect_client_call()
876 conn->cache_state = RXRPC_CONN_CLIENT_IDLE; in rxrpc_disconnect_client_call()
877 list_move_tail(&conn->cache_link, &rxnet->idle_client_conns); in rxrpc_disconnect_client_call()
878 if (rxnet->idle_client_conns.next == &conn->cache_link && in rxrpc_disconnect_client_call()
884 trace_rxrpc_client(conn, channel, rxrpc_client_to_inactive); in rxrpc_disconnect_client_call()
885 conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE; in rxrpc_disconnect_client_call()
886 list_del_init(&conn->cache_link); in rxrpc_disconnect_client_call()
895 rxrpc_put_one_client_conn(struct rxrpc_connection *conn) in rxrpc_put_one_client_conn() argument
898 struct rxrpc_local *local = conn->params.local; in rxrpc_put_one_client_conn()
902 trace_rxrpc_client(conn, -1, rxrpc_client_cleanup); in rxrpc_put_one_client_conn()
904 if (test_bit(RXRPC_CONN_IN_CLIENT_CONNS, &conn->flags)) { in rxrpc_put_one_client_conn()
907 &conn->flags)) in rxrpc_put_one_client_conn()
908 rb_erase(&conn->client_node, &local->client_conns); in rxrpc_put_one_client_conn()
912 rxrpc_put_client_connection_id(conn); in rxrpc_put_one_client_conn()
914 ASSERTCMP(conn->cache_state, ==, RXRPC_CONN_CLIENT_INACTIVE); in rxrpc_put_one_client_conn()
916 if (test_bit(RXRPC_CONN_COUNTED, &conn->flags)) { in rxrpc_put_one_client_conn()
917 trace_rxrpc_client(conn, -1, rxrpc_client_uncount); in rxrpc_put_one_client_conn()
932 rxrpc_kill_connection(conn); in rxrpc_put_one_client_conn()
945 void rxrpc_put_client_conn(struct rxrpc_connection *conn) in rxrpc_put_client_conn() argument
951 n = atomic_dec_return(&conn->usage); in rxrpc_put_client_conn()
952 trace_rxrpc_conn(conn, rxrpc_conn_put_client, n, here); in rxrpc_put_client_conn()
957 conn = rxrpc_put_one_client_conn(conn); in rxrpc_put_client_conn()
958 } while (conn); in rxrpc_put_client_conn()
966 struct rxrpc_connection *conn; in rxrpc_cull_active_client_conns() local
984 conn = list_entry(rxnet->active_client_conns.next, in rxrpc_cull_active_client_conns()
986 ASSERTIFCMP(conn->cache_state != RXRPC_CONN_CLIENT_ACTIVE, in rxrpc_cull_active_client_conns()
987 conn->cache_state, ==, RXRPC_CONN_CLIENT_UPGRADE); in rxrpc_cull_active_client_conns()
989 if (list_empty(&conn->waiting_calls)) { in rxrpc_cull_active_client_conns()
990 trace_rxrpc_client(conn, -1, rxrpc_client_to_culled); in rxrpc_cull_active_client_conns()
991 conn->cache_state = RXRPC_CONN_CLIENT_CULLED; in rxrpc_cull_active_client_conns()
992 list_del_init(&conn->cache_link); in rxrpc_cull_active_client_conns()
994 trace_rxrpc_client(conn, -1, rxrpc_client_to_waiting); in rxrpc_cull_active_client_conns()
995 conn->cache_state = RXRPC_CONN_CLIENT_WAITING; in rxrpc_cull_active_client_conns()
996 list_move_tail(&conn->cache_link, in rxrpc_cull_active_client_conns()
1018 struct rxrpc_connection *conn; in rxrpc_discard_expired_client_conns() local
1050 conn = list_entry(rxnet->idle_client_conns.next, in rxrpc_discard_expired_client_conns()
1052 ASSERT(test_bit(RXRPC_CONN_EXPOSED, &conn->flags)); in rxrpc_discard_expired_client_conns()
1063 if (conn->params.local->service_closed) in rxrpc_discard_expired_client_conns()
1066 conn_expires_at = conn->idle_timestamp + expiry; in rxrpc_discard_expired_client_conns()
1073 trace_rxrpc_client(conn, -1, rxrpc_client_discard); in rxrpc_discard_expired_client_conns()
1074 if (!test_and_clear_bit(RXRPC_CONN_EXPOSED, &conn->flags)) in rxrpc_discard_expired_client_conns()
1076 conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE; in rxrpc_discard_expired_client_conns()
1077 list_del_init(&conn->cache_link); in rxrpc_discard_expired_client_conns()
1085 rxrpc_put_connection(conn); in rxrpc_discard_expired_client_conns()